2020/06/03

Apache Airflowでembulkを実行してみた

pythonairflowbigquerymysql

概要

Airflowをプロジェクトに導入する予定ができてきました。

何ができそうか・できなそうかの確認がてらAirflowに入門してみました。

(Airflowの入門プラスアルファレベルです。)

やったことは、ローカルマシンのdocker-compose上で、airflowを動かし、embulkを動かして、
mysqlのデータをbigqueryにエクスポートしました。

詳細

Dockerfileを作成

"puckel/docker-airflow:1.10.9"というdocker imageを活用しました。
ただ、こちらのimageにはembulkはインストールされていないので、インストールする必要がありました。

なので、以下のDockerfileを作って、対応しました。

# see https://github.com/puckel/docker-airflow/blob/master/Dockerfile for more detail
FROM puckel/docker-airflow:1.10.9
LABEL maintainer="Hiroki Tanaka"

# install java
#   see https://github.com/embulk/embulk#linux--mac--bsd
#   Embulk is a Java application. Please make sure that Java SE Runtime Environment (JRE) is installed.
#   Embulk v0.8 series runs on Java 7, and Embulk v0.9 series runs on Java 8. Java 9 is not supported in any version for the time being.
# the actual step to install java is inspired by the following article
#   https://stackoverflow.com/questions/57031649/how-to-install-openjdk-8-jdk-on-debian-10-buster
#   https://qiita.com/witchcraze/items/47d44df81f1b152bab8c
USER root
RUN apt-get update && \
    apt-get -y upgrade && \
    apt-get install -y wget software-properties-common gnupg
RUN wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add - && \
    add-apt-repository -y https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ && \
    apt-get -y update && \
    mkdir -p /usr/share/man/man1/ && \
    apt-get install -y adoptopenjdk-8-hotspot

USER airflow
# install embulk. see https://github.com/embulk/embulk
RUN curl --create-dirs -o ${AIRFLOW_HOME}/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar" && \
    chmod +x ${AIRFLOW_HOME}/.embulk/bin/embulk
ENV PATH=${PATH}:${AIRFLOW_HOME}/.embulk/bin
# install embulk plugin.
RUN embulk gem install embulk-input-mysql embulk-output-bigquery

USER airflow
WORKDIR ${AIRFLOW_HOME}
ENTRYPOINT ["/entrypoint.sh"]
CMD ["webserver"]

ポイントとしては、以下です。

  • embulkはJava 8が必要なので、インストールしました。(結構骨が折れました)
  • embulkのpluginも必要なので、embulk-input-mysql embulk-output-bigqueryをそれぞれインストールしました

gcpのサービスアカウントの作成

  • Big QueryのDataSetを作成しました
  • サービスアカウントを作成して、適切な権限を振りました
  • サービスアカウントのkeyファイルをダウンロードしておき、docker-composeでmountできるようにしておきました

docker-composeを作成

基本的には、こちらのファイルに
エクスポートしたい、mysqlのデータとコンテナを追加して起動しました。

dagを作成

あとは簡単で、bash operatorを使って、 "embulk run"を呼び出すだけです

embulk_operation = BashOperator(
    task_id="embulk_users",
    bash_command="embulk run /usr/local/airflow/embulk/users.yml.liquid",
    dag=dag,
)

以上です。