您的位置:首页 > 运维架构

hadoop之MapReduce调用R的一次失败的总结~

2015-07-14 15:17 393 查看
MapRedure调用R遇到了一系列奇怪的问题,包括前面2篇blog也是为了这个问题去测试。

时至今日,我已经耗费了一个星期的时间去追踪它的缘由,但是我依然没有发现它。

或许我应该暂时的放下。有待以后换个hadoop的环境再去尝试。毕竟我还不能保证这个hadoop的环境是非常优质的!

现在我尽量把问题描述清楚,做一次归档,希望以后有机会从源码的角度去追踪它。

毕竟目前自己对hadoop的理解尚浅,也许是hadoop的bug现在都无法确定。

首先R的一些异常,可能历史数据导致,可以不管。

1: In auto.arima(ds) :
Unable to fit final model using maximum likelihood. AIC value approximated
2: In auto.arima(ds) :
Unable to fit final model using maximum likelihood. AIC value approximated


hadoop是多线程的,因为看到单进程CPU使用率超过100%!

hadoop 任务失败重复执行机制,任务失败了,可以尝试的次数!

mapreduce.map.maxattempts
mapreduce.reduce.maxattempts


hadoop推测执行机制,同一个任务可能启动2个Map,先结束的把后结束的kill掉。

mapreduce.map.speculative
mapreduce.reduce.speculative


hadoop调用其它语言可能长时间既没有输入,也没有输出。就会超时。0为关闭超时。

mapreduce.task.timeout


hadoop查询任务,kill任务的命令,方便调试使用

hadoop job -list
hadoop job -kill  job_ID


hadoop关闭和启动的一些参数顺序

scp hdfs-site.xml 192.168.101.108:/home/hadoop/hadoop-2.6.0/etc/hadoop
hbase-daemon.sh stop thrift
stop-hbase.sh
zkServer.sh stop   --关闭其他机器
stop-all.sh
**********************************
start-all.sh
zkServer.sh start   --启动其他机器
start-hbase.sh
hbase-daemon.sh start thrift


50010端口问题,执行以下命令,2台机器加起来200多

netstat -anp | grep 50010 |wc -l

而观察namenode,会从100左右慢慢涨至几万,最后又恢复100左右!

下面我们从异常开始记录。

R端总会抛出这个异常 rhbase<hbScannerGetList>:: (IOError) Default TException.

下面blog已经分析了。
http://blog.csdn.net/yibei8811/article/details/46849695
做一些更详细的记录,

就是例如我Map被分配了31个任务,第一批任务大概有14个可以并行执行,最终前19个任务总是能正常执行,后面的任务会产生异样,最终R端抛出异常。

我们分析过thirft连接数应该是正常的。从未超过16,就算连接超过也应该只是进入队列等待。

而Map任务平均不到1分钟就可以跑完,返回的连接可以继续使用,而实际的测试结果是row.get()的时候总是卡住2分半钟左右,而后返回异常!

而有些异常时间居然巧合的是一致的,如下!确认了下Map的开始时间,是有几秒差距的!

2015-07-10 16:14:41	 cell:65024 kpi:HSDPA_USERS is error Error in res$get(1e+05): rhbase<hbScannerGetList>:: (IOError) Default TException.
2015-07-10 16:14:47	 cell:65025 kpi:HSDPA_USERS is error Error in res$get(1e+05): rhbase<hbScannerGetList>:: (IOError) Default TException.
2015-07-10 16:16:39	 cell:845 kpi:HSDPA_USERS is error Error in res$get(1e+05): rhbase<hbScannerGetList>:: (IOError) Default TException.
2015-07-10 16:16:39	 cell:65027 kpi:HSDPA_USERS is error Error in res$get(1e+05): rhbase<hbScannerGetList>:: (IOError) Default TException.
2015-07-10 16:16:39	 cell:65026 kpi:HSDPA_USERS is error Error in res$get(1e+05): rhbase<hbScannerGetList>:: (IOError) Default TException.


返回的表象看起来就是row.get()的时候超时,但是却找不到原因!

这里也许可以写一个程序,把每个Map的日志归归类,不然多个Map的日志都输出到一个文件中,分析起来,很是麻烦。

无赖之下,我开始检索了hadoop的datanode日志,惊喜了发现了很多错误!

