加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱故事小小网_铜陵站长网 (http://www.0562zz.com/)- 视频终端、云渲染、应用安全、数据安全、安全管理!
当前位置: 首页 > 教程 > 正文

Hadoop Job 按组分资源池执行的办法

发布时间:2021-12-11 12:35:54 所属栏目:教程 来源:互联网
导读:hive在生产环境中由于用户数量和身份的不同,难免会对用户按组进行划分,根据不同组的优先级划分Hadoop资源,hadoop fairscheduler支持按用户组划分资源池,每个group对应一个组pool,然后根据pool优先级划分mapreduce资源,在map-site.xml中添加以下配置即

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所属用户组了。

(编辑:我爱故事小小网_铜陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读