Hadoop Yarn Linux Container Executor配置

本文的内容是东拼西凑出来的,写给自己看的,还有调试的时候的一些报错的解决方式,本人菜鸡一只,如果有说错的地方,还望批评指出!

概述:

Yarn支持两种不同容器实现方式,一种是yarn容器,一种是Linux容器,据说还有一种Docker容器(但是Docker其实带不太动CM,不过apache还是没问题的),Linux容器较比Yarn容器具有更好的扩展性和隔离性。本文将讲述Linux容器的配置。

偶然有机会,自己测试Hadoop Yarn Linux Container Executor的配置,但是说实话之前没做过容器这块的东西,所以虽然配置成功但是不太明白这么做有什么意义。因此百度了几篇大神的文章,这里转一下,如有冒犯实在抱歉!

1、关于nodemanager开启不同的Container的介绍:(AlstonWilliams)https://www.jianshu.com/p/e79b6a10dc85

然后我从中看到了Cgroup的影子,我就开始好奇Cgroup又是个啥,继续搜索,找到了这个

2、关于Cgroup的介绍:(刘光华_zhou)http://blog.csdn.net/zhoudetiankong/article/details/76150199

如上,我发现了Cgroup大概的意思就是启动应用的时候限定该应用占用的cpu,因此我看到了另一位大神的一篇文章

3、hadoop升级Cgroup:(哪天改改)http://blog.csdn.net/fbj312/article/details/63762891

写的很好,我真的看明白了,也说了不少报错的解决!

4、hadoop Cgroup源码解读:(刘光华_zhou)http://blog.csdn.net/zhoudetiankong/article/details/76158696

然后我又看了看源码解读,做了下记录!

然后我就开始了我的测试:

说是测试,其实也没做什么主要是一些报错记录下(毕竟自己水平也是有限委屈

报错一: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/modules/hadoop-2.5.0/bin/container-executor)
2018-03-14 12:39:23,852 FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed to initialize container executor
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:192)
	at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:425)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:472)
Caused by: java.io.IOException: Linux container executor not configured properly (error=1)
	at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:175)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:190)
	... 3 more
Caused by: ExitCodeException exitCode=1: /opt/modules/hadoop-2.5.0/bin/container-executor: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/modules/hadoop-2.5.0/bin/container-executor)

	at org.apache.hadoop.util.Shell.runCommand(Shell.java:538)
	at org.apache.hadoop.util.Shell.run(Shell.java:455)
	at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702)
	at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:169)
	... 4 more

这个网上的解决方法不一,大概有两种:

第一种是重新编译(我没试过):

尝试重新编译,找到Hadoop源代码,在$HADOOP_SRC/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager路径下,有一个pom.xml文件和src目录,直接使用maven编译,执行以下命令:

mvn package -Pdist,native -DskipTests -Dtar -Dcontainer-executor.conf.dir=$HADOOP_HOME/etc/hadoop

在编译好的target/native/usr/local/路径下可以找到编译好的container-executor,替换即可。

替换之后可以执行$HADOOP_HOME/bin/container-executor -checksetup,如果没有错误信息,基本上问题就解决了。

第二种是让机器支持GLIBC_2.14https://www.cnblogs.com/erygreat/p/7223829.html(我用的是这种方式解决的)

报错二:/opt/modules/hadoop-2.5.0/etc/hadoop must be owned by root, but is owned by 500

2018-03-14 13:47:37,961 FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed to initialize container executor
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:192)
	at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:425)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:472)
Caused by: java.io.IOException: Linux container executor not configured properly (error=24)
	at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:175)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:190)
	... 3 more
Caused by: ExitCodeException exitCode=24: File /opt/modules/hadoop-2.5.0/etc/hadoop must be owned by root, but is owned by 500

	at org.apache.hadoop.util.Shell.runCommand(Shell.java:538)
	at org.apache.hadoop.util.Shell.run(Shell.java:455)
	at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702)
	at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:169)
	... 4 more

原因:这个是在${HADOOP_HOME}/etc/hadoop/container-executor.cfg配置文件的权限,和他上层目录的user(所属者)必须是root。

解决方式:chown root:root ${HADOOP_HOME}/etc/   (我就改了etc的权限为root:root)

然后我发现,报了这样的错!

Caused by: ExitCodeException exitCode=24: File /opt/modules/hadoop-2.5.0 must be owned by root, but is owned by 500

或者这样

ExitCodeException exitCode=24: File /opt/modules must be owned by root, but is owned by 500

然后我就明白了,应该让这个container-executor.cfg配置文件的所有上层目录都变成root,就是说opt,modules,hadoop-2.5.0,etc,hadoop这几个目录都要变成root:root(注意:其他的不用)

