embulkのチュートリアル程度やってみたメモ

embulkとは

  • Fluentdのコミッターの古橋さんが作成されているfluentdのバッチ版のようなソフトウェアらしいです

github

github.com

参考サイト

qiita.com

なぜembulk

  • ETL処理を行いたいというニーズがあり、そのETLの手段としてembulkにたどり着きました
    • クラッチでETL処理を書く前に、単なるETLならembulk試してみたら?というようなサイト見つけて。

所感

  • pluginの開発が盛んで、例えばcsvファイルをRDBに入れたい程度なら一瞬で対応できます
  • 当然ながら、embulk(ETLバッチ処理)を動かすためのPCが必要(コンテナにしてしまえばECRとかで実行できそう)

使い方メモ

インストール(Java)

  • EC2 Amazon Linux2へのインストール
$ sudo yum install -y java-1.8.0-openjdk-devel.x86_64
$ sudo alternatives --config java

1 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-1.amzn2.0.1.x86_64/jre/bin/java)

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:1
$ java -version
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)

インストール(embulk本体)

公式を参考にインストール(コンテナにしてもいいと思いますが、今回はEC2に直接入れました)

公式の手順はホームディレクトリの.embulkディレクトリにbinも入れる手順です
なんか気持ち悪い方は/usr/lcoal/binとかに移動すればいいかなと。

$ curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
$ chmod +x ~/.embulk/bin/embulk
$ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

www.embulk.org

実際のETL処理

こちらのQiitaを参考に実施(S3からRDBにETLする処理)
qiita.com 上記のサイトとまったく同じことをやったので、内容については上記Qiita参照

embulk用yaml

例えば以下のようなyamlになります

in:
  type: s3
  bucket: bucket-name
  path_prefix: 20201115
  region: us-east-1
  access_key_id: id
  secret_access_key: key
out:
  type: postgresql
  host: rds-endpoint
  user: etl_user
  password: secretsecret
  database: etl
  table: target
  mode: insert

実行

  • guess
    • yamlの内容からembulkが構造を解析して詳細なyamlを作ってくれる機能
$ embulk guess ./sample.yml -o ./output.yml
  • run
    • yamlの内容を実行する
$ embulk run output.yml

テンプレーティング

上記のようなyamlを記載すれば動くわけですが、
S3のエンドポイントやらRDSのエンドポイントやらを直接記載したくないケースは多いと思います(Githubにプッシュするとか)
そういう場合にliquidテンプレートを作る

用意するファイル

とりあえず2種類用意(末尾は必ずyml.liquidである必要があるようです)
- _env.yml.liquid - こちらに設定を記載します(注入したい環境変数を記載するようなイメージ) - hogehoge.yml.liquid - 上記のenvの内容を注入される側のファイル(ETLの内容そのもの)

_env.yml.liquid
{% assign bucket_name = 'bucket-name' %}
{% assign aws_key_id = 'id' %}
{% assign aws_access_key = 'key' %}
{% assign rdb_endpoint = 'rds-endpoint' %}

このように記載可能です
記載の通りbucket_nameとかをenvファイルから注入できます

hogehoge.yml.liquid
{% include 'env' %} # _envから読み込む設定
in:
  type: s3
  bucket: {{ bucket_name }}
  path_prefix: 20201115
  region: us-east-1
  access_key_id: {{ aws_key_id }}
  secret_access_key: {{ aws_access_key }}
out:
  type: postgresql
  host: {{ rdb_endpoint }}
  user: etl_user
  password: secretsecret
  database: etl
  table: target
  mode: insert
実行
$ embulk guess ./hogehoge.yml.liquid -o ./output.yml
$ embulk run output.yml

digdagとの連携

  • embulkの実行をコントロールするためにdigdagと組み合わせるのが定石のようです

github.com

まとめ

  • プラグインも有志によって豊富にあるようなので、大抵のETLはこれでいけるんだろうなと思います
  • 結構昔からあるようですが、さすがにまだ枯れてはいないのかなという印象
    • バージョンも現状0.9.23のようですし(2020/11/15現在)
  • pluginの開発も自分で開発可能なようなので、ちょっとやってみたいなと思っています(rubyで書く?)
  • digdagと一緒に利用することによって、ワークフローが制御しやすくなるようです
    • 失敗時のリトライ
    • 失敗後に処理をわける、などなど