Open14

Embulk備忘録

でんちゅーでんちゅー

Embulkとは

Embulkはトレジャーデータ株式会社が提供するオープンソースのETLツールで、Embulkそのものが各サービスの転送を標準でサポートするのではなく、ニーズに応じて転送元・転送先用のプラグインを導入することでETLを行います。EmbulkはWindowsの他、MacOS、Linuxにも対応していますが、いずれもコマンドライン上で動作するCLIツールです。

https://blog.trocco.io/glossary/embulk

でんちゅーでんちゅー

ETLとは

  • Extract(抽出)
  • Transform(変換)
  • Load(格納)
    の略で、データ統合時に発生する各プロセスの頭文字をとったもの
でんちゅーでんちゅー

DWH(データウェアハウス)とは?

  • 直訳するとデータの倉庫
  • DWHの提唱者はDWHを「DWHは意思決定のため目的別に編成され、統合された時系列で、削除や更新しないデータの集合体」と定義している
  • 基幹システムを含むさまざまなデータソースからデータを集めて格納し、人間がそれらのデータを用いて分析を行い、意思決定できる環境を提供するのがDWH

https://www.dal.co.jp/column/b-dwh/

でんちゅーでんちゅー

BI(ビジネスインテリジェンス)とは?

ビジネスインテリジェンスは、ビジネスに関するインテリジェンス、すなわち事業上の意思決定のために情報を分析して得られる知見およびそれを得る機構である。 より具体的には、企業などの組織のデータを収集・蓄積・分析・報告することにより経営上などの意思決定に役立てる手法や技術のことである。

https://ja.wikipedia.org/wiki/ビジネスインテリジェンス

でんちゅーでんちゅー

Embulk & DWH & BIツール の関連性

Embulk(ETLツール)

  • 概要: Embulkは、異なるデータソース間でデータをバルクロード(大量転送)するためのオープンソースのデータ転送ツールです。
  • 役割: 主にデータのインポート/エクスポートを担います。これには、異なるデータベース、ストレージシステム、APIからデータを収集し、変換して、目的のデータウェアハウスにロードする作業が含まれます。
  • 使用例: EmbulkはCSV、JSON、SQLデータベース、NoSQLデータベース、APIなど、多様なデータソースからのデータを統合するのに使われます。

データウェアハウス(DWH)

  • 概要: データウェアハウスは、組織の様々なデータソースから集めたデータを統合、保存、管理するためのシステムです。
  • 役割: 主にデータの集約、整理、長期保管を担います。データは分析のために最適化された形式で格納されます。
  • 使用例: データウェアハウスはビジネスの意思決定を支援するために歴史的データを保存し、分析のためにアクセス可能な状態に保ちます。

BI(ビジネスインテリジェンス)ツール

  • 概要: BIツールは、データ分析とビジュアライゼーションのためのアプリケーションやソフトウェアです。
  • 役割: データを分析し、洞察を得ることで、ビジネスの意思決定を支援します。これにはデータの可視化、レポート作成、ダッシュボードの提供が含まれます。
  • 使用例: BIツールは、データウェアハウスからのデータを使用してトレンドを分析し、KPI(主要業績評価指標)を追跡し、結果を視覚的に表示します。

関連性

  • データフロー: Embulkを使用してデータを収集し、変換した後、データウェアハウスにロードします。その後、BIツールがこのデータを利用して分析し、ビジュアライゼーションを提供します。

  • 統合プロセス: これらのツールは一連のプロセスを形成し、データが収集され、保存され、分析される方法を決定します。各ツールはデータパイプラインの異なる段階で重要な役割を担い、全体的なデータ戦略の効率性と効果性を向上させます。

  • 簡単に言えば、Embulkはデータの収集と統合を担い、DWHはそのデータを安全かつ効率的に保存・管理し、BIツールはそのデータから価値ある洞察を抽出してビジネス意思決定に役立てる、という関係性があります。これらのツールを組み合わせることで、データをより有効に活用し、ビジネスプロセスを最適化することが可能になります。

(Description by ChatGPT)

でんちゅーでんちゅー

Embulkと相性の良いオンプレ構築可能なDWH向きOSS

1. Apache Hadoop / Apache Hive:

  • 概要: Apache Hadoopは分散処理と大規模データストレージのためのオープンソースフレームワークです。Apache HiveはHadoop上に構築されたデータウェアハウスインフラです。
  • 理由: HadoopとHiveはオンプレミス環境でのデータウェアハウス構築に適しています。Embulkを使用してHadoopシステムにデータをロードし、Hiveでデータを管理・分析することができます。

2. PostgreSQL:

  • 概要: 高機能なオープンソースのリレーショナルデータベース管理システム。
  • 理由: PostgreSQLはオンプレミス環境に容易に設置でき、データウェアハウスとしての機能拡張が可能です。Embulkを利用して、データのインポートやエクスポートを行うことができます。

3. ClickHouse:

  • 概要: 高速な列指向のデータベースシステムで、オンプレミス環境に適しています。
  • 理由: ClickHouseはリアルタイムのデータ分析に強みを持ち、Embulkを通じてデータをロードすることが可能です。

4. Greenplum Database:

  • 概要: オープンソースの大規模データウェアハウスソリューションで、複数のデータベースサーバーを連携させて動作します。
  • 理由: Greenplumはオンプレミスでの大規模なデータウェアハウス構築に適しており、Embulkを使ってデータをロードすることができます。
でんちゅーでんちゅー

embulkのpostgresqlプラグインでPostgreSQL v14以上を使用するときのJDBC Driverの設定

問題点

  • PostgreSQL v14から認証方式が変更されたため、v42以上のJDBCドライバを使用していないと互換性に関する以下のエラーが発生する。
ターミナル
Error: java.lang.RuntimeException: org.postgresql.util.PSQLException: The authentication type 10 is not supported. Check that you have configured the pg_hba.conf file to include the client's IP address or subnet, and that it is using an authentication scheme supported by the driver.

解決策

  1. 以下のページから最新のJDBC Driverをダウンロードする

https://jdbc.postgresql.org/download/

  1. inもしくはoutのdriver_pathパラメータに先程ダウンロードしたJDBC Driverのパスを指定する
config.yml
in:
    type: postgresql
    ...
    driver_path: /path/to/postgresql-42-◯.◯.jar

out:
    type: postgresql
    ...
    driver_path: /path/to/postgresql-42-◯.◯.jar

dockerを使用している場合

  1. ローカルPCにJDBC Driverをダウンロードする
  2. compose.yamlのvolumesでマウント設定する
ディレクトリ構成
.
|-compose.yaml
|-embulk/
|  |-Dockerfile.embulk
|  |-postgresql-42.7.0.jar
|  |-config
|  |  |-config.yml

compose.yml
version:3.8
services:
  embulk:
    container_name: embulk-etl
    volumes:
      - ./embulk/config:/usr/src/app/config
      - ./embulk/postgresql-42.7.0.jar:/usr/src/app/postgresql-42.7.0.jar
  1. config.ymlでコンテナ内でのJDBC Driverへのパスをdriver_pathに設定する
  • WORKDIR /usr/src/appの場合
config.yml
in:
    type: postgresql
    ...
    driver_path: /usr/src/app/postgresql-42-◯.◯.jar

out:
    type: postgresql
    ...
    driver_path: /usr/src/app/postgresql-42-◯.◯.jar
でんちゅーでんちゅー

config.ymlにmetadataを含めることが可能かどうか

  • 以下のように、inout以外にmetadataというパラメータを付加しても特にエラーは吐かなかった
config.yml
in:
  type: file
  ...

out:
  type: postgresql
  ...

metadata:
  name: 商品マスタ変換
  description: 商品マスタを変換する
でんちゅーでんちゅー

csvのカラム名とPostgresqlのカラム名を異なるものにする方法

  • in側のcolumnsでnameとsrcを設定することで別名のカラム同士を接続することができる
config.yml
in:
  type: file
  path_prefix: /usr/src/app/data/item_master/
  parser:
    type: csv
    charset: UTF-8
    newline: LF
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    columns:
      - {name: id, src: item_id, type: string}
      - {name: name, src: item_name, type: string}
      - {name: price, src: item_price, type: long}

out:
  type: postgresql
  host: dwh-db
  port: 5432
  user: postgres
  password: postgres
  database: dwh_db
  table: item_master
  # mode: insert
  mode: merge
  column_options:
    id: {type: VARCHAR(20) PRIMARY KEY}
    name: {type: VARCHAR(50) NOT NULL}
    price: {type: INT NULL}
  driver_path: /usr/src/app/postgresql-42.7.0.jar

metadata:
  name: 商品マスタ変換
  description: 商品マスタを変換する
でんちゅーでんちゅー

プラグインの種類

1. Input plugin

  • 役割:データソース(例えばデータベース、ファイル、APIなど)からデータを読み込む。