报错三:Caused by: ExitCodeException exitCode=22: Invalid permissions on container-executor binary.

2018-03-14 14:36:21,416 FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed to initialize container executor
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:192)
	at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:425)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:472)
Caused by: java.io.IOException: Linux container executor not configured properly (error=22)
	at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:175)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:190)
	... 3 more
Caused by: ExitCodeException exitCode=22: Invalid permissions on container-executor binary.

	at org.apache.hadoop.util.Shell.runCommand(Shell.java:538)
	at org.apache.hadoop.util.Shell.run(Shell.java:455)
	at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702)
	at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:169)
	... 4 more

原因:看起来是执行某一个脚本或者文件的时候,权限有问题!

解决:其实就是在${HADOOP_HOME}/bin下面的container-executor这个的权限有问题

执行 sudo chmod 6050 container-executor

这时候有可能出现另一种报错:

2018-03-15 11:43:09,610 FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed to initialize container executor
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:192)
	at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:425)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:472)
Caused by: java.io.IOException: Cannot run program "/opt/modules/hadoop-2.5.0/bin/container-executor": error=13, Permission denied
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
	at org.apache.hadoop.util.Shell.runCommand(Shell.java:485)
	at org.apache.hadoop.util.Shell.run(Shell.java:455)
	at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702)
	at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:169)
	at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:190)
	... 3 more
Caused by: java.io.IOException: error=13, Permission denied
	at java.lang.UNIXProcess.forkAndExec(Native Method)
	at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
	at java.lang.ProcessImpl.start(ProcessImpl.java:130)
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
	... 8 more


这个报错是这样的:

在etc/hadoop/container-executor.cfg这个配置文件里面写了

yarn.nodemanager.linux-container-executor.group=hadoop
yarn.nodemanager.local-dirs=/opt/modules/hadoop-2.5.0/yarn/local
yarn.nodemanager.log-dirs=/opt/modules/hadoop-2.5.0/yarn/log
banned.users=hdfs,yarn,mapred,bin

min.user.id=1000

所以${HADOOP_HOME}/bin下面的container-executor的权限应该如下:

sudo chown root:hadoop container-executor

sudo chmod 6050 container-executor


====================华丽的分割线=========================


hadoop cgroup cpu资源计算方法:

比如一台机器是nodemanger节点,16核cpu,实际该机器cpu资源为1600%。设置yarn.nodemanager.resource.percentage-physical-cpu-limit为90,则nodemanager可用的cpu资源为16*0.9=14.4,则nodemanger所占用的cpu资源最高为1440%。另外,如果yarn.nodemanager.resource.cpu-vcores配置虚拟cpu核数为12,则这样的话该nodemanger上分配的一个container最多可以使用的cpu资源为1440%/12。



文章的最后,再转载一篇关于hadoop使用kerberos增加权限验证功能的帖子:(nextuser)http://www.aboutyun.com/blog-1330-933.html

kerberos应该也是大数据容器的知识,简单来讲就是做个安全机制,让用户或者应用要请求集群数据或者资源的时候做一个校验,具体我也说不清楚,还在学习中!

本人菜鸡一只,谢谢各位大神写的文章!!!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Hadoop YARNHadoop的下一代集群资源管理系统,它将集群资源划分为容器,通过资源调度器来分配和管理这些容器。资源调度器的配置对于集群的性能和资源利用率至关重要。 首先,需要配置YARN的调度器类型。目前YARN支持两种调度器:容量调度器和公平调度器。容量调度器将集群资源按比例分配给不同的队列,每个队列有固定的资源容量;而公平调度器将资源动态分配给各个应用程序,根据应用程序的运行状况动态调整资源分配。 其次,需要配置队列的属性。队列属性包括队列名称、资源容量、资源限制等。资源容量指定了每个队列可以使用的最大资源数量,资源限制是为了避免某个队列占用过多资源而导致其他队列无法正常运行。 另外,还可以配置调度器的策略。调度策略根据不同的需求来决定资源的分配方式,比如公平策略会尽量保持各个应用程序获得相同的资源量,而容量策略则会按照预先设定的比例分配资源。 此外,还需要配置队列的优先级。队列优先级可以保证某个队列在资源不足时获得更多的资源,以确保高优先级的应用程序能够正常运行。 最后,还可以配置一些其他参数,例如最大容器数、最大AM资源比例等。这些参数可以根据具体的需求进行调整,以优化资源管理和调度效果。 总之,Hadoop YARN资源调度器的配置需要根据集群的实际情况和需求进行灵活的调整,以实现高效的资源管理和调度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值