直近embulkを使って、cloudSQLからBigQueryにデータ移送したのでので、セットアップから実際に動かすところまで整理します。
Contents
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."}]