Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 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に放り込んでからやると高速でよい
cubicdaiya
Tech Lead, Network
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
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