LoginSignup
51

More than 5 years have passed since last update.

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

Posted at

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に放り込んでからやると高速でよい

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51