hadoop之MapReduce调用R的一次失败的总结~
2015-07-14 15:17
393 查看
MapRedure调用R遇到了一系列奇怪的问题,包括前面2篇blog也是为了这个问题去测试。
时至今日,我已经耗费了一个星期的时间去追踪它的缘由,但是我依然没有发现它。
或许我应该暂时的放下。有待以后换个hadoop的环境再去尝试。毕竟我还不能保证这个hadoop的环境是非常优质的!
现在我尽量把问题描述清楚,做一次归档,希望以后有机会从源码的角度去追踪它。
毕竟目前自己对hadoop的理解尚浅,也许是hadoop的bug现在都无法确定。
首先R的一些异常,可能历史数据导致,可以不管。
hadoop是多线程的,因为看到单进程CPU使用率超过100%!
hadoop 任务失败重复执行机制,任务失败了,可以尝试的次数!
hadoop推测执行机制,同一个任务可能启动2个Map,先结束的把后结束的kill掉。
hadoop调用其它语言可能长时间既没有输入,也没有输出。就会超时。0为关闭超时。
hadoop查询任务,kill任务的命令,方便调试使用
hadoop关闭和启动的一些参数顺序
50010端口问题,执行以下命令,2台机器加起来200多
而观察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的开始时间,是有几秒差距的!
返回的表象看起来就是row.get()的时候超时,但是却找不到原因!
这里也许可以写一个程序,把每个Map的日志归归类,不然多个Map的日志都输出到一个文件中,分析起来,很是麻烦。
无赖之下,我开始检索了hadoop的datanode日志,惊喜了发现了很多错误!
但是他在我R端能正常返回的时候也是报错的,例如我只跑一个Map,R可以正常返回,但是datanode依然会有错误。
甚至,我不拿MR去调用R,直接使用R shell,有时候也会报错,这里我没有更严谨的测试它。
异常如下!
观察它,应该是在我第一批次任务,比如那14个任务进行到一半的时候就开始频繁出现。
这些异常刷新的非常非常快,感觉上会有成百上千那么多!我没有具体统计。
“断开的管道”应该是“broken pipe”,由于我的系统是中文版本环境,被自动翻译了吧。
而之后我细心的发现,有时候还会抛出一个异常,如下
我在107机器抛出如上错误之前和之后分别执行
很痛苦,我无力解决这些错误,我尽力去描述这些现象,以及我测试中的一些发现。有待以后解决。
我甚至开始怀疑zookooper心跳相关的问题?
希望随着我对hadoop的深入,可以弄懂它。
时至今日,我已经耗费了一个星期的时间去追踪它的缘由,但是我依然没有发现它。
或许我应该暂时的放下。有待以后换个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的深入,可以弄懂它。
相关文章推荐
- linux命令学习DAY.3
- OpenLayers开发:弹出框
- Could not open Selected VM debug port (8700)
- OpenLayers开发:添加地标
- Centos7 安装maven,tomcat(linux第三篇)
- 系统架构优化思路
- linux中svn命令集
- Linux测试标准------stress压力测试
- shell 批量替换文本中的内容
- liunx tomcat 部署
- tomcat 部署多个war包项目和配置域名
- centos重置密码
- OpenLayers开发:调用矢量图层
- Linux下高频命令分类辑录(基本使用篇)
- 软负载与nginx的相关配置
- Jetty 的工作原理以及与 Tomcat 的比较
- Linux之变量引用与命令替换
- 通过property修改usb属性
- Linux之文件加密解密
- OpenLayers开发:调用栅格数据