转:集群提交MapReduce作业执行卡住问题解决方案

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WYpersist/article/details/80202055
关于MapReduce,Map能完全执行,Reduce执行到一半卡住不执行

住了几个小时,死活停滞不前,发现后根据提示开始排错,进入50030,进入作业发现

这说明作业在map之完后的shuffle阶段中,reduce无法从map处拷贝数据,是因为客户端与数据节点通讯失败造成的。客户端程序应该能够和所有的节点通讯才能保证数据的传输正常,然后开始各种检查:所有节点hosts中写的完全相通,不是节点名称不同或者节点没有完全加上造成的,排除;找到slaves发现写的也完全相同,不是节点缺失有误,最后查看了防火墙的状态,发现其中一个节点的防火墙没有关闭,找到原因,service iptables stop,然后重新提交作业,成功运行

MapReduce map100% Reduce 66% 卡死
如果你碰到map100%,reduce 66% 然后程序就貌似停止在这里了,可能是由于在Reduce类里使用了String造成的

根据一位外国友人的说明,在reduce阶段 ,0-33%阶段是 shuffle 阶段,就是根据键值 来讲本条记录发送到指定的reduce,这个阶段应该是在map还没有完全完成的时候就已经开始了,因为我们会看到map在执行到一个百分比后reduce也启动了,这样做也提高了程序的执行效率。

            34%-65%阶段是sort阶段,就是reduce根据收到的键值进行排序。map阶段也会发生排序,map的输出结果是以键值为顺序排序后输出,可以通过只有map阶段处理的输出来验证。

              66%-100%阶段是处理阶段,这个阶段才是真正的处理阶段,如果程序卡在这里,估计就是你的reduce程序有问题了。比如如下代码:  

 String reducevalue=new String();  
 
 int i=0;  
 
 while (values.hasNext() && i<1000) {                                                    
 
   if(reducevalue.length()>0){                                                           
 
        reducevalue+="," }   
 
reducevalue+=values.next().toString()); i++; }   
 
