将环境变量传递到YARN容器

时间:2018-08-22 14:11:30

标签: apache-spark hadoop mapreduce yarn

我们拥有一个复杂的环境,可以使用多种技术来计算日常任务:SPARK PY-SPARK Java MapReduce和HIVE。

最近,我们集成了一个新系统,该系统可以在运行时动态解析服务。该系统在任务初始化之前动态更新环境变量。

有一个库可以读取环境变量并对其进行处理(无关)。因此,每个任务在其执行程序/映射器/还原器环境中都需要此env变量。

我们的任务由YARN资源管理器管理。

总结,我想传递YARN env变量,它将在所有容器(ApplicationMaster和executors / mapper / reducers)上公开。

到目前为止我尝试过的事情:

SPARK-我玩过:

spark-submit --conf spark.yarn.appMasterEnv.KEY=Value

这实际上将env变量公开给应用程序主数据库,而不是公开给执行程序,因此,如果UDF函数试图找到它,它将失败。

可能的解决方案是使用:

spark.executorEnv.[EnvironmentVariableName]

在MapReduce中,我有点迷失了,我没有找到传递环境变量的方法

hadoop jar

我能做的最好的事情是在conf文件中传递变量,而不是使用Java代码公开它。 将其暴露给我使用的映射器/缩减器:

mapreduce.map/reducer.env

这种方法不好,因为它使我修改了所有MapReduce作业

因此,我决定通过纱线容器来接近它。但是,经过几天的实验,我得到了零结果。 所以我的问题。 有没有一种方法可以通过spark-submit和hadoop jar用我的额外环境变量来操纵yarn来初始化它的容器

例如

hadoop jar -Dyarn.expose.this.variable=value

如果它只解决MapReduce而不让我暴露环境变量而不改变MapReduce代码的方式,我也很乐意接受答案。

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找这些

  • yarn.app.mapreduce.am.env
  • mapreduce.map.env
  • mapreduce.reduce.env

https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml上搜索说明

具体地说,它表示如果您设置-Dmapreduce.map.env='A=foo', then it will set A environment variable to "foo"

那些将被传递到YARN容器。

  

这种方法不好,因为它使我修改了所有MapReduce作业

我确定我了解您如何避免更改代码。需要修改某些库以读取环境或以其他方式定义的属性

  

最近我们集成了一个新系统,该系统可以在运行时动态解析服务

我认为我已经看到了使用Zookeeper / Consul / Etcd进行动态配置的设置;但是我没有在Docker容器标签之外看到YARN环境特定的东西,例如