我们有一个复杂的环境,它使用多种技术来计算日常任务: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代码。
1条答案
按热度按时间rryofs0p1#
我想你在找这些
yarn.app.mapreduce.am.env
mapreduce.map.envmapreduce.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容器标签之外的东西