概要
以前動いていた Dataproc の PySpark ジョブが失敗する事象が今月中旬から発生していたので対応しました。似たような事象に合ってる人もいるかもしれないなと思ったので簡単にまとめておきます。
内容は下記の通りです。
- 問題:2019年1月中旬から Dataproc の PySpark ジョブが BigQuery からのデータ読込の部分で失敗するようになっていた
- 原因:Dataproc のデフォルトのイメージバージョンが 1.3 に変わった (デフォルトで BigQuery コネクタが入っていない)
- 対応:jar を指定してジョブ送信することで BigQuery からのデータ読込に失敗しないようになった
問題
BigQuery からデータを読み込んで処理する PySpark ジョブを一昨年ごろこちらのドキュメント 等を参考に作った1のですが、それが最近失敗するようになりました。
ジョブのエラーログを見てみると、下記の部分で
table_data = spark.sparkContext.newAPIHadoopRDD(
"com.google.cloud.hadoop.io.bigquery.JsonTextBigQueryInputFormat",
"org.apache.hadoop.io.LongWritable",
"com.google.gson.JsonObject",
conf=conf)
下記のエラーが発生していました。
java.lang.ClassNotFoundException: com.google.cloud.hadoop.io.bigquery.JsonTextBigQueryInputFormat
今月中旬に初めてこのエラーが発生したんですが、1つ紛らわしかったのは、その時は再実行したらジョブが成功してしまったんですよね・・。優先度が高くないジョブだったこともあり、その時はそれで「何か Google 側の不調があったのかな?」程度に思って様子見としてしまいました。
原因
Dataproc 1.3 ではデフォルトで BigQuery コネクタが入らないようになったのが原因のようです。
リリースノートによると 2019/1/4 からデフォルトの Dataproc バージョンが 1.3 になっているようです。
Beginning 2019/01/04, Cloud Dataproc 1.3 will be the default version for new clusters.
そして BigQuery コネクタのドキュメントによると、1.3 以降はデフォルトで BigQuery コネクタが入らないようです。
Cloud Dataproc 1.3 以降ではデフォルトで BigQuery コネクタはインストールされないため、次のいずれかの方法で使用する必要があります。
- 初期化アクションを使用して BigQuery コネクタをインストールする
- ジョブを送信するときに、jars パラメータに BigQuery コネクタを指定する
--jars=gs://hadoop-lib/bigquery/bigquery-connector-hadoop2-latest.jar- アプリケーションの jar-with-dependencies に BigQuery コネクタのクラスを含める
対応
今回は上記で引用した対応方法の 2 で対応しました。
Python クライアント経由でジョブを作成していたので、ジョブに送信する body に下記のような感じで jarFileUris を指定することで問題が発生しないようになりました。
body = {
'projectId': 'hogehoge',
'job': {
'placement': {
'clusterName': 'fugafuga'
},
'pysparkJob': {
'mainPythonFileUri': 'piyopiyo',
'jarFileUris': [
'gs://hadoop-lib/bigquery/bigquery-connector-hadoop2-latest.jar'
]
}
}
}
終わりに
この記事では Dataproc の PySpark ジョブで BigQuery からのデータ読込に失敗する事象の原因と対処についてまとめました。一つの事例として少しでもどこかの誰かの参考になればいいなと思います。
ちなみに利用するイメージのバージョンの固定とか、バージョンアップへの追従とかもちゃんと考えないとなぁとは思いました。
-
ちなみに記事を書くにあたって改めてドキュメントを読んだら、ちゃんと今回の事象に関連する記述が追記されてましたね。事前準備の項目に「Cloud Dataproc バージョン 1.3 以降(サポートされている Cloud Dataproc バージョンを参照)を使用している場合は、BigQuery コネクタをインストールします。」と記載されています。 ↩