TL;DR
以下、いずれかで対処する:
- BigQueryに読み込むファイル形式を非圧縮形式にする。これで5TBまで行ける
- 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(my-project, 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番めの方法がよいのではないだろうか。
以上。