在运行时通过气流导出环境变量

时间:2018-07-12 18:38:45

标签: python apache-spark environment-variables airflow

我目前正在将之前在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_DIRYARN_CONF_DIR。对我来说,在我的.bashrc或任何其他配置中设置它们是不可能的,这就是为什么我需要在运行时进行设置。

最好在执行SparkSubmitOperator之前在操作符中设置它们,但是如果有可能将它们作为参数传递给SparkSubmitOperator,那至少是可以的。

1 个答案:

答案 0 :(得分:1)

根据我在spark submit operator中看到的内容,您可以传入环境变量以将其作为字典进行火花提交。

:param env_vars: Environment variables for spark-submit. It
                 supports yarn and k8s mode too.
:type env_vars: dict

您尝试过吗?