将环境变量传递到容器

wfveoks0  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(713)

我们有一个复杂的环境,它使用多种技术来计算日常任务:spark py spark javamapreduce和hive。
最近我们集成了一个新的系统,可以在运行时动态解析服务。此系统在初始化任务之前(动态)更新环境变量。
有一个库可以读取环境变量并对其进行处理(不相关)。因此,每个任务都需要在其executor/mapper/reducer环境中使用这个env变量。
我们的任务由Yarn资源经理管理。
总而言之,我想传递yarn env变量,它将在它的所有容器(applicationmaster和executors/mappers/reducers)上公开这些变量。
到目前为止我尝试过的事情:
Spark-我玩过:

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

这实际上是将env变量公开给应用程序主机,而不是公开给执行器,因此如果udf函数试图找到它,它将失败。
一种可能的解决方案是:

spark.executorEnv.[EnvironmentVariableName]

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

hadoop jar

我能做的最好的事情就是在conf文件中传递变量,而不是使用java代码公开它。将其暴露于我使用的Map器/还原器:

mapreduce.map/reducer.env

这种方法不适用于,因为它使我修改所有mapreduce作业
所以我决定通过Yarn容器接近它。然而,经过几天的实验,我得到了零结果。所以我的问题是。有没有一种方法可以通过spark submit和hadoop jar操作yarn,用我额外的环境变量初始化它的容器
例如

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

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

rryofs0p

rryofs0p1#

我想你在找这些 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/consur/etcd的动态配置;但是我还没有看到特定于环境的东西,例如docker容器标签之外的东西

相关问题