将环境变量传递给 YARN 容器

Passing environment variables to YARN containers

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

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

有一个库可以读取环境变量并用它做一些事情(不相关)。因此,每个任务在其 executor/mapper/reducer 环境中都需要这个环境变量。

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

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

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

SPARK - 我玩过:

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

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

一个可能的解决方案是使用:

spark.executorEnv.[EnvironmentVariableName]

在 MapReduce 中我有点迷路我没有找到一种方法来传递环境变量

hadoop jar

我能做的最好的事情是在 conf 文件上传递变量,而不是使用 java 代码公开它。 将其暴露给 mappers/reducers 我使用了:

mapreduce.map/reducer.env

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

所以我决定通过纱线容器来接近它。然而,经过几天的实验,我得到了零结果。 所以我的问题。 有没有一种方法可以通过 spark-submit 和 hadoop jar

来操纵 yarn 使用我的额外环境变量来初始化它的容器

例如

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 容器。

This approach is not good for because it makes me modify all my MapReduce Jobs

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

Recently we integrated a new system which make dynamic resolution for services in runtime

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