docker-composeを使ってmysqlからbigqueryにデータを送る
About
ECSなどを試す余裕がなかったので一旦、docker-composeを使ってみたという話です。あんまりいいやり方ではないので継続的に使う場合は、エラー処理などを検討したほうが良いです!
やりたかったこと
- mysqlにあるデータをbigqueryにロードしたい
- だれでも簡単に実行できるようにしたい
- ゆくゆくはECSとか使える下準備をしておきたい
- oneshotで実行したい
やり方
基本的にこちらのブログをパクリ参考にさせていただきました。
技術要素
- docker 17.03.1-ce-rc1
- docker-compose 1.1.2
- digdag 0.9.8
- embulk 0.8.18
docker
# Dockerfile FROM java:8 # This file inspired by http://yukiyan.hatenablog.jp/entry/2017/01/23/102411 MAINTAINER tjinjin RUN apt-get update && apt-get upgrade -y && apt-get install -y --no-install-recommends \ jruby RUN curl -o /usr/local/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest" && \ chmod +x /usr/local/bin/digdag && \ curl -o /usr/local/bin/embulk --create-dirs -L "http://dl.embulk.org/embulk-latest.jar" && \ chmod +x /usr/local/bin/embulk && \ apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* && \ adduser --shell /sbin/nologin --disabled-password --gecos "" digdag USER digdag WORKDIR /home/digdag RUN /usr/local/bin/embulk gem install \ embulk-input-mysql \ embulk-output-bigquery
Dockerfile内ではコマンドや設定ファイルを入れず、あくまでインストールのみするようにしています。
# docker-compose.yml version: '2' services: batch: build: . working_dir: /home/digdag/repo command: ["java", "-jar", "/usr/local/bin/digdag", "run", "main.dig"] volumes: - .:/home/digdag/repo
docker-compose.yml内でvolumesとかを使ってホストの設定ファイルを見られる状態にしています。あとはこちらで実行コマンドを指定しています。working_dirを最初/home/diddag
にしていたのですが、そうすると~/.embulk
以下が見えなくなってしまって、pluginが見つからないという状態でハマっておりました。。。
digdag
最初は設定をinclude
とかしていたのですがめっちゃハマったので今の形に落ち着きました。小さく始めるの大事。
# main.dig timezone: UTC _export: host: 'localhost' user: 'test' password: 'password' project_id: 'test' dataset: 'tjinjin_test' database: 'employees' +load: for_each>: table: [ employees ] _do: embulk>: tasks/embulk/mysql_to_bigquery.yml
embulk
embulkの設定はまんまです。秘匿情報はdigdagのsecret機能とか作って隠したほうがよさそう。
# tasks/embulk/mysql_to_bigquery.yml in: type: mysql host: ${host} user: ${user} password: '${password}' database: ${database} table: ${table} out: type: bigquery mode: replace auth_method: json_key json_keyfile: content: | { "private_key_id": "hoge", "private_key": "-----BEGIN PRIVATE KEY-----\nhogehoge\n-----END PRIVATE KEY-----\n", "client_email": "hogehoge@exmple.com" } project: ${project_id} dataset: ${dataset} auto_create_table: true table: ${table}_${session_date_compact} allow_quoted_newlines: true
まとめ
早くECSとかに行きたい。
とりあえず動かすならdockerが入っているインスタンスを作って、そこでdocker-compose up
させれば動くので、ジョブのキックをどこかでやれば定期実行もできそう。ただ失敗したときのリトライとかログの確認とかどうしようというイマイチな感じでした。