2016-08-29 30 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

感謝您的回答,這是一個非常好的概述。我結束了自動生成屬性文件在我的情況。 –