settings

MySQLからBigQueryにembulkで定期的にデータを送る

embulk-mysql-bigquery

直近embulkを使って、cloudSQLからBigQueryにデータ移送したのでので、セットアップから実際に動かすところまで整理します。

embulkとは

「embulk」の画像検索結果

embulkとは、データ転送ツールです。

今回、利用した目的は、cloudSQLからBigQueryにデータを転送したいというものでした。

embulkを選ぶ理由

embulkを採用した理由は、

cloudSQLからBigQuery定期的にデータを移送したい

1回だけとか、毎月1回というレベルであればデータ移送を手動でやることも考えられるのですが、毎日全テーブルを移送したいということだったので、バッチ実行できるツールを選びました。

また、既存の処理がrails taskでbashを動かしいたのですが、移送がうまくいってなかったり、bashを書くのが辛くなっていたため、もっと手軽にできるものがembulkでした。

GCPのサービスでやりたかったけど、なかった

cloudSQLもBigQueryもGCPのサービスなので一見簡単にデータ移送ができそうです。

私もGCPのサービスを使えば簡単に実現できると考えていたのですが、

そんなことはなくGCPに詳しい方に聞いてもやるならembulkだねって感じでした。

 

embulkの実行環境構築

今回の環境

OS:Debian GNU/Linux 8 \n \l

 

Java1.8インストール

embulkは、java1.8系以上でないと動作しないため、インストールします。

centOSやMacOSでやる方は、インストール方法を各自で確認を願いします。

sudo apt install -t jessie-backports openjdk-8-jdk

Java1.8のインストールできたか確認

java -version

結果が以下のようになってればOKです。

openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-1~bpo8+1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

これで、embulkをインストールする準備ができました。

embulkのインストール

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のプラグインを追加

embulkには、データのinとoutに合わせたプラグインが用意されています。

今回は、cloudSQL(Mysql)とBigQuery用のプラグインをインストールします。

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

`

REQUIREDの扱いが難しい

idなど、MySQL上で必須項目にしているカラムもBigQueryに移送時にうまくいかないことがあるそうです。

他にも数値と文字列がごっちゃになったり、型変換がうまくいかないためエラーになります。

その場合は、BigQueryのスキーマをnullableにするなど回避しましょう。

Error: org.jruby.exceptions.RaiseException: (Error) failed during waiting a Copy job, get_job(<各自のプロジェクト名>, embulk_copy_job_33c828c0-1f68-4a19-9f2b-a8e1302f0b81), errors:[{:reason=>"invalid", :message=>"Provided Schema does not match Table<各自のプロジェクト名>:test_for_embulk.user_data. Field user_id has changed mode from REQUIRED to NULLABLE."}]

 

ABOUT ME
ロッピー
コンサルタントから2018年にエンジニアに転向。年収400万円のサラリーマンエンジニアから、半年で月収100万円を稼ぐエンジニアになった。 Python、Golangなど単価の高い言語を得意とする。