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

Embulkを利用してMySQLのデータをBigQueryにロードする際に便利なツールを開発したので紹介です。


Samidareっていいます! よろしくお願いします。Embulkの設定作成はお任せください!」

開発経緯

業務でログデータの解析基盤としてBigQueryを使用することになったのですが、本番環境のMySQLのデータもBigQueryで参照できるようにすると色々と夢が膨らむという事に気付きました。
Embulkを利用すると簡単にMySQLのデータをBigQueryにロードできるという情報を入手したので検証したところ、確かにこれは楽チンだという結論に至りました。ただ、問題点としてテーブルの数だけEmbulkの設定ファイルを作成し、テーブル毎にEmbulkを実行しなければならないという点です。
当初でもBigQueryにロードしたいテーブル数は20以上あり、今後対象のテーブルが増えることは容易に想像がつきました。対象テーブルが増える毎にEmbulkの設定作成、BigQueryにテーブル追加、実行設定修正という事態は避けたいところです。
そこでEmbulkの設定作成、BigQueryのスキーマ作成、Embulk実行を容易にするようなツールを作成できないか検討することになりました。

仕様・機能・特長

  • Ruby製でGemとして提供、利用できます(Java経験が長いのでRubyとしては微妙なコード)
  • MySQLのテーブルスキーマを基にEmbulk用のSQL、BigQueryのテーブルスキーマを生成してくれる
  • 設定ファイルはYAMLMySQLのDB接続設定と対象テーブルを列挙するだけ
  • 生成した設定でEmbulkを実行する
  • tinyintタイムゾーン問題を解決しています
  • テーブル毎に絞込み条件(SQLのWHERE句)を設定できる
  • 実行ステータスを返す(成功時はtrue、エラーがあった場合はfalseが返される)
  • リトライ回数を設定できる



利用方法

詳細な利用方法、機能はGitHubSamidareを参照ください。
ここでは大まかな設定内容と実行方法を紹介します。

・database.ymlの設定

MySQLのDB接続設定としてdatabase.ymlを作成します。対応するBigQueryのデータセットとしてbq_datasetを設定します。

db01:
  host: localhost
  username: root
  password: pswd
  database: production
  bq_dataset: mysql_db01
・table.ymlの設定

MySQLの対象テーブルの定義としてtable.ymlを作成します。対象テーブルを列挙するだけの簡単設定です。

db01:
  tables:
    - name: users
    - name: events
    - name: hobbies
・実行

以下の様なRubyスクリプトを作成して実行します。BigQueryの認証設定とSamidareが作成する設定ファイルの出力ディレクトリを指定します。

require 'samidare'

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(config)
client.run(config)


今後の予定

当初予定した機能は実装しきったのでJava版のSuzukazeなどを作成しようかと思案しております。