RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Embulkでかんたんデータ集約

こんにちは、negimixです。

ファイルやデータベースなど、各所に散らばっているデータをデータベースに集約して活用したいなぁと漠然と思っていました。

単純にデータを読み込んで、データベースに登録するプログラムを作ればいいんですが、今回はEmbulkを使ってみたので、Embulkの利用方法を紹介したいと思います。

 

【目次】

Embulkとは

Embulkは、さまざまなストレージ、データベース、NoSQL、クラウドサービス間のデータ転送を支援する並列バルクデータローダーです。
必要に応じてプラグインを利用することで自由に拡張することが可能です。

Embulk環境構築

環境は以下の状態からはじめました。
  • OS
  • Rocky Linux release 8.5
  • Java
  • openjdk version "1.8.0_332"
https://www.embulk.org/
Embulk公式ページの Quick Start をそのまま実行します。
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
0.9.24 がインストールされました。
embulk --version
embulk 0.9.24

サンプル実行

Embulkにはサンプルが付属されているので、すぐに動作確認が行えます。
CSVファイルを読み込み、その結果を画面に出力します。

https://www.embulk.org/
こちらも、Embulk公式ページの Next steps をそのまま実行します。
embulk example ./try1
embulk guess ./try1/seed.yml -o config.yml
embulk preview config.yml
embulk run config.yml

各コマンドでやっている内容は、概ね以下のとおりです。
  • 1行目:サンプルの展開
  • ■展開後
    tree ./try1
    ./try1
    ├── csv
    │   └── sample_01.csv.gz
    └── seed.yml
    
    1 directory, 2 files
    

  • 2行目:seed.ymlを元にconfig.ymlを生成
  • seed.ymlの path_prefix のファイルの中身を参照してconfig.ymlを作成してくれます。

    ■seed.yml
    in:
      type: file
      path_prefix: './try1/csv/sample_'
    out:
      type: stdout
    

    ■config.yml
    ※サンプルではいい感じにconfig.ymlが生成されていますが、実データでは上手く生成されない場合があります。
     例) 参照したファイルに列名が無い場合

     その際は、config.ymlを直接編集する必要があります。
     また、追加で設定が必要な場合も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}
    

  • 3行目:config.ymlを使ってプレビュー表示
  • 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 |                            |
    +---------+--------------+-------------------------+-------------------------+----------------------------+
    ※Embulk自体のログは省略しています。

  • 4行目:config.ymlを使って実行
  • ■実行結果
    ※出力先(out)が stdout になっているので画面に実行結果が出力されます。
    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,
    ※Embulk自体のログは省略しています。

データをデータベースに登録

サンプルでは、CSVファイルを読み込み、その結果を画面に出力しました。
ここでは、結果をデータベースに登録したいと思います。

データベースは、普段利用しているPostgreSQLを利用します。
環境は以下のとおりです。 実施する作業
  1. EmbulkにpostgreSQL出力用プラグインを導入
  2. プラグインは、 embulk-output-postgresql を使います。
    embulk gem install embulk-output-postgresql
    

  3. postgreSQL出力用config.ymlを作成
  4. サンプルで利用したconfig.ymlを利用してpostgreSQL出力用config.ymlを作成します。
    ファイル名は、config_postgresql.ymlにしました。

    出力先(out)の設定をPostgreSQL用に変更しています。

    詳しい設定内容については、embulk-output-postgresqlの README を参照ください。
    https://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-postgresql

    ■config.yml と config_postgresql.ymlの差分
    diff -u config.yml config_postgresql.yml 
    
    --- config.yml
    +++ config_postgresql.yml
    @@ -15,10 +15,19 @@
         skip_header_lines: 1
         allow_extra_columns: false
         allow_optional_columns: false
    +    default_timezone: Asia/Tokyo
         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}
    +out:
    +  type: postgresql
    +  host: localhost
    +  user: postgres
    +  password: {パスワード}
    +  database: embulk
    +  table: embulk_postgresql_sample
    +  default_timezone: Asia/Tokyo
    +  mode: truncate_insert
    
    ※登録時に、timezoneの違いにより、日時がずれるため default_timezone を追加しています。

  5. Embulkを実行
  6. ■Embulk実行前(PostgreSQL)
    embulk=# \d
    リレーションが見つかりませんでした。
    embulk=# 
    

    ■Embulk実行
    embulk run config_postgresql.yml
    

    ■Embulk実行後(PostgreSQL)
    テーブルが作成されています。
    ※事前にテーブルを作成して、データを登録することも可能です。
    embulk=# \d
                         リレーション一覧
     スキーマ |           名前           |        |  所有者  
    ----------+--------------------------+----------+----------
     public   | embulk_postgresql_sample | テーブル | postgres
    (1 )
    embulk=# 
    
    embulk=# \d embulk_postgresql_sample
                      テーブル"public.embulk_postgresql_sample"
            |                        | 照合順序 | Null 値を許容 | デフォルト 
    ----------+--------------------------+----------+---------------+------------
     id       | bigint                   |          |               | 
     account  | bigint                   |          |               | 
     time     | timestamp with time zone |          |               | 
     purchase | timestamp with time zone |          |               | 
     comment  | text                     |          |               | 
    embulk=# 
    

    データも登録されています。
    embulk=# select * from embulk_postgresql_sample;
     id | account |          time          |        purchase        |          comment           
    ----+---------+------------------------+------------------------+----------------------------
      1 |   32864 | 2015-01-27 19:23:49+09 | 2015-01-27 00:00:00+09 | embulk
      2 |   14824 | 2015-01-27 19:01:23+09 | 2015-01-27 00:00:00+09 | embulk jruby
      3 |   27559 | 2015-01-28 02:20:02+09 | 2015-01-28 00:00:00+09 | Embulk "csv" parser plugin
      4 |   11270 | 2015-01-29 11:54:36+09 | 2015-01-29 00:00:00+09 | 
    (4 )
    embulk=# 
    

まとめ

環境構築からデータベースへの登録を紹介しました。

今回は、プラグインを1つだけ利用しましたが、他にも入出力、フィルタ等のプラグインが用意されています。
https://plugins.embulk.org/

拡張性もあり、大量のデータ処理にも向いているため、今後より活用できる機会を探っていけたらと思います。



◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.