hive在生產環境中由於用戶數量和身份的不同,難免會對用戶按組進行劃分,根據不同組的優先級劃分Hadoop資源,hadoop fairscheduler支持按用戶組劃分資源池,每個group對應一個組pool,然後根據pool優先級劃分mapreduce資源,在map-site.xml中添加以下配置即可實現按組劃分:
<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.FairScheduler</value>
</property>
<property>
<name>mapred.fairscheduler.poolnameproperty</name>
<value>group.name</value>
</property>
<property>
<name>mapred.fairscheduler.allocation.file</name>
<value>/home/jjt/platform/config/hadoop/pools.xml</value>
</property>
在pools.xml中可定義了各個組可分配的資源情況:
<?xml version="1.0"?>
<allocations>
<pool name="web">
<minMaps>100</minMaps>
<minReduces>50</minReduces>
<maxMaps>20</maxMaps>
<maxReduces>20</maxReduces>
<weight>10.0</weight>
<minSharePreemptionTimeout>300</minSharePreemptionTimeout>
</pool>
<pool name="client">
<minMaps>20</minMaps>
<minReduces>15</minReduces>
<maxMaps>400</maxMaps>
<maxReduces>200</maxReduces>
<weight>1.0</weight>
<minSharePreemptionTimeout>300</minSharePreemptionTimeout>
</pool>
</allocations>
這樣用戶在提交job執行時即可根據所在group從所屬的pool獲取mapreduce資源,那麼hadoop是如何確定用戶所屬的group呢?
hadoop的core-defauft.xml配置中hadoop.security.group.mapping:
<property>
<name>hadoop.security.group.mapping</name>
<value>org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback</value>
</property>
指明是通過JNI的方式獲取用戶所屬的組,也可以指定value為org.apache.hadoop.security.ShellBasedUnixGroupsMapping通過shell命令id -Gn username的方式獲取group.
然而現實中用戶可能屬於多個組,hadoop默認以返回值中的第一個組作為分配資源的依據,如果我們想指定用戶group不是第一個怎麼辦了?
第一種解決方式是提供自己的id命令,將自己的id所在的PATH路徑放在系統id命令PATH之前,讓id -Gn username 返回的的第一個組為我們需要的特定組,這種方式相當於覆蓋了系統id命令,可能影響系統中依賴id命令的部分。
第二種方式則是修改org.apache.hadoop.security.ShellBasedUnixGroupsMapping.java源碼,在代碼中對group進行過濾,這種方式需要每次cdh升級時替換hadoop-common.jar,hadoop cdh4.5采用maven管理,本人在編譯過程中也遇到一些麻煩。
下載含有源碼的cdh4.5 hadoop, 進入src,跳過可能出錯的test,執行mvn install -Dmaven.test.skip=true即可進行所有項目的編譯,cdh4.5 hadoop RPC依賴於protobuf2.4, 因此需要先安裝protobuf2.4。本人在windows下通過Cygwin編譯成功,然而替換掉測試環境中Linux 集群上的hadoop-common.jar後,出現了jobtracker無法啟動、rpc異常錯誤,因此還必須在Linux平台上進行編譯。
在Linux上通過源碼安裝protobuf2.4, 執行 make install 時 出現了錯誤:
/usr/bin/ld: /usr/local/lib/libz.a(deflate.o): relocation R_X86_64_32S against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libz.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
libtool: install: error: relink `libprotoc.la' with the above command before installing it
在掙扎搜索了半天後通過重新安裝執行./configure --enable-lib64 --libdir=/usr/lib64 解決了,因為編譯系統是64位RedHat Linux。
這樣通過以上方式就可以指定hadoop job所屬用戶組了。
Ubuntu 13.04上搭建Hadoop環境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu上搭建Hadoop環境(單機模式+偽分布模式) http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu下Hadoop環境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
單機版搭建Hadoop環境圖文教程詳解 http://www.linuxidc.com/Linux/2012-02/53927.htm
搭建Hadoop環境(在Winodws環境下用虛擬機虛擬兩個Ubuntu系統進行搭建) http://www.linuxidc.com/Linux/2011-12/48894.htm
更多Hadoop相關信息見Hadoop 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=13