在分布式 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 中),但它有两个很大的缺点:

有没有办法使用 Ambari 检索此设置,我可以定义我自己的自定义设置,然后在每个节点上可用吗?是否有一种方法也适用于 Oozie 工作流程?

您可以通过 mapred-site.xmlyarn-site.xml 强制 "cluster-wide" 环境变量 ——但我不能 100% 确定哪些属性必须在 ResourceManager 服务的配置中设置,and/or 每个 NodeManager 服务,and/or client节点。哪个级别覆盖(或添加到)哪个级别。你将不得不做一些研究和实验。

查看 mapred-default.xmlyarn-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