但是他在我R端能正常返回的时候也是报错的,例如我只跑一个Map,R可以正常返回,但是datanode依然会有错误。

甚至,我不拿MR去调用R,直接使用R shell,有时候也会报错,这里我没有更严谨的测试它。

异常如下!

2015-07-13 13:15:57,416 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: BlockSender.sendChunks() exception:
java.io.IOException: 断开的管道
at sun.nio.ch.FileChannelImpl.transferTo0(Native Method)
at sun.nio.ch.FileChannelImpl.transferToDirectly(FileChannelImpl.java:433)
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:565)
at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:223)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendPacket(BlockSender.java:559)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:728)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:496)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opReadBlock(Receiver.java:116)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:71)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:235)
at java.lang.Thread.run(Thread.java:745)
2015-07-13 13:15:57,420 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: BlockSender.sendChunks() exception:
java.io.IOException: 断开的管道
at sun.nio.ch.FileChannelImpl.transferTo0(Native Method)
at sun.nio.ch.FileChannelImpl.transferToDirectly(FileChannelImpl.java:433)
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:565)
at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:223)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendPacket(BlockSender.java:559)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:728)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:496)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opReadBlock(Receiver.java:116)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:71)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:235)
at java.lang.Thread.run(Thread.java:745)
2015-07-13 13:15:57,420 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: BlockSender.sendChunks() exception:
java.io.IOException: 断开的管道
at sun.nio.ch.FileChannelImpl.transferTo0(Native Method)
at sun.nio.ch.FileChannelImpl.transferToDirectly(FileChannelImpl.java:433)
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:565)
at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:223)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendPacket(BlockSender.java:559)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:728)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:496)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opReadBlock(Receiver.java:116)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:71)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:235)
at java.lang.Thread.run(Thread.java:745)


观察它,应该是在我第一批次任务,比如那14个任务进行到一半的时候就开始频繁出现。

这些异常刷新的非常非常快,感觉上会有成百上千那么多!我没有具体统计。

“断开的管道”应该是“broken pipe”,由于我的系统是中文版本环境,被自动翻译了吧。

而之后我细心的发现,有时候还会抛出一个异常,如下

2015-07-13 12:32:47,236 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to send data: java.net.SocketTimeoutException: 480000 millis timeout while waiting for channel to be ready for write. ch : java.nio.channels.SocketChannel[connected local=/192.168.101.107:50010 remote=/192.168.101.107:51183]
2015-07-13 12:32:47,236 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(192.168.101.107, datanodeUuid=7c0e4b35-4424-4712-a934-e1ef17ed9c16, infoPort=50075, ipcPort=50020, storageInfo=lv=-56;cid=CID-1b849776-c1f9-400c-9b23-9a372eacca43;nsid=157388167;c=0):Got exception while serving BP-2141184482-192.168.101.110-1422503249194:blk_1073904217_163507 to /192.168.101.107:51183
java.net.SocketTimeoutException: 480000 millis timeout while waiting for channel to be ready for write. ch : java.nio.channels.SocketChannel[connected local=/192.168.101.107:50010 remote=/192.168.101.107:51183]
at org.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:246)
at org.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:172)
at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:220)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendPacket(BlockSender.java:559)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:728)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:496)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opReadBlock(Receiver.java:116)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:71)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:235)
at java.lang.Thread.run(Thread.java:745)
2015-07-13 12:32:47,236 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: bd107:50010:DataXceiver error processing READ_BLOCK operation  src: /192.168.101.107:51183 dst: /192.168.101.107:50010
java.net.SocketTimeoutException: 480000 millis timeout while waiting for channel to be ready for write. ch : java.nio.channels.SocketChannel[connected local=/192.168.101.107:50010 remote=/192.168.101.107:51183]
at org.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:246)
at org.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:172)
at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:220)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendPacket(BlockSender.java:559)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:728)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:496)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opReadBlock(Receiver.java:116)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:71)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:235)
at java.lang.Thread.run(Thread.java:745)


我在107机器抛出如上错误之前和之后分别执行

lsof -i:50010 |wc -l
发现数目总是在抛出异常后减少一个!

很痛苦,我无力解决这些错误,我尽力去描述这些现象,以及我测试中的一些发现。有待以后解决。

我甚至开始怀疑zookooper心跳相关的问题?

希望随着我对hadoop的深入,可以弄懂它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: