2021.05.19 コラム
- Docker
- Embulk
- ETL
- テックコラム
【テックコラム】Embulk on Docker でデータ転送基盤を簡単構築!
●はじめに
こんにちは。テクノロジー本部の奥村です。
昨今、データの有効活用が叫ばれている中、様々な環境(オンプレサーバ、S3、GCS、TD等)からデータを転送する機会が多くなっているかと思います。
方法としてはCLIやpythonや各種SDKを使ってプログラムを書いたり、手動で実行したり、SaaSを使用したりと状況に応じて様々な方法があるかと思います。
今回はエンジニアの方向けに、より簡単にデータ転送基盤を構築する方法を書いてみました。内容としてはDocker上にEmbulk実行環境を構築するというものです。
●Embulkとは?
Embulkは、さまざまなストレージ、データベース、NoSQL、クラウドサービス間のデータ転送を支援する並列バルクデータローダーです。
Embulkは、機能を追加するためのプラグインをサポートしています。プラグインを共有して、カスタムスクリプトを読みやすく、保守しやすく、再利用できるようにすることができます。
参考:https://github.com/embulk/embulk
●大まかな手順
大まかな手順は下記のとおりです。
- docker環境を用意
- 必要なファイルを設置
- dockerコンテナ起動&実行
・docker環境を用意
docker公式サイト等を参考にdockerがインストールされた環境を用意します。
GCPであればインスタンスのイメージでContainer-Optimized OSを選ぶとデフォルトでインストールされています。
・必要なファイルを設置
今回は試しにローカルにあるCSVファイルをTreasure Dataにインポートする処理を実行したいと思います。
必要なファイルは下記の4つです。
- Dockerfile
- 環境変数ファイル(.env.test)
- EmbulkのConfigファイル(load.yml.liquid)
- サンプルデータのCSV(sample.csv)
ディレクトリ構成は下記になります。
~/test_embulk/
-Dockerfile
-.env.test
-load.yml.liquid
-data/
-sample.csv
Dockerfile
FROM openjdk:8-slim
ENV LANG=C.UTF-8 \
PATH_TO_EMBULK=/opt/embulk \
PATH=${PATH}:/opt/embulk
# Change timezone
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN apt-get update && apt-get install -y curl vim
# Embulk install
RUN mkdir -p ${PATH_TO_EMBULK} \
&& curl --create-dirs -o ${PATH_TO_EMBULK}/embulk -L "https://dl.embulk.org/embulk-0.9.23.jar" \
&& chmod +x ${PATH_TO_EMBULK}/embulk
RUN embulk gem install embulk-output-td
WORKDIR /app
COPY ./load.yml.liquid ./
CMD [ "bash" ]
RUN embulk gem install embulk-output-td
で必要なプラグインをインストールしています。今回はアウトプットがTDであるため embulk-output-td をインストールしています。目的に応じて各種プラグインをインストールしてください。
COPY ~
の箇所で使用するファイルをコンテナイメージ内にコピーします。
今回はEmbulk用のconfig(load.yml.liquid)です。
.env.test
IN_COLUMNS=[{name: id, type: string}, {name: group_id, type: string}, {name: text, type: string}]
IN_FILE_PATH=/app/data/sample.csv
TD_API_KEY=”TDのAPI keyを記載”
TD_DB=test_embulk_db
TD_TABLE=test_embulk_table
コンテナ起動時に読み込む環境変数のファイルです。コンテナイメージの使いまわしができるように、インプット、アウトプット情報やデータのカラム情報はここに記載します。
load.yml.liquid
in:
type: file
path_prefix: {{env.IN_FILE_PATH}}
parser:
charset: UTF-8
newline: LF
type: csv
delimiter: "\t"
quote: '"'
escape: '"'
trim_if_not_quoted: false
skip_header_lines: 0
allow_extra_columns: false
allow_optional_columns: false
columns: {{env.IN_COLUMNS}}
out:
type: td
apikey: {{env.TD_API_KEY}}
endpoint: api.treasuredata.com
database: {{env.TD_DB}}
table: {{env.TD_TABLE}}
auto_create_table: true
stop_on_invalid_record: 0
mode: append
embulkのconfigファイルです。使用するプラグインによって記載する項目が変わります。インプット元やアウトプット先、API KEYなどは環境変数から読み込むようにしています。
sample.csv
A-000001 11359,11174,11064,11013 TEST_3
A-000002 11661,11787,11286 TEST_2
A-000003 11052,11018,11076,11354,11004 TEST_5
CSVとありますが今回のサンプルはタブ区切りにしています。 load.yml.liquid でdelimiterが指定できるのでそこに記載します。
・docker コンテナ起動&実行
dockerイメージを作成
docker image build -t test-embulk-local2td .
dockerコンテナ起動
docker container run -it --env-file .env.test -v ~/test_embulk/data:/app/data test-embulk-local2td bash
embulk実行
embulk run load.yml.liquid
以上で完成です。同じようなデータ転送であれば環境変数ファイルを修正することで同じコンテナを使いまわすことできます。インストールするプラグインを変えることで様々なデータ転送が可能となります。
dockerで気軽に構築することができるのでぜひ試してみてください!
本データに関するお問い合わせは下記にて承ります。
株式会社DataCurrent
info@datacurrent.co.jp