我目前正在将之前在bash脚本中实现的工作流转换为Airflow DAG。在bash脚本中,我只是在运行时使用以下命令导出变量
export HADOOP_CONF_DIR="/etc/hadoop/conf"
现在,我想在Airflow中做同样的事情,但是还没有找到解决方案。我发现的一种解决方法是,在任何方法或运算符之外都使用os.environ[VAR_NAME]='some_text'
设置变量,但这意味着它们是在脚本加载时而不是在运行时导出的。
现在,当我尝试在由PythonOperator调用的函数中调用os.environ[VAR_NAME] = 'some_text'
时,它将无法正常工作。我的代码看起来像这样
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)
现在,当我的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.
与之相关的我的用例是,我有SparkSubmitOperator
,在那里我向YARN提交了作业,因此必须在环境中设置HADOOP_CONF_DIR
或YARN_CONF_DIR
。对我来说,在我的.bashrc
或任何其他配置中设置它们是不可能的,这就是为什么我需要在运行时进行设置。
最好在执行SparkSubmitOperator
之前在操作符中设置它们,但是如果有可能将它们作为参数传递给SparkSubmitOperator
,那至少是可以的。
答案 0 :(得分:1)
根据我在spark submit operator中看到的内容,您可以传入环境变量以将其作为字典进行火花提交。
:param env_vars: Environment variables for spark-submit. It
supports yarn and k8s mode too.
:type env_vars: dict
您尝试过吗?