準備編
embulkにはJavaが必要です。今回用意していたサーバにはJavaを準備していなかったので下記の手順でJavaを使えるようにしました。
インストール手順
公式ページ(https://www.embulk.org/)のクイックスタートに従って進めていきます。
$curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
まずは最新版のjarファイルをダウンロードします。
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 623 100 623 0 0 1905 0 --:--:-- --:--:-- --:--:-- 8197 100 42.4M 100 42.4M 0 0 18.6M 0 0:00:02 0:00:02 --:--:-- 24.2M
実行中はこんな感じです。数秒で終わります。
$chmod +x ~/.embulk/bin/embulk
続いて実行権限を付与します。コンソール上で動きはありませんが、実行権限が付与されていればOK。
$echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
次に環境変数にembulkを追加します。sourceで読み込むか端末にログインしなおしておきます。
動作確認
$ embulk Embulk v0.9.23 Usage: embulk [-vm-options] <command> [--options] Commands: mkbundle <directory> # create a new plugin bundle environment. bundle [directory] # update a plugin bundle environment. run <config.yml> # run a bulk load transaction. cleanup <config.yml> # cleanup resume state. preview <config.yml> # dry-run the bulk load without output and show preview. guess <partial-config.yml> -o <output.yml> # guess missing parameters to create a complete configuration file. gem <install | list | help> # install a plugin or show installed plugins. new <category> <name> # generates new plugin template migrate <path> # modify plugin code to use the latest Embulk plugin API example [path] # creates an example config file and csv file to try embulk. selfupdate [version] # upgrades embulk to the latest released version or to the specified version.
コマンドを実行してみるとUsageが表示されるようになりました。これでembulkコマンドが有効になっていることを確認できました。
実行例
コマンドが使えるようになったので実際に使ってみようと思います。
公式でサンプルが提供されていたので、何も調べずに実行してみました。
$ embulk example ./try1 2021-09-15 20:23:55.886 +0900: Embulk v0.9.23 Creating ./try1 directory... Creating ./try1/ Creating ./try1/csv/ Creating ./try1/csv/sample_01.csv.gz Creating ./try1/seed.yml Run following subcommands to try embulk: 1. embulk guess ./try1/seed.yml -o config.yml 2. embulk preview config.yml 3. embulk run config.yml
サンプルを実行するのに必要なファイルが設置されたようです。
次の3つのサブコマンドを実行するように指示があります。
- embulk guess
- embulk preview
- embulk run
embulk guess
まずはguessコマンドです。seed.ymlを使ってconfig.ymlというファイルを作るようです。
$ embulk guess ./try1/seed.yml -o config.yml (中略) in: type: file path_prefix: ./try1/csv/sample_ decoders: - {type: gzip} parser: charset: UTF-8 newline: LF type: csv delimiter: ',' quote: '"' escape: '"' null_string: 'NULL' trim_if_not_quoted: false skip_header_lines: 1 allow_extra_columns: false allow_optional_columns: false columns: - {name: id, type: long} - {name: account, type: long} - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'} - {name: purchase, type: timestamp, format: '%Y%m%d'} - {name: comment, type: string} out: {type: stdout} Created 'config.yml' file.
先ほど作られたファイルを元にして、embulkの実行設定ファイル(入力と出力)が作られたようです。
yamlを見ると、inにあるようにcsvディレクトリ以下のsample_で始まるファイルを読み込んでパースし、outにあるように標準出力(stdout)に出力するという設定のように見えますね。
embulk preview
$ embulk preview config.yml (中略) +---------+--------------+-------------------------+-------------------------+----------------------------+ | id:long | account:long | time:timestamp | purchase:timestamp | comment:string | +---------+--------------+-------------------------+-------------------------+----------------------------+ | 1 | 32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC | embulk | | 2 | 14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC | embulk jruby | | 3 | 27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin | | 4 | 11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC | | +---------+--------------+-------------------------+-------------------------+----------------------------+
コマンド名からするにdry-runの動きでしょうか。読み込み元からロードして、出力はせずにプレビューを表示してくれているようです。
embulk run
$ embulk run config.yml (中略) 1,32864,2015-01-27 19:23:49,20150127,embulk 2,14824,2015-01-27 19:01:23,20150127,embulk jruby 3,27559,2015-01-28 02:20:02,20150128,Embulk "csv" parser plugin 4,11270,2015-01-29 11:54:36,20150129, 2021-09-15 20:28:14.944 +0900 [INFO] (0001:transaction): {done: 1 / 1, running: 0} 2021-09-15 20:28:14.947 +0900 [INFO] (main): Committed. 2021-09-15 20:28:14.947 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"./try1/csv/sample_01.csv.gz"},"out":{}}
実際に実行した結果がこちら。
config.ymlの設定にしたがってファイルを読み込み、標準出力に出力されることを確認できました。