問題の概要:
Hiveジョブを実行した際にスケジューリングシステムが失敗し、以下のようなエラーが発生しました:
java.io.IOException: java.net.ConnectException: Call From #HostName/#IP to #HostName:10020 failed on connection exception: java.net.ConnectException: 拒否された接続; 詳細は http://wiki.apache.org/hadoop/ConnectionRefused を参照してください
Caused by: java.net.ConnectException: Call From #HostName/#IP to #HostName:10020 failed on connection exception: java.net.ConnectException: 拒否された接続; 詳細は http://wiki.apache.org/hadoop/ConnectionRefused を参照してください
CONSOLE# Ended Job = job_1638255473937_0568 with exception 'java.io.IOException(java.net.ConnectException: Call From #HostName/#IP to #HostName:10020 failed on connection exception: java.net.ConnectException: 拒否された接続; 詳細は http://wiki.apache.org/hadoop/ConnectionRefused を参照してください)'
CONSOLE# FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. java.net.ConnectException: Call From #HostName/#IP to #HostName:10020 failed on connection exception: java.net.ConnectException: 拒否された接続; 詳細は http://wiki.apache.org/hadoop/ConnectionRefused を参照してください
この情報だけでは具体的な問題を特定できなかったため、サーバー上のすべてのログを調査しましたが、問題の原因は特定できませんでした。最終的にYARNのログを確認したところ、問題の原因が判明しました。 スケジューリングシステムから取得したApplicationId:application_1638255473937_0568 を使用し、HDFS上の対応するログ情報を確認しました。
YARNログの確認:
[hdfs@centos hadoop27]$ yarn logs -applicationId application_1638255473937_0568
重要なエラーメッセージ:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.FSLimitException$MaxDirectoryItemsExceededException): The directory item limit of /tmp/hadoop-yarn/staging/history/done_intermediate/hdfs is exceeded: limit=1048576 items=1048576
エラーの原因: Hadoopの単一ディレクトリ内のファイル数がデフォルトの制限値1048576を超えています。そのため、制限値を増やす必要があります。
解決策1: hdfs-site.xml設定ファイルに以下のパラメータを追加し、値を増やします。
<property>
<name>dfs.namenode.fs-limits.max-directory-items</name>
<value>2097152</value>
</property>
設定ファイルをHadoopクラスタのすべてのノードに反映させ、Hadoopサービスを再起動します。
解決策2: 設定を変更してHadoopクラスタサービスを再起動できない場合は、まず該当ディレクトリを削除し、再作成します。
hadoop fs -rm -r /tmp/hadoop-yarn/staging/history/done_intermediate/hdfs
hadoop fs -mkdir /tmp/hadoop-yarn/staging/history/done_intermediate/hdfs
このディレクトリのファイル数が上限を超えた根本的な原因は、Hadoopクラスタでjobhistoryサーバーが有効になっておらず、過去のジョブ履歴ログがクリーンアップされていなかったことです。
拡張情報:
一:YARNログの保存場所と詳細情報の確認方法 1:History Server UIインターフェースから確認します。(例:http://IP:8801/jobhistory)
2:yarnコマンドで確認(実行ユーザーとジョブを提出したユーザーが一致している必要があります) 2.1: yarn application -list -appStates ALL(このコマンドは時間情報を表示しません) 2.2: yarn logs -applicationId application_1638255473937_0568
3:HDFSパスのログを直接確認(ログはシステムのカスタムログディレクトリではなくHDFS上に保存されています) 3.1: yarn-site.xmlファイルを確認し、ログ設定ディレクトリを確認します。
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/data1/hadoop27/logs</value>
</property>
3.2: ログファイル情報の確認
[hdfs@centos hadoop]$ hdfs dfs -ls /data1/hadoop27/logs/hdfs/logs/application_1638255473937_0568
Found 1 items
-rw-r----- 2 hdfs hdfs 66188 2021-11-30 20:24 /data1/hadoop27/logs/hdfs/logs/application_1638255473937_0568/centos.pp1.db_46654
3.3: ログ詳細情報の確認 3.3.1: yarn logs -applicationId application_1638255473937_0568 (上記2.2と同じ) 3.3.2: hdfs dfs -cat /data1/hadoop27/logs/hdfs/logs/application_1638255473937_0568/centos.pp1.db_46654 ## -catで確認 3.3.3: hdfs dfs -cat /data1/hadoop27/logs/hdfs/logs/application_1638255473937_0568/centos.pp1.db_46654 > tmp.log ## -catで内容を現在ディレクトリのtmp.logに保存 3.3.4: hdfs dfs -get /data1/hadoop27/logs/hdfs/logs/application_1638255473937_0568/centos.pp1.db_46654 ## getでHDFSファイルを現在ディレクトリにダウンロードして確認
二: HDFS操作コマンド: 1.1: HDFSの指定ディレクトリにあるフォルダとファイルの数を確認
[hdfs@centos hadoop]$ hadoop fs -count /tmp/hadoop-yarn/staging/history/done_intermediate/hdfs
1 1048576 3253261451467 /tmp/hadoop-yarn/staging/history/done_intermediate/hdfs
最初の数値1はそのディレクトリ内に1つのフォルダがあることを示します。 2番目の数値1048576はそのディレクトリ内に1048576個のファイルがあることを示します。 3番目の数値3253261451467はそのディレクトリ内のすべてのファイルの合計サイズを示します。