LoginSignup
21
17

More than 5 years have passed since last update.

MySQLからEmbulkを使用してGoogleBigQueryへデータをロードする

Last updated at Posted at 2016-03-25

ユースケース

RDBへ書き込んでいたログデータをBigQueryのようなDWHに取り込みたい時に
簡単にバルクインサートしてくれます。
(もちろんRDBとBigQueryだけの関係でもありませんが)

特にログデータとは限らないのですが、時間とユーザーさんの数が増えるごとに「永遠に増え続けるデータ」をRDBへ書き込んでいた。
そのまま時間が経ってしまい「単一のTBLのレコード数が数千万になってしまった」
時に利用すると良いと思います。

「最初からFluentdで送っておけば良いじゃない」というのはごもっともですが。

Embulkを使わない方法

mysqldump -> csv -> gcs(awsのs3のような物) -> Big queryヘロード
が妥当かと思います。実際やってみましたが簡単です。

が、一回きりのロードであればこれでもいいのですが
「定期的に取り込みたい」
「バルクロードでちゃんと進捗が見たい」
「あのTBLもこのTBLも取り込みたい」

となるともう少し「設定」っぽいやり方がしたくなります。
そこでEmbulkを利用することにしました。

Embulkとは

本家が綺麗に図解されています。
Fluentdで最初っから送っておけばこんな思いしなくていいのに。
というのがとても感じられます。
https://github.com/embulk/embulk

EmbulkがMySQLからデータを引っ張り出してきてくれて、
一時ファイルに保存してBigQueryにデータをロードしてくれます。

前提

GCP, BigQueryのセットアップは済んでいること
http://heartbeats.jp/hbblog/2014/06/google-bigquery.html
参考になります。

環境

Amazon Linux AMI
MySQL5.6
embulk 0.8.8

補足

会社で利用しようとするとクレジットカード登録だったり、すでに有るGoogleAppsとの兼ね合いだったりで何やかんやと面倒な事が多いです。早めに動く事とそれなりに気長に考える事も重要。

Embulkのインストール

インストール(本家のコピペ)

curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"
chmod +x ~/.embulk/bin/embulk
echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

プラグインのインストール

embulk gem install embulk-input-mysql
embulk gem install embulk-output-bigquery

動かしてみる

必要なファイルは2つだけ。

  • MySQLのTBL毎にymlファイル
  • BigQueryのTBL毎にjsonファイル

IN

  • MySQL
    • Database -> hoge
    • Table -> users

OUT

  • BigQuery
    • Dataset -> foo
    • Table -> users

作成ファイル

  • users.yml
  • users.json

users.yml(mysqlへの接続情報、取得設定、BigQueryへの接続情報、フォーマットを記述)

in:
  type: mysql
  host: HOST_NAME
  user: ********
  password: ********
  database: hoge
  table: users
  select: id,user_name, created, modified
out:
  type: bigquery
  auth_method: json_key
  json_keyfile: # jsonのクレデンシャルファイル
  path_prefix: /tmp # 一時ファイル作成場所
  file_ext: .csv.gz
  source_format: CSV
  project: BigQuery側のProject
  dataset: foo
  auto_create_table: true # 自動でTBL生成
  table: users
  schema_file: users.json
  formatter: {type: csv, charset: UTF-8, delimiter: ',', header_line: false}
  encoders:
  - {type: gzip}

users.json(BigQueryのスキーマ情報を記述)

[
  {
    "name": "id",
    "type": "INTEGER"
  },
  {
    "name": "user_name",
    "type": "STRING"
  },
  {
    "name": "created",
    "type": "TIMESTAMP"
  },
  {
    "name": "modified",
    "type": "TIMESTAMP"
  }
]

実行

embulk run users.yml

input(mysql)とoutput(big query)の設定オプション

outputを見ることが多いとおもう

crondのようなバッチで定期的にTBLを作り変える

GoogleBigQueryは行の削除や更新は想定されていないように見受けられるので、
最新のデータを毎回ロードしてやるのがいいと思う。

GoogleBigQuery標準のコマンドでTBLを毎回削除して、
毎回作り直す。

# TBLを削除(引数はdataset.table名)
bq rm -f foo.users 
# データをロード
embulk run users.yml

これをcrondに仕込んでおく。

参考

21
17
2

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
21
17