本トピックでは、「DataXceiver Premature EOF from inputStream」エラーの解決方法について説明します。
エラーメッセージ
DataXceiver error processing WRITE_BLOCK operation src: /10.*.*.*:35692 dst: /10.*.*.*:50010 java.io.IOException: Premature EOF from inputStream
原因
各 DataNode は、dfs.datanode.max.transfer.threads パラメーター (デフォルト値: 4096) を使用して、同時データ転送スレッドの数を制限します。ジョブが多数の HDFS 書き込みストリームを同時に開くと、アクティブな xceiver の数がこの制限を超える可能性があります。
制限を超えると、DataNode ログに原因を特定できる二次的なエラーが記録されます。
解決策
ステップ 1: DataNode ログで原因の確認
DataNode ログをチェックして、これが原因であることを確認します。手順については、「HDFS サービスログ」をご参照ください。
通常、ログには次のメッセージが含まれています:
java.io.IOException: Xceiver count 4097 exceeds the limit of concurrent xcievers: 4096
at org.apache.hadoop.hdfs.server.datanode.DataXceiverServer.run(DataXceiverServer.java:150)
このメッセージが表示された場合は、ステップ 2 に進んでください。
手順 2: dfs.datanode.max.transfer.threads の値を増加させる
-
EMR on ECS コンソールにログインします。
-
上部のナビゲーションバーで、ご利用のクラスターが存在するリージョンを選択し、リソースグループを選択します。
-
ECS 上の EMR ページで、クラスターを見つけ、[サービス] を [操作] 列でクリックします。
-
表示されるページで、[設定] タブをクリックします。
-
dfs.datanode.max.transfer.threadsを検索し、その値を引き上げます。
新しい値は、現在の制限値の 2 倍に設定します。たとえば、現在の制限値が 4096 の場合は 8192 に設定します。ワークロードの同時実行性が非常に高い場合は、16384 に設定します。
dfs.datanode.max.transfer.threads パラメーターは、DataNode が読み取りおよび書き込みデータストリームを処理するために使用するスレッドの最大数を制御します。デフォルト値は 4096 です。
Hadoop 分散ファイルシステム (HDFS) にデータを書き込む際の「DataXceiver Premature EOF from inputStream」エラーを修正します。