tjinjin's blog

インフラ要素多めの個人メモ

docker-composeを使ってmysqlからbigqueryにデータを送る

About

ECSなどを試す余裕がなかったので一旦、docker-composeを使ってみたという話です。あんまりいいやり方ではないので継続的に使う場合は、エラー処理などを検討したほうが良いです!

やりたかったこと

  • mysqlにあるデータをbigqueryにロードしたい
  • だれでも簡単に実行できるようにしたい
  • ゆくゆくはECSとか使える下準備をしておきたい
  • oneshotで実行したい

やり方

基本的にこちらのブログをパクリ参考にさせていただきました。

yukiyan.hatenablog.jp

技術要素

  • 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させれば動くので、ジョブのキックをどこかでやれば定期実行もできそう。ただ失敗したときのリトライとかログの確認とかどうしようというイマイチな感じでした。

参考