Edited at

EmbulkでMySQLのデータをBigQueryにロードするのに便利なツール

More than 3 years have passed since last update.

はてなブログで書いた記事のQiita版です。

Qiitaでは比較的にEmbulk、BigQuery関連の投稿を見かけるので参考になればと思います。

Samidareを作成した経緯などは以下のリンク先を参照ください。ここでは機能・メリットと利用方法について記します。

EmbulkでMySQLのデータをBigQueryにロードするのに便利なツールの開発


Samidareの仕様・機能


  • Ruby製でgemとして提供されています

  • YAMLでMySQLのDB接続設定と対象テーブルを列挙するだけで実行できる

  • MySQLのテーブルスキーマを基にEmbulkの設定、BigQueryのテーブルスキーマを生成してくれる

  • 生成した設定をまとめて実行する(任意のテーブルのみ実行することも可能)

  • 実行時にBigQueryにテーブルを作成する(事前に作成する必要がない)

  • BigQueryへのロードの落とし穴を解決(tinyint変換、タイムゾーン問題)

細部の仕様、実行オプションなどは Samidare を参照ください。


事前準備

以下のEmbulkプラグインのインストールが必要です。

embulk gem install embulk-input-mysql

embulk gem install embulk-output-bigquery
embulk gem install embulk-parser-jsonl
embulk gem install embulk-formatter-jsonl


MySQLのDB接続設定(database.yml)

database.yml にMySQLのDB接続設定を記述します。

DB毎に任意の定義名を設定してください。以下のサンプルでは定義名として db01 を設定しています。

db01:

host: localhost
username: root
password: pswd
database: production
bq_dataset: mysql_db01


ロード対象テーブルの設定(table.yml)

database.yml のDB定義名毎に対象テーブルを table.yml に設定します。

table.yml を変更したら、必ず generate_config を実行してEmbulkの設定、BigQueryのテーブルスキーマを再作成してください。

db01:

tables:
- name: users
- name: events
- name: hobbies


Samidareの実行

以下は Ruby のサンプルコードです。BigQueryの接続設定と設定の出力先をハッシュにして引数にしてください。 generate_configdatabase.ymltable.yml に変更がなければ実行する必要はありません。

require 'samidare'

bq_config = {
'project_id' => 'BIGQUERY_PROJECT_ID',
'service_email' => 'SERVICE_ACCOUNT_EMAIL',
'key' => '/etc/embulk/bigquery.p12',
'schema_dir' => '/var/tmp/embulk/schema',
'config_dir' => '/var/tmp/embulk/config',
'auth_method' => 'private_key'
}

client = Samidare::EmbulkClient.new
client.generate_config(bq_config) # Embulkの設定・BigQueryのテーブルスキーマの作成
process_status = client.run(bq_config) # Embulkの実行
exit 1 unless process_status