embulkとは
Fluentd
のコミッターの古橋さんが作成されているfluentdのバッチ版のようなソフトウェアらしいです
github
参考サイト
なぜ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
実際の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
実行
$ 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
と組み合わせるのが定石のようです