Posted at

BigQueryにデータをバッチでインポートする

More than 3 years have passed since last update.

BigQueryにデータをインポートする際はBigQuery Streamingを利用するfluentd-plugin-bigqueryがとてもとても便利ですが、BigQuery Streamingは来年から有料になります。

ストレージの課金が容量(GB)単位なのに対してBigQuery StreamingはInsertされた行数(0.01$/10万行)単位で課金されるようになるのでデータの流量が多いサービスを運営している場合はその費用が気になるところです。

なのでfluentd-plugin-bigqueryと比べると自動化するのが少々面倒ですが、BigQueryにデータをバッチでインポートする方法を考えてみます。


BigQueryにデータをインポートする

例えばFluentdで集約したアクセスログを1時間毎に区切ってgzip圧縮して保存したファイルをBigQueryにインポートするとして、


fluent.conf

<match access_log>

type file
path /var/log/bigquery/access_log
time_slice_format %Y-%m-%dT%H
time_format %Y-%m-%dT%H:%M:%S
time_slice_wait 10m
format json
buffer_chunk_limit 4g
compress gzip
</match>

BigQueryのテーブルスキーマはこんな感じにしておきます。


schema.json

[

{
"name": "time",
"type": "INTEGER"
},
{
"name": "remote_addr",
"type": "STRING"
},
{
"name": "uri",
"type": "STRING"
},
{
"name": "user_agent",
"type": "STRING"
},
{
"name": "referer",
"type": "STRING"
}
]


GCS(Google Cloud Storage)にからBigQueryにデータをインポートする

ローカルにあるデータをそのままBigQueryに流し込むこともできるのですが、非常に時間がかかります(テストで150MBのデータ放り込もうとしたけど30分経っても終わらず)。一方で一旦GCSにインポートしGCSからBigQueryに流し込むとすぐ終わるのでこちらの方法がオススメです。

# GCSのaccess_logバケットにデータを放り込む

gsutil cp /var/log/bigquery/access_log.2014-12-23T09_0.log.gz gs://access_log/

BigQueryにテーブルを作成してGCSに保存したデータをBigQueryに流し込みます。

# テーブル作成

bq mk project_id:dataset.table ./schema.json
# データ投入
bq load --source_format=NEWLINE_DELIMITED_JSON project_id:dataset.table gs://access_log/access_log.2014-12-23T09_0.log.gz ./schema.json


まとめ


  • BigQuery Streamingは来年から有料

  • BigQueryにデータをインポートする際は一旦GCSに放り込んでからやると高速でよい