我的目标是在我们的 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
-- 但我不能 100% 确定必须在 ResourceManager 服务和/或每个 NodeManager 服务和/或 的配置中设置哪些属性客户端节点。哪个级别覆盖(或添加到)哪个级别。您将必须进行一些研究和实验。
查看 mapred-default.xml
的文档和 yarn-default.xml
(例如 Hadoop 2.7.0 的 here 和 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
[编辑] 还要查看这些在“默认”列表中没有正确条目的属性(又是另一个文档错误...)并忘记“mapred.child”的东西
mapreduce.map.env
mapreduce.reduce.env
对于Oozie 作业,有两种设置环境的方法。变量:
- Shell Action 有一个明确的
<env-var>VAR=VALUE</env-var>
语法,因为 shell 脚本非常依赖 env。变量 - 所有使用“启动器”YARN 作业的操作(即 Java、Pig、Sqoop、Spark、Hive、Hive2、Shell...) 都可以受益于
<property>
<name>oozie.launcher.xxx.xxx.xxx.env</name><value>****</value>
</property>
覆盖上面提到的客户端配置文件中的值 - MapReduce 操作是直接启动的,没有“启动器”作业,因此该属性将直接设置为
<property>
<name>xxx.xxx.xxx.env</name><value>****</value>
</property>
- 此外,在核心工作流模式(即 Java、Pig、MapReduce)中定义的操作可以使用
<global>
部分仅定义一次属性
=> 唉,其他操作被定义为具有不同 XML 架构的插件,并且不继承全局属性...
不幸的是,Oozie 的文档(例如 Oozie 4.1 的 here)完全没有提到 oozie.launcher.*
。属性,您必须在 Stack Overflow 中进行一些研究——在 that post 中例如。
关于hadoop - 在分布式 Hadoop 集群中使用 ENV 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39207745/