output.collect(key, new Text(reducevalue.toString())); }  
由于使用了String对象,造成性能下降,每传过来一个values对象,就会在while循环中创建几个String对象(也许还有StringBuilder对象,“+”会被编译成StringBuilder对象请参考:

http://developer.51cto.com/art/200906/132698.htm

,如果将String对象换成StringBuilder对象,程序就能顺利的执行

 

关于mapreduce 提交作业卡住不运行
在一次hadoo提交作业遇到卡住不允许的情况,如下图所示

然后打开yarn查看状态,可以看到有一条作业在等待执行

由于看不到进度条,我决定点击进去查看详情,结果看到了

1. ACCEPTED: waiting for AM container to be allocated, launched and register with RM.

也就是上面这句话,说等待AM被分配,这就奇怪了,为什么会出现这样的错误呢?是不是有什么没有启动成功呢?还是什么启动失败了,我马上通过jps查看

果然发现NodeManager没有启动我们一起来看看日志找找错误,看日志绝对是一件特别费劲的事情,虽然费劲但是却能很好的帮我们解决问题,入下图红色圈起来部分

1. Recieved SHUTDOWN signal from Resourcemanager ,Registration of NodeManager failed, Message from ResourceManager: NodeManager from  localhost doesn't satisfy minimum allocations, Sending SHUTDOWN signal to the NodeManager.

这句错误可以看出是内存不足导致的,找到原因就好办了,那么我们修改一下yarn的配置文件,我的文件存在/usr/local/hadoop/etc/hadoop/yarn-site.xml,把里面的内容添加两段配置

 <property>
   <name>yarn.nodemanager.resource.memory-mb</name>
    <value>4096</value>
 </property>
<property>
   <name>yarn.nodemanager.resource.cpu-vcores</name>
  <value>4</value>
 </property>

执行一下启动命令然后再通过jps查看

看到NodeManager已经启动起来了,这个问题我们已经解决了

在执行wordcount时,job卡住不继续执行
开发环境是redhat版本的linux,hadoop2.7.1我在运行wordcount时遇到了一个问题,一直卡在 “ INFO mapreduce.Job: Running job: job_1442558810788_0002 ” 而不能继续,我看了详细的打印信息,是一直在做这个请求

hadoop2.7.x运行wordcount程序卡住在INFO mapreduce.Job: Running job:job _1469603958907_0002
一、抛出问题  

Hadoop集群(全分布式)配置好后,运行wordcount程序测试,发现每次运行都会卡住在Running job处,然后程序就呈现出卡死的状态。

wordcount运行命令:[hadoop@master hadoop-2.7.2]$ /opt/module/hadoop-2.7.2/bin/hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar  wordcount  /wc/mytemp/123 /wc/mytemp/output

现象截图如下:卡死在红线部分:

 

二、解决方法

1、到网上找了很多教程,集中说法如下:

    (1)有的说,是防火墙或者selinux没关闭,然后,就去一一查看,发现全部关闭

    (2)有的说,是因为/etc/hosts文件中的127.0.0.1等多余的ip地址没删除或者没注释调

    (3)有的人说,查看日志(what?小白哪知道哪个日志),然后不了了之。

2、解决办法:  

  小白解决问题总是会花费很多时间的,因此半天就这样没了,很对不起公司的工资啊,现将解决办法一一列出。

  (1)第一步:因为Running job发生的问题,在hadoop 中我们要想到mapreduce发生的问题,在Hadoop2.x系列中MapReduce是通过yarn进行管理的,因此我们查看yarn-hadoop-nodemanager-slave01.log 日志,该日志在slave节点的¥{HADOOP_HOME}/logs下面

终端执行shell指令:yarn-hadoop-nodemanager-slave01.log

查看到日志截图如下:

2016-07-27 03:30:51,041 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 4 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:52,043 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 5 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:53,046 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 6 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:54,047 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 7 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:55,048 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 8 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:30:56,050 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 9 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2016-07-27 03:31:27,053 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

(2)大概的解释一下意思

就是说每次Client试图连接0.0.0.0/0.0.0.0:8031失败,那么导致这个原因,应该能想到是配置问题,然后复制这段信息进行百度,尝试了几个,终于参考了此博客:

解决Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is..

https://blog.csdn.net/panguoyuan/article/details/38727113

(解决Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is... )解决了本文的问题,将下述代码添加到yare-site.xml中:

解决办法:在yare-site.xml里添加如下信息之后问题得到解决

<property>  
 
    <name>yarn.resourcemanager.address</name>  
 
    <value>master:8032</value>  
 
  </property>  
 
  <property>  
 
    <name>yarn.resourcemanager.scheduler.address</name>  
 
    <value>master:8030</value>  
 
  </property>  
 
  <property>  
 
    <name>yarn.resourcemanager.resource-tracker.address</name>  
 
    <value>master:8031</value>  
 
  </property>  
(注意我将master、slave01、slave02这个文件都修改了,是不是只修改master就可以,不清楚,但是初步判断应该全部修改)

hadoop 程序在运行时 reduce过程卡在某个进度不动的问题
驶入数据为一个hive表的文件,location到了一个hdfs目录下,然后跑hadoop的过程中,map阶段没有出现问题,但是每次到了reduce阶段,进度都卡在33%不动了,刚开始以为是集群问题,后来重新启动了几次任务,都是这种情况。

可能的情况1:

后来在stackoverflow上找到了答案,这是hadoop上数据倾斜造成的问题(我的hive表使用了orde by,所以是按照字段排序,如果将字段作为marpeduce的key,那么某一台机器上的reduce大部分都是同一个key,这违背了mapreduce并发的思想,造成其他reduce一直等的情况),所以卡死。具体数据倾斜解释请看~(数据倾斜解释),解决办法:在生成hive表的时候取消order by命令。但是并没有用,照样在33%卡死。

可能的情况2:

我增加了redece的个数,job.setNumReduceTasks(1000);跑通了。

某些任务执行时间过长,且失败率过高
检查日志后发现没有执行完就失败,原因出在hadoop 的 job 的 timeout 过短(相对于集群的能力来说),设置长一点即可

 

(1) 环境:Centos6.4、JDK1.7、hadoop-2.5.0-cdh5.3.3

(2) 问题:之前使用Apache的hadoop跑各种MR应用均没出现问题,然而使用CDH版的hadoop运行到running job却卡住了。

配置好伪分布式的hadoop集群,启动集群后,使用自带的pi实例测试集群是否配置成功,使用命令:

$bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.3.jar pi 1 1

可是任务运行到running job就卡住了

INFO mapreduce.Job: Running job: job_1403905542893_0004

ResourcesManager浏览器界面显示UNASSIGNED


Tracking UI - UNASSIGNED
Apps Submitted - 1
Apps Pending - 1
Apps Running - 0

Jps输出:

4764 Jps
2148 DataNode
3280 ResourceManager
2053 NameNode
3378 NodeManager
2318 SecondaryNameNode

(3) 解决方法:

从网上查了好多资料,主要有两种方法:一是hosts配置了不相关的主机,修改/etc/hosts文件,删除不相关的主机;二是集群的资源不足,无法分配给新任务的资源,需要调节yarn-site.xml的调度器获得资源的参数。

对于方法一,我的配置文件只配置了本地主机,因此不是hosts文件问题。对于方法二,以前使用Apache的hadoop伪分布式集群时,运行到map 0% reduce 0%卡住,调节下yarn-site.xml参数,可以完美运行了,原yarn-site.xml配置:

<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>

调节后的配置:

<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>3072</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>

Yarn配置详细参数可见:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-configurations-resourcemanager-nodemanager/

可是这些配置同样在CDH的hadoop上却出现在running job卡住的问题。

(4) 最终解决方案:

把yarn-site.xml中关于资源调节的配置删除即可。

原yarn-site.xml配置:

<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2560</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>
</configuration>

修改后yarn-site.xml文件:

<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>

重启resourcemanager和nodemanager守护进程,再次运行pi实例,会发现作业成功运行!

    https://blog.csdn.net/aspkhdp/article/details/49996689

参考资料:http://stackoverflow.com/questions/24481439/cant-run-a-mapreduce-job-on-hadoop-2-4-0
————————————————
版权声明:本文为CSDN博主「菜鸟级的IT之路」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/WYpersist/article/details/80202055

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值