在分布式 Hadoop 集群中使用 ENV 变量
Using ENV vars in distributed Hadoop cluster
我的目标是 运行 我们的 Hadoop 集群上的应用程序,而无需将显式配置放入每个应用程序。因此,我试图将集群的配置放入 ENV 变量中,并将它们传播到集群中的每个节点。
比如我定义:
export HIVE2_JDBC_URL=jdbc:hive2://localhost:10000
以后像这样使用它:
beeline -u $HIVE2_JDBC_URL/<db_name> -e "SELECT * FROM <table_name>;"
虽然这适用于这个特定的用例(在 cli 中),但它有两个很大的缺点:
- 我必须根据更改手动更新每个节点上的 ENV 变量
- Oozie 工作流无法读取 ENV 变量
有没有办法使用 Ambari 检索此设置,我可以定义我自己的自定义设置,然后在每个节点上可用吗?是否有一种方法也适用于 Oozie 工作流程?
您可以通过 mapred-site.xml
和 yarn-site.xml
强制 "cluster-wide" 环境变量 ——但我不能 100% 确定哪些属性必须在 ResourceManager 服务的配置中设置,and/or 每个 NodeManager 服务,and/or client节点。哪个级别覆盖(或添加到)哪个级别。你将不得不做一些研究和实验。
查看 mapred-default.xml
和 yarn-default.xml
(例如 Hadoop 2.7.0 的 here and here)的文档,了解诸如...
mapred.child.env
mapreduce.admin.user.env
yarn.app.mapreduce.am.env
yarn.app.mapreduce.am.admin.user.env
yarn.nodemanager.admin-env
yarn.nodemanager.env-whitelist
[编辑] 还要查看这些在 "default" 列表中没有正确条目的属性(还有另一个文档错误......)并忘记 "mapred.child"东西
mapreduce.map.env
mapreduce.reduce.env
对于 Oozie 作业,有两种设置环境的方法。变量:
- Shell 操作具有明确的
<env-var>VAR=VALUE</env-var>
语法,因为 shell 脚本非常依赖 环境。变量
- 所有使用 "launcher" YARN 作业的操作 (即 Java、Pig、Sqoop、Spark、Hive、Hive2、Shell...) 可以受益于
<property>
<name>oozie.launcher.xxx.xxx.xxx.env</name><value>****</value>
</property>
覆盖客户端配置中的值上面提到的文件
- MapReduce 操作直接启动,没有 "launcher" 作业,因此 属性 将直接设置为
<property>
<name>xxx.xxx.xxx.env</name><value>****</value>
</property>
- 此外,在核心 Workflow 模式 (即 Java、Pig、MapReduce) 中定义的操作可以使用
<global>
部分来定义属性 仅一次
=> 唉,其他操作被定义为具有独特 XML 模式的插件,并且不继承全局属性...
不幸的是 Oozie 的文档(例如 here for Oozie 4.1) is completely silent about the oozie.launcher.*
properties, you will have to make some research in Stack Overflow -- in that post。
我的目标是 运行 我们的 Hadoop 集群上的应用程序,而无需将显式配置放入每个应用程序。因此,我试图将集群的配置放入 ENV 变量中,并将它们传播到集群中的每个节点。
比如我定义:
export HIVE2_JDBC_URL=jdbc:hive2://localhost:10000
以后像这样使用它:
beeline -u $HIVE2_JDBC_URL/<db_name> -e "SELECT * FROM <table_name>;"
虽然这适用于这个特定的用例(在 cli 中),但它有两个很大的缺点:
- 我必须根据更改手动更新每个节点上的 ENV 变量
- Oozie 工作流无法读取 ENV 变量
有没有办法使用 Ambari 检索此设置,我可以定义我自己的自定义设置,然后在每个节点上可用吗?是否有一种方法也适用于 Oozie 工作流程?
您可以通过 mapred-site.xml
和 yarn-site.xml
强制 "cluster-wide" 环境变量 ——但我不能 100% 确定哪些属性必须在 ResourceManager 服务的配置中设置,and/or 每个 NodeManager 服务,and/or client节点。哪个级别覆盖(或添加到)哪个级别。你将不得不做一些研究和实验。
查看 mapred-default.xml
和 yarn-default.xml
(例如 Hadoop 2.7.0 的 here and here)的文档,了解诸如...
mapred.child.env
mapreduce.admin.user.env
yarn.app.mapreduce.am.env
yarn.app.mapreduce.am.admin.user.env
yarn.nodemanager.admin-env
yarn.nodemanager.env-whitelist
[编辑] 还要查看这些在 "default" 列表中没有正确条目的属性(还有另一个文档错误......)并忘记 "mapred.child"东西
mapreduce.map.env
mapreduce.reduce.env
对于 Oozie 作业,有两种设置环境的方法。变量:
- Shell 操作具有明确的
<env-var>VAR=VALUE</env-var>
语法,因为 shell 脚本非常依赖 环境。变量 - 所有使用 "launcher" YARN 作业的操作 (即 Java、Pig、Sqoop、Spark、Hive、Hive2、Shell...) 可以受益于
<property>
<name>oozie.launcher.xxx.xxx.xxx.env</name><value>****</value>
</property>
覆盖客户端配置中的值上面提到的文件 - MapReduce 操作直接启动,没有 "launcher" 作业,因此 属性 将直接设置为
<property>
<name>xxx.xxx.xxx.env</name><value>****</value>
</property>
- 此外,在核心 Workflow 模式 (即 Java、Pig、MapReduce) 中定义的操作可以使用
<global>
部分来定义属性 仅一次
=> 唉,其他操作被定义为具有独特 XML 模式的插件,并且不继承全局属性...
不幸的是 Oozie 的文档(例如 here for Oozie 4.1) is completely silent about the oozie.launcher.*
properties, you will have to make some research in Stack Overflow -- in that post。