我们有一个复杂的环境,它使用多种技术计算日常任务:SPARK PY-SPARK Java MapReduce和HIVE。
最近,我们集成了一个新系统,该系统可以在运行时对服务进行动态解析。此系统在初始化任务之前(动态(更新环境变量。
有一个库读取环境变量并用它做一些事情(不相关(。因此,每个任务都需要在其执行器/映射器/化简器环境中使用此 env 变量。
我们的任务由 YARN 资源管理器管理。
总而言之,我想传递 YARN env 变量,它将在其所有容器(ApplicationMaster 和执行器/映射器/化简器(上公开这些变量。
到目前为止我尝试过的事情:
火花 - 我玩过:
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 操纵纱线用我的额外环境变量初始化它的容器
例如
hadoop jar -Dyarn.expose.this.variable=value
我也很乐意接受答案,如果它只解决MapReduce,让我在不改变MapReduce代码的情况下暴露环境变量。
我想你正在寻找这些
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 环境特定的东西,例如