2. Output plugin

  • 役割:読み込んだデータを目的のデータストアやサービス(例えばデータベース、ファイルシステム、クラウドストレージなど)に書き込む。

3. Filter plugin

  • 役割:データを変換、フィルタリング、加工する。データの加工や変換処理を行い、入力データを出力データに適切にマッピングする。

4. File parser plugin

  • 役割:ファイル形式(CSV、JSON、Excelなど)を解析し、Embulkが処理できるデータ形式に変換する。

5. File decoder plugin

  • 役割:圧縮されたファイルや特定のエンコーディング形式を持つファイルをデコードする。

6. File formatter plugin

  • 役割:出力データを特定のファイル形式(CSV、JSON、Excelなど)にフォーマットする。データを出力する際に適切な形式で書き出すために使用されます。

7. File encoder plugin

  • 役割:データを圧縮したり、特定のエンコーディング方式でエンコードする。出力データを圧縮やエンコードして、データ転送量を減らしたり、セキュリティを高めるために使用されます。

8. Executor plugin

  • 役割:Embulkのタスクの実行方法を制御する。これはデータの読み込みや書き込みプロセスをどのように並列化または分散させるかを決定するために使用されます。

(Description by ChatGPT)

https://qiita.com/gak_t12/items/f7fa0f1a99c759d947a7#embulk-filter-column-プラグイン

でんちゅーでんちゅー

組み込みプラグイン一覧

組み込みプラグインとは

  • embulk gem install 〇〇が必要ないプラグイン

1. Input plugin

2. Output plugin

  • File output plugin : ローカルファイルシステムにデータを書き出す。
  • stdout: 標準出力にデータを書き出す。

3. Filter plugin

  • Embulkの初期バージョンには、ビルトインのフィルタプラグインは含まれていません。

4. File parser plugin

5. File decoder plugin

6. File formatter plugin

  • csv: データをCSV形式にフォーマットする。

7. File encoder plugin

  • gzip: データをgzip形式で圧縮する。
  • bzip2: データをbzip2形式で圧縮する。

8. Executor plugin

  • local: ローカルマシン上でEmbulkタスクを実行する。

(Description by ChatGPT)

  • 各組み込みプラグインの詳細は以下のページが分かりやすかった

https://qiita.com/hiroysato/items/a71669d3e5be2049c238

でんちゅーでんちゅー

よく使いそうなプラグイン一覧

1. Input plugin

2. Output plugin

3. Filter plugin

  • column(カラムを削る)
  • insert(ホスト名やタイムスタンプのカラムを追加する)
  • row(条件に合致する行のみを抽出する)
  • rearrange(一行のデータを複数行に再構成する)

4. File parser plugin

5. File decoder plugin

  • 特になし

6. File formatter plugin

  • jsonl(レコードの内容をjsonl(1json1行)の形式に整形するプラグイン)
  • poi_excel(Excel(xlsx, xls)形式のデータに変換するプラグイン)

7. File encoder plugin

  • 特になし

8. Executor plugin

  • 特になし
でんちゅーでんちゅー

Embulkのチュートリアル

1. embulkがセットアップされた環境で、以下のコマンドを実行

terminal
embulk example

2. cwd(Current Working Directory)直下にembulk-exampleというディレクトリができていることを確認する

3. embulk-exampleディレクトリの構成は以下の通り

ディレクトリ構成
embulk-example
|-seed.yml
|-csv/
|  |-sample_01.csv.gz
フォルダ/ファイル名 説明
embulk-example embulkのトライアル用サンプルディレクトリ
seed.yml テンプレートconfigファイル
csv/ 変換対象のcsvファイルを格納するフォルダ
sample_01.csv.gz 変換対象サンプルcsvファイル

4. 以下のコマンドを実行

a. sample_01.csv.gzからconfigの内容を推測し、seed.ymlを基にconfig.ymlを生成するコマンド

terminal
embulk guess embulk-example/seed.yml -o config.yml

b. バルクロードトランザクションをドライランし、プレビューするコマンド

  • バルクロードトランザクション
    • データをバルク(一括)で効率的に転送する処理
  • ドライラン
    • 実際にデータを転送する前にその転送プロセスを「試運転」すること
terminal
embulk preview config.yml

c. バルクロードトランザクションを実行するコマンド

terminal
embulk run config.yml
  • embulk-exampleでは「csv to stdout」のconfigが生成されるため、以下のデータがターミナル上に表示されたら成功
terminal
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,