2016-08-29 27 views
1

我的目标是在我们的Hadoop集群上运行应用程序,而无需将显式配置放入每个应用程序。因此,我试图将群集的配置放入ENV变量并将它们传播到群集中的每个节点。在分布式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工作流程中是否有一种方法可行?

回答

2

您可以强制“集群范围内的”环境变量通过mapred-site.xmlyarn-site.xml - 但我不是100%确定哪些属性必须在的ResourceManager服务的配置设置,和/或每NodeManager服务,和/或客户端节点。哪个级别覆盖(或增加)哪个级别。你将不得不做一些研究&实验。

看看能否mapred-default.xmlyarn-default.xml(如herehere Hadoop的2.7.0),用于如属性的文件...

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作业,有两种方法可以设置env。变量:

  • 壳牌行为有明确的<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的文档(如here对于Oozie的4.1)是完全沉默的oozie.launcher.*属性,你将不得不在堆栈溢出一些研究 - 在that post例如。

+0

感谢您的回答,这是一个非常好的概述。我结束了自动生成属性文件在我的情况。 –