1.总结
"Slow ReadProcessor" 和"Slow BlockReceiver"往往是因为集群负载比较高或者某些节点不健康导致的,本文主要是帮助你确认是因为集群负载高导致的还是因为某些节点的硬件问题。
2.症状
1.作业比以前运行的时间变长
2.Job的日志中有以下WARN的信息
2018-04-18 00:16:11,632 WARN [ResponseProcessor for block BP-<pool_id>:blk_<block_id>] org.apache.hadoop.hdfs.DFSClient: Slow ReadProcessor read fields took 57485ms (threshold=30000ms);
ack: seqno: 4 status: SUCCESS status: SUCCESS status: SUCCESS downstreamAckTimeNanos: 3284342, targets:
[DatanodeInfoWithStorage[x.x.x.x:50010,DS-26391dd6-c34d-4f7a-a6ff-6b9d264a6edd,DISK],
DatanodeInfoWithStorage[x.x.x.x:50010,DS-1840e064-e616-49d5-8ead-91f65bb3af93,DISK],
DatanodeInfoWithStorage[x.x.x.x:50010,DS-e884e0d2-b1a1-414d-925c-5d6efd1258e4,DISK]]
3.Datanode的日志中有以下WARN信息
2018-04-17 06:23:48,796 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Slow BlockReceiver write packet to mirror took 341ms (threshold=300ms)
2016-06-21 06:23:55,775 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Slow BlockReceiver write data to disk cost:873ms (threshold=300ms)
2018-04-17 08:37:52,397 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Slow flushOrSync took 534ms (threshold=300ms), isSync:false, flushTotalNanos=533345033ns
2018-04-17 08:38:57,929 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Slow manageWriterOsCache took 331ms (threshold=300ms)
请注意,单个节点的硬件问题可能会在整个群集中导致“Slow”错误。
3.原因
症状 |
原因 |
---|---|
集群负载高 |
如果你的集群处于或接近资源上限(内存,cpu或磁盘),则你在处理作业时,你的集群可能无法确保数据本地化,因此需要在网络上传输数据块。如果是这种情况,由于使用集群上的额外负载来传输数据块,因此可能会在作业或数据节点中看到WARN消息。 |
Slow BlockReceiver write packet to mirror |
这表明在网络上写入块时有延迟 |
Slow BlockReceiver write data to disk cost |
这表示在将块写入OS缓存或磁盘时存在延迟 |
Slow flushOrSync |
这表示在将块写入OS缓存或磁盘时存在延迟 |
Slow manageWriterOsCache |
这表示在将块写入OS缓存或磁盘时存在延迟 |
需要注意的是,在生产环境的正常负载下,一些集群的WARN消息在datanode日志中是正常的。当单个节点具有比正常情况更多的上述WARN消息时,表明存在底层硬件问题。
4.解决办法
以下步骤将有助于确定导致DataNode日志中的“Slow”消息的底层硬件问题。
1.在每个DataNode上运行以下命令来收集所有Slow消息的计数:
egrep -o "Slow.*?(took|cost)" /path/to/current/datanode/log | sort | uniq -c
该命令将提供DataNode日志中所有“Slow”消息的计数。输出将类似于:
1000 Slow BlockReceiver write data to disk cost
234 Slow BlockReceiver write packet to mirror took
4 Slow flushOrSync took
6 Slow manageWriterOsCache took
2.如果单个节点的一个或多个类别的”Slow“消息比其他主机的”Slow“消息数量多出数量级,则需要调查底层硬件问题。
3.如果Slow消息数最多的是Slow BlockReceiver write packet tomirror took,请通过以下命令的输出来调查可能的网络问题:
- ifconfig -a(定期检查问题主机上增加的errors和dropped的数量,往往代表的是网卡,网线或者上游的网络有问题)
- netstat -s(与正常节点相比,查找大量重新传输的数据包或其他异常高的指标)。
- netstat -s | grep -i retrans(整个集群执行)。 (在一个或多个节点上查找大于正常的计数)。
4.如果Slow消息最多的是一些其他消息,请使用以下命令检查磁盘问题:
- iostat[高iowait百分比,超过15%]
- iostat -x和sar -d(特定分区的高await或%util)
- dmesg (磁盘错误)
- 使用smartctl对磁盘进行健康检查:停止受影响节点的所有Hadoop进程,然后运行sudo smartctl -H /dev/<disk>,检查HDFS使用的每块<disk>