このトピックでは、E-MapReduce (EMR) 上で Apache Druid を実行する際に発生する可能性のある一般的な問題について説明します。インデックス作成の失敗や、頻出する実行時エラーなどが含まれます。
インデックス作成の失敗のトラブルシューティング
インデックス作成の失敗を診断するには、外側のレイヤーから内側へと順に以下の手順を実行してください。
バッチインデックス作成
-
curl コマンドを実行し、その出力を確認します。出力にエラーが表示される場合、または出力がまったく表示されない場合は、入力ファイルのフォーマットを確認してください。生の API 応答を確認するには、curl コマンドに
-vフラグを追加します。 -
Overlord ページを開き、ジョブの実行ステータスを確認します。ジョブが失敗した場合は、そのページ上で直接ログを表示します。
-
Overlord ページにログが表示されない場合は、YARN ページを開き、インデックスジョブが生成されたかどうかを確認します。この手順は、Hadoop ベースのジョブに適用されます。
-
原因が依然として特定できない場合は、EMR Druid クラスターにログインし、Overlord のログを確認します:
/mnt/disk1/log/druid/overlord-emr-header-1.cluster-xxxx.log高可用性 (HA) クラスターの場合は、ジョブ送信を受け付けた Overlord を確認してください。
-
ジョブが MiddleManager に送信されたものの、MiddleManager が失敗を返した場合は、Overlord で該当ジョブに割り当てられたワーカーノードを特定し、そのノードにログインして MiddleManager のログを確認します:
/mnt/disk1/log/druid/middleManager-emr-header-1.cluster-xxxx.log
リアルタイム Tranquility インデックス作成
まず、Tranquility のログを確認し、メッセージが受信されたか、あるいは破棄されたかを確認します。その後、上記のバッチインデックス作成手順の 2~5 ステップを実行します。
ほとんどのインデックス作成エラーは、以下の 2 つのカテゴリに分類されます:
-
クラスター構成エラー:JVM メモリパラメーター、クロスクラスター接続性、高セキュリティモードでのアクセス、Kerberos プリンシパルなど。
-
ジョブエラー:ジョブ記述ファイルのフォーマット、入力データの解析、および
ioConfigなどのジョブレベルの設定項目など。
一般的なエラーと対処方法
サービスの起動に失敗する
原因:マシンの使用可能なメモリが、Druid コンポーネントに対して設定された JVM パラメーター(例:大きなヒープサイズや、限られたメモリを持つマシンにおける高いスレッド数)を満たしていないためです。
対処方法:コンポーネントのログを確認し、過剰に設定されているパラメーターを特定して、値を減らしてください。JVM メモリには、ヒープメモリとダイレクトメモリの 2 種類があります。チューニングに関する詳細は、「Apache Druid パフォーマンスに関するよくある質問」をご参照ください。
YARN タスクが JAR 衝突エラーで失敗する
エラー:
Error: class com.fasterxml.jackson.datatype.guava.deser.HostAndPortDeserializer overrides final method deserialize.(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object;
原因:Druid の依存関係が、Hadoop クラスター上に既に存在する JAR ファイルと衝突しています。
対処方法:インデックス作成ジョブの構成ファイルの tuningConfig セクションに、以下のいずれかのプロパティを追加します:
| 設定項目 | 効果 |
|---|---|
mapreduce.job.classloader: "true" |
MapReduce ジョブがスタンドアロンのクラスローダーを使用できるようにします |
mapreduce.job.user.classpath.first: "true" |
MapReduce がユーザーの JAR パッケージを優先して使用できるようにします |
上記 2 つの設定項目のいずれかを選択してください。例:
"tuningConfig": {
"jobProperties": {
"mapreduce.job.classloader": "true"
}
}
詳細については、「Apache Druid:異なるバージョンの Hadoop との連携」をご参照ください。
Reduce タスクがセグメントディレクトリを作成できない
対処方法:ディープストレージの構成(特に type および directory フィールド)を確認してください:
-
typeがlocalの場合:ディレクトリが存在すること、および EMR Druid アカウントが書き込み権限を持っていることを確認してください。 -
typeがhdfsの場合:パスを完全な HDFS URI として記述します(例:hdfs://<hdfs_master>:9000/)。hdfs_masterには IP アドレスを指定してください。ホスト名を使用する必要がある場合は、完全なホスト名(例:emr-header-1.cluster-xxxxxxxx)を指定し、短縮形(例:emr-header-1)は使用しないでください。
スタンドアロンの EMR Druid クラスターで Hadoop バッチインデックス作成を実行する場合、ディープストレージは必ず "hdfs" に設定してください。"local" を使用すると、リモート YARN クラスターが別のマシン上のローカルパスに書き込めないため、MapReduce ジョブが未定義の状態になります。
10,000 回の試行後にディレクトリを作成できなかった
原因:JVM 構成で指定された java.io.tmp パスが存在しません。
対処方法:該当ディレクトリを作成し、EMR Druid アカウントがそのディレクトリにアクセスできる権限を持っていることを確認してください。
com.twitter.finagle.NoBrokersAvailableException: No hosts are available for disco!firehose:druid:overlord
原因:Druid と Tranquility 間で ZooKeeper 接続が一致していません。
対処方法:両サービスが同一の ZooKeeper 接続文字列を使用していることを確認してください。
EMR Druid のデフォルト ZooKeeper パスは /druid であるため、Tranquility 構成内の zookeeper.connect 値には、必ず /druid が含まれている必要があります。
Kafka とともに Tranquility を使用する場合、以下の 2 つの独立した ZooKeeper 設定が存在します:
| 設定項目 | 接続先 |
|---|---|
zookeeper.connect |
EMR Druid クラスターの ZooKeeper |
kafka.zookeeper.connect |
Kafka クラスターの ZooKeeper |
これらの 2 つの ZooKeeper クラスターは異なる場合があります。各設定項目が正しいクラスターを指していることを確認してください。
MiddleManager が com.hadoop.compression.lzo.LzoCodec を見つけられない
原因:EMR Hadoop クラスターが LZO 圧縮で構成されていますが、必要なファイルが Druid の依存関係ディレクトリに存在しません。
対処方法:EMR クラスター上の HADOOP_HOME/lib から LZO JAR およびそのネイティブライブラリを取得し、Druid の druid.extensions.hadoopDependenciesDir(デフォルト:DRUID_HOME/hadoop-dependencies)にコピーしてください。
GPLNativeCodeLoader IOException によりインデックス作成が失敗する
エラー:
2018-02-01T09:00:32,647 ERROR [task-runner-0-priority-0] com.hadoop.compression.lzo.GPLNativeCodeLoader - could not unpack the binaries
java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively(Native Method) ~[?:1.8.0_151]
at java.io.File.createTempFile(File.java:2024) ~[?:1.8.0_151]
at java.io.File.createTempFile(File.java:2070) ~[?:1.8.0_151]
at com.hadoop.compression.lzo.GPLNativeCodeLoader.unpackBinaries(GPLNativeCodeLoader.java:115) [hadoop-lzo-0.4.21-SNAPSHOT.jar:?]
原因:java.io.tmp パスが存在しません。
対処方法:該当ディレクトリを作成し、EMR Druid アカウントがそのディレクトリにアクセスできる権限を持っていることを確認してください。