1.まとめ
「SlowReadProcessor」と「SlowBlockReceiver」は、多くの場合、クラスターの負荷が高いか、特定のノードが異常であることが原因です。この記事は、主に、クラスターの負荷が高いか、一部のノードのハードウェアの問題が原因であるかどうかを確認するのに役立ちます。
2.症状
1.ジョブは以前より長く実行されます
2.次の警告情報がジョブログにあります
2018-04-18 00:16:11,632警告[ブロックBPのResponseProcessor- <pool_id>:blk_ <block_id>] org.apache.hadoop.hdfs.DFSClient:遅いReadProcessor読み取りフィールドに57485ms(threshold = 30000ms)かかりました。ack:seqno:4ステータス:SUCCESSステータス:SUCCESSステータス:SUCCESSダウンストリームAckTimeNanos:3284342、ターゲット:[DatanodeInfoWithStorage [xxxx:50010、DS-26391dd6-c34d-4f7a-a6ff-6b9d264a6edd、DISK]、DatanodeInfoWithStorage [xxxx:50010、DS- 1840e064-e616-49d5-8ead-91f65bb3af93、DISK]、DatanodeInfoWithStorage [xxxx:50010、DS-e884e0d2-b1a1-414d-925c-5d6efd1258e4、DISK]]
3.次の警告情報はデータノードログにあります
2018-04-17 06:23:48,796 WARN org.apache.hadoop.hdfs.server.datanode.DataNode:ミラーへの遅いBlockReceiver書き込みパケットは341ms(threshold = 300ms)かかりました2016-06-21 06:23:55,775 WARN org .apache.hadoop.hdfs.server.datanode.DataNode:遅いBlockReceiverがディスクにデータを書き込むコスト:873ms(しきい値= 300ms)2018-04-17 08:37:52,397警告org.apache.hadoop.hdfs.server.datanode。 DataNode:遅いflushOrSyncは534ms(threshold = 300ms)、isSync:false、flushTotalNanos = 533345033ns 2018-04-17 08:38:57,929警告org.apache.hadoop.hdfs.server.datanode.DataNode:遅いmanageWriterOsCacheは331ms(しきい値)かかりました= 300ms)
単一ノードのハードウェアの問題により、クラスター全体で「低速」エラーが発生する可能性があることに注意してください。
3.理由
症状 |
理由 |
---|---|
クラスターの負荷が高い |
クラスタがリソース(メモリ、CPU、またはディスク)の上限またはその近くにある場合、ジョブの処理時にクラスタがデータのローカリゼーションを保証できない可能性があるため、ネットワーク上でデータブロックを転送する必要があります。この場合、クラスターの余分な負荷がデータブロックの転送に使用されるため、ジョブまたはデータノードにWARNメッセージが表示される場合があります。 |
BlockReceiverがパケットをミラーに書き込むのが遅い |
これは、ネットワークへのブロックの書き込みに遅延があることを示しています |
遅いBlockReceiverがディスクコストにデータを書き込む |
これは、OSキャッシュまたはディスクへのブロックの書き込みに遅延があることを示しています |
遅いflushOrSync |
これは、OSキャッシュまたはディスクへのブロックの書き込みに遅延があることを示しています |
遅いmanageWriterOsCache |
これは、OSキャッシュまたはディスクへのブロックの書き込みに遅延があることを示しています |
実稼働環境の通常の負荷では、一部のクラスターのWARNメッセージがデータノードログで正常であることに注意してください。単一のノードに通常よりも多くのWARNメッセージがある場合は、根本的なハードウェアの問題があることを示しています。
4.解決策
次の手順は、DataNodeログで「遅い」メッセージを引き起こした根本的なハードウェアの問題を特定するのに役立ちます。
1.各DataNodeで次のコマンドを実行して、すべての低速メッセージの数を収集します。
egrep -o "Slow。*?(took | cost)" / path / to / current / datanode / log | 並べ替え| uniq -c
このコマンドは、DataNodeログ内のすべての「低速」メッセージのカウントを提供します。出力は次のようになります。
1000遅いBlockReceiverによるディスクへのデータの書き込みコスト234遅いBlockReceiverのミラーへの書き込みパケットにかかる時間4遅いflushOrSyncにかかる時間6遅いmanageWriterOsCacheにかかる時間
2.単一ノードの1つ以上のカテゴリの「遅い」メッセージの数が他のホストの「遅い」メッセージの数よりも桁違いに多い場合は、根本的なハードウェアの問題を調査する必要があります。
3.ミラーへのSlowBlockReceiver書き込みパケットが最大数のSlowメッセージを受け取った場合は、次のコマンドの出力を使用して、考えられるネットワークの問題を調査してください。
- ifconfig -a(問題のホストでエラーとドロップされたエラーの数を定期的にチェックします。これは、ネットワークカード、ネットワークケーブル、またはアップストリームネットワークに問題があることを意味します)
- netstat -s(通常のノードと比較して、再送信されたデータパケットまたはその他の異常に高いインジケーターを多数見つけます)。
- netstat -s | grep -i retrans(クラスター全体に対して実行されます)。(1つ以上のノードで通常よりも多いカウントを探します)。
4.最も遅いメッセージが他のメッセージである場合は、次のコマンドを使用してディスクの問題を確認してください。
- iostat [iowaitの割合が高く、15%以上]
- iostat-xおよびsar-d(特定のパーティションの高待機または%util)
- dmesg(ディスクエラー)
- smartctlを使用して、ディスクのヘルスチェックを実行します。影響を受けるノードですべてのHadoopプロセスを停止してから、sudo smartctl -H / dev / <disk>を実行して、HDFSで使用される各<disk>をチェックします。