Help us understand the problem. What is going on with this article?

Dataproc で BigQuery からのデータ読込に失敗する事象への対応

More than 1 year has passed since last update.

概要

以前動いていた Dataproc の PySpark ジョブが失敗する事象が今月中旬から発生していたので対応しました。似たような事象に合ってる人もいるかもしれないなと思ったので簡単にまとめておきます。

内容は下記の通りです。

  1. 問題:2019年1月中旬から Dataproc の PySpark ジョブが BigQuery からのデータ読込の部分で失敗するようになっていた
  2. 原因:Dataproc のデフォルトのイメージバージョンが 1.3 に変わった (デフォルトで BigQuery コネクタが入っていない)
  3. 対応: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 コネクタはインストールされないため、次のいずれかの方法で使用する必要があります。
1. 初期化アクションを使用して BigQuery コネクタをインストールする
2. ジョブを送信するときに、jars パラメータに BigQuery コネクタを指定する
--jars=gs://hadoop-lib/bigquery/bigquery-connector-hadoop2-latest.jar
3. アプリケーションの 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 の API ドキュメント

終わりに

この記事では Dataproc の PySpark ジョブで BigQuery からのデータ読込に失敗する事象の原因と対処についてまとめました。一つの事例として少しでもどこかの誰かの参考になればいいなと思います。
ちなみに利用するイメージのバージョンの固定とか、バージョンアップへの追従とかもちゃんと考えないとなぁとは思いました。


  1. ちなみに記事を書くにあたって改めてドキュメントを読んだら、ちゃんと今回の事象に関連する記述が追記されてましたね。事前準備の項目に「Cloud Dataproc バージョン 1.3 以降(サポートされている Cloud Dataproc バージョンを参照)を使用している場合は、BigQuery コネクタをインストールします。」と記載されています。 

nana-music
音楽SNSサービス「nana」の開発・運営を行っているスタートアップ
https://nana-music.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした