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

embulk-output-bigqueryプラグインでBQの4GB制限に引っ掛かる場合の対処方法

TL;DR

以下、いずれかで対処する:

  1. BigQueryに読み込むファイル形式を非圧縮形式にする。これで5TBまで行ける
  2. 1ファイルあたり4GB以下になるように、ファイルの分割数を上げる

背景

BigQueryにCSV, JSONデータを読み込む際、最大ファイルサイズに関して以下の制限がある:

  • 圧縮形式 ... 4GBまで
  • 非圧縮形式 ... 5TBまで

参照: https://cloud.google.com/bigquery/quotas?hl=ja#load_jobs

この制限を越えると下のようなエラーが出る:

2020-07-07 07:28:13.136 +0000 [ERROR] (Ruby-1-Thread-2: /root/.embulk/lib/gems/gems/embulk
-output-bigquery-0.6.4/lib/embulk/output/bigquery/bigquery_client.rb:152): embulk-output-b
igquery: failed during waiting a Load job, get_job(monotaro-etl-staging, embulk_load_job_7
d68ce22-a9e5-4799-8f5c-f331eab4277e), errors:[{:reason=>"invalid", :message=>"Error while 
reading data, error message: The options set for reading CSV prevent BigQuery from splitti
ng files to read in parallel, and at least one of the files is larger than the maximum all
owed size when files cannot be split. Size is: 5077619708. Max allowed size is: 4294967296
."}]

※↑画面に収まるように改行しているが、実際には1行のエラー

embulk-output-bigqueryプラグインでは、2015年4月からファイルサイズが4GB以下になるように分割する対応をするイシューが積まれている。1
…が、BQ側で非圧縮時の制限が大きく引き上げられたので、今後も対応される可能性は低いのではないだろうか。

ネットで検索して見つかるembulk-output-bigqueryプラグインの利用例だと、圧縮ファイル形式を使っているものが多い気がするので、初心者はハマりやすいと思う。(私もハマった。)

動作確認環境

  • Embulk v0.10.5
  • embulk-output-bigquery v0.6.4

対処法

BigQueryに読み込むファイル形式を非圧縮形式にする

例えば以下のように設定する:

out:
  type: bigquery
  mode: replace
  auth_method: service_account
  json_keyfile: example/your-project-000.json
  dataset: your_dataset_name
  table: your_table_name
  source_format: CSV # or NEWLINE_DELIMITED_JSON
  auto_create_dataset: true
  auto_create_table: true
  schema_file: example/schema.json

NOTE:

  • compression オプション値はデフォルトで "NONE" (非圧縮)である

1ファイルあたり4GB以下になるように、ファイルの分割数を上げる

これはEmbulkのLocal Executorプラグインのオプションで設定できる。

例:

exec:
  max_threads: 10
  min_output_tasks: 10

この設定で、ファイルを10分割してBQに送信することができた。
たぶん、分割数については min_output_tasks の設定だけでいいのだと思う。

まとめ

embulk-output-bigqueryプラグイン利用時に、BigQueryの4GBファイルサイズ制限に引っ掛かる場合の対処方法について述べた。

1番めに挙げた方法の方が汎用的だと思うが、データの転送量をなるべく抑えたいとか、ローカルのストレージの消費を抑えたいという場合には、2番めの方法がよいのではないだろうか。

以上。

脚注

progrhyme
Software Engineer. Was @key-amb
https://progrhy.me/
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