我们拥有一个复杂的环境,可以使用多种技术来计算日常任务: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代码的方式,我也很乐意接受答案。
答案 0 :(得分:1)
我认为您正在寻找这些
yarn.app.mapreduce.am.env
mapreduce.map.env
mapreduce.reduce.env
具体地说,它表示如果您设置-Dmapreduce.map.env='A=foo', then it will set A environment variable to "foo"
那些将被传递到YARN容器。
这种方法不好,因为它使我修改了所有MapReduce作业
我确定我了解您如何避免更改代码。需要修改某些库以读取环境或以其他方式定义的属性
最近我们集成了一个新系统,该系统可以在运行时动态解析服务
我认为我已经看到了使用Zookeeper / Consul / Etcd进行动态配置的设置;但是我没有在Docker容器标签之外看到YARN环境特定的东西,例如