BigQueryにデータをインポートする際はBigQuery Streamingを利用するfluentd-plugin-bigqueryがとてもとても便利ですが、BigQuery Streamingは来年から有料になります。
ストレージの課金が容量(GB)単位なのに対してBigQuery StreamingはInsertされた行数(0.01$/10万行)単位で課金されるようになるのでデータの流量が多いサービスを運営している場合はその費用が気になるところです。
なのでfluentd-plugin-bigqueryと比べると自動化するのが少々面倒ですが、BigQueryにデータをバッチでインポートする方法を考えてみます。
BigQueryにデータをインポートする
例えばFluentdで集約したアクセスログを1時間毎に区切ってgzip圧縮して保存したファイルをBigQueryにインポートするとして、
<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のテーブルスキーマはこんな感じにしておきます。
[
{
"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に放り込んでからやると高速でよい