Chr*_*eck 6 python environment-variables apache-spark airflow
我目前正在将之前在bash脚本中实现的工作流转换为Airflow DAG。在bash脚本中,我只是在运行时使用以下命令导出变量
export HADOOP_CONF_DIR="/etc/hadoop/conf"
Run Code Online (Sandbox Code Playgroud)
现在我想在Airflow中做同样的事情,但是还没有找到解决方案。我发现的一种解决方法是在os.environ[VAR_NAME]='some_text'任何方法或运算符外部设置变量,但这意味着在脚本加载后而不是在运行时将它们导出。
现在,当我尝试调用os.environ[VAR_NAME] = 'some_text'由PythonOperator 调用的函数时,它不起作用。我的代码看起来像这样
def set_env():
os.environ['HADOOP_CONF_DIR'] = "/etc/hadoop/conf"
os.environ['PATH'] = "somePath:" + os.environ['PATH']
os.environ['SPARK_HOME'] = "pathToSparkHome"
os.environ['PYTHONPATH'] = "somePythonPath"
os.environ['PYSPARK_PYTHON'] = os.popen('which python').read().strip()
os.environ['PYSPARK_DRIVER_PYTHON'] = os.popen('which python').read().strip()
set_env_operator = PythonOperator(
task_id='set_env_vars_NOT_WORKING',
python_callable=set_env,
dag=dag)
Run Code Online (Sandbox Code Playgroud)
现在,当我的SparkSubmitOperator被执行时,我得到了异常:
Exception in thread "main" java.lang.Exception: When running with master 'yarn' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment.
Run Code Online (Sandbox Code Playgroud)
我使用的情况下,这是相关的是,我有SparkSubmitOperator,我在那里作业提交到纱,因此无论是HADOOP_CONF_DIR或YARN_CONF_DIR必须在环境中进行设置。.bashrc对我来说,在我或其他任何配置中设置它们都是遗憾的,这就是为什么我需要在运行时设置它们。
最好在执行之前SparkSubmitOperator,先在操作员中设置它们,但如果有可能将它们作为参数传递给SparkSubmitOperator,那至少是可以的。
从我在Spark Submit 运算符中看到的情况来看,您可以将环境变量作为字典传递给 Spark-Submit。
:param env_vars: Environment variables for spark-submit. It
supports yarn and k8s mode too.
:type env_vars: dict
Run Code Online (Sandbox Code Playgroud)
你试过这个吗?