コラム

2021.05.19

【テックコラム】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