summary:
Singerは2017年,クラウド型ETLサービスを提供していた企業Stitch社[後にTalend社が買収]によって開発された.同社は当時,急速に拡大するSaaSやクラウドデータソースとの連携ニーズに対応するため,従来の一体型ETLソリューションの限界を超える,よりオープンでモジュール化されたアプローチを模索していた.こうした背景から,Singerは,プラグイン形式のETLコンポーネントをPythonで簡潔に実装できるようにする,という設計思想のもとに公開され,以後,データエンジニアコミュニティにおいて一定の支持を集めてきた.
Singer仕様に基づいて実装されたタップやターゲットは,データベース,クラウドサービス,SaaSアプリケーション,ファイルストレージなど幅広いデータソースに対応しており,その多くはオープンソースで共有されている.また,Singerの設計は処理のステート管理やスキーマ検出の仕組みも含んでおり,大規模データ処理の堅牢性を担保する要素も備えている.
PostgreSQLからデータを抽出し[tap-postgres],BigQueryに書き込む[target-bigquery]場合は,基本的にbashなどのシェルから直接コマンドを実行する.すなわち,Unixパイプ[|]を使用してtap[データソース]とtarget[データ送信先]を接続する.
tap-postgres --config tap-postgres-config.json | target-bigquery --config target-bigquery-config.json
この例の場合,tap-postgres は PostgreSQL からデータを JSON Lines 形式で出力.その出力が target-bigquery に 標準入力として渡され,BigQuery にロードされる.
このコマンドを実行すると3種類のSingerメッセージが生成される.まず,tap-postgres が PostgreSQL からデータを抽出しながら,まず SCHEMA を出力.次に,1行ずつ RECORD を出力.つまり,ストリームとして標準出力上をリアルタイムに流れる.そして,処理の途中や完了時などに,適宜, STATE を一定のタイミングで標準出力に出力[emit]する.
なお,Meltanoのようなオーケストレーションツールを使えば,こうした低レベルのコマンド実行は隠蔽され,より高度な機能[スケジューリング,エラーハンドリング,状態管理など]が提供される.
上記の例で,PostgreSQL用のpostgres-config.jsonの中身は以下のようになる.
{
"host": "your-postgres-host",
"port": 5432,
"user": "your-username",
"password": "your-password",
"dbname": "your-database",
"schema": "public"
}
BigQuery用のbigquery-config.jsonの中身は次のようになる.
{
"project_id": "your-gcp-project-id",
"dataset_id": "your_bigquery_dataset",
"location": "US",
"credentials_path": "/path/to/your-service-account-key.json"
}
両ファイルは,たとえば以下のような構成で保存される.
my-etl-pipeline/
├── postgres-config.json
├── bigquery-config.json
└── run.sh (上記コマンドを記述したシェルスクリプト)
run.shの内容は以下のようになる.
#!/bin/bash
# ETL 実行スクリプト
tap-postgres --config postgres-config.json \
| target-bigquery --config bigquery-config.json
Mathematics is the language with which God has written the universe.