このエントリは MySQL Casual Advent Calendar 2014 の1日目として書かれた記事であり、同時に Google Cloud Platform Advent Calendar 2014 の17日目として書かれた記事でもあります。
このエントリは MySQL と BigQuery を組み合わせて使う際に誰しも思うであろうことをどう解決するかという一手について書いたものです。
MySQL について
もはや説明不要の RDBMS ですね。これを読まれている方の中でも多くの人が使っているのではないでしょうか。
MySQL Casual Advent Calendar 2014 はまだまだ執筆者を募集しておりますので、ふるってご参加ください。
BigQuery について
こちらも説明は要らないかと思いますが、BigQuery は小さいデータ(メガバイト程度)から超巨大なデータ(ペタバイト級)まで、SQL ライクなクエリを用いて短時間で解析できる SaaS 型データストアサービスです。
fluent-plugin-bigquery を用いれば、発生したデータを逐次 BigQuery にインポートし、すぐにクエリで解析をかけることもできます。
データを入れておくだけなら S3 よりも安いので、用途によっては BigQuery をプライマリデータストアにしてしまうのもアリではと思います。
Google BigQuery - Fully Managed Big Data Analytics Service — Google Cloud Platform
BigQuery の用途と課題
BigQuery は追記のみ対応で、DELETE や UPDATE をすることができません。
ログをずっと貯めこむだけならそれで全く問題ないのですが、サービスの運用ではログテーブルとマスタ系テーブルを JOIN したいという要求が往々にして存在します。
なので、単純に追記することしかできない BigQuery ではマスタ系テーブルに対する操作を単に流し続けるということができません。
これに対してひとつの手として、定期的にマスタテーブルを BigQuery にインポートする方法が考えられます。
が、それを各所で個別に実装するのはなんか手間もかかるし、ちょっと面倒かなと思います。
そこで App::BigQuery::Importer::MySQL というツールを作りました。
App::BigQuery::Importer::MySQL
App::BigQuery::Importer::MySQL は Perl で書かれたモジュールですが、CLI を同梱しているのでどなたでもカジュアルにご利用いただけます。
既に CPAN で公開していますので gcloud と MySQL のクライアントライブラリがインストールされており、必要な設定が済んでいれば
cpan App::BigQuery::Importer::MySQL
もしくは
cpanm App::BigQuery::Importer::MySQL
というコマンドで導入でき、インストールが完了すると "mysqlbq" という cli が利用可能になります。
使い方はとても簡単で、下記コマンドを叩くのみです。
mysqlbq --db_host=mysql-host.localdomain --src=mysql_table --dst=bigquery_table
--dryrun オプションをつければ、GCSやBigQueryに対する操作は行われないようになっています。
動作確認は gsutil 4.6 と MySQL 5.6.19 で行っていますが、特殊なことはやっていないので他のバージョンでも動作するかと思います。
このツールは下記のような動作で MySQL のテーブルを BigQuery にインポートします。
- 対象テーブルのスキーマ情報を取得し、BigQuery の型に変換した json ファイルを一時ファイルとして作成する
- 一時データ置き場として Google Cloud Storage(GCS) に bucket を作成
- 対象テーブルのデータを dump して bucket にアップロード
- BigQuery の対象テーブルがあれば削除して新たにテーブルを作り、GCS から dump したデータをロード
- dump データと bucket を削除してクリンナップ
このような手法で問題解決できそうだという方は、是非お使いください。
おわりに
App::BigQuery::Importer::MySQL はお手軽に MySQL から BigQuery へテーブルを同期できるツールです。
ログ系テーブルに対する集計にマスタデータを JOIN したいという方にお勧めです。
お使いいただく中で不具合を見つけられたり、機能要望などがありましたら github リポジトリのほうまで issue / pull reuqest をいただければと思います。