OSSのETL・データ統合比較:Airbyte vs Meltano vs dlt でデータパイプラインをセルフホストする
オープンソースラボ編集部 ・ 2026年6月14日
OSSのETL・データ統合比較:Airbyte vs Meltano vs dlt でデータパイプラインをセルフホストする
Fivetran(月$500〜)・Stitch(月$100〜)に対して、Airbyte(300以上のコネクター・最も多機能なOSSデータ統合)・Meltano(Singer tapベース・CLI重視)・dlt(data load tool)(Pythonライブラリとして使えるELTフレームワーク)はOSSのデータパイプライン・ETLツールです。
ETLパイプラインが解決する問題
- データサイロの解消: Salesforce・Shopify・Stripe・GA4のデータをSnowflake・BigQueryに集約
- リアルタイム同期: SaaSのAPIデータを毎時・毎日自動でデータウェアハウスに差分同期
- コスト削減: Fivetranの月$500+をAirbyte OSSで$0(サーバー代のみ)に置き換え
- カスタムコネクター: 標準コネクターにないSocial API・社内DBのカスタムコネクターを自作
主要ツールの概要
Airbyte
2020年に公開されたPython/Java製のOSSデータ統合プラットフォームです。GitHubスター17k+。300以上のコネクター(ソース・デスティネーション)を持つ最大のOSSデータ統合ツールで、REST API・データベース・SaaSサービスからSnowflake・BigQuery・Redshift・ClickHouseへのデータパイプラインを作成できます。WebUIで設定できるため、エンジニア以外でも操作可能です。
# Airbyte をDockerでセルフホスト(最小構成)
git clone https://github.com/airbytehq/airbyte
cd airbyte
# 起動(初回は10分以上かかる場合あり)
./run_ab_platform.sh
# WebUI: http://localhost:8000
# ユーザー名: airbyte
# パスワード: password
# docker-compose.yml(本番用・S3でstateを管理する設定例)
version: "3.8"
services:
airbyte-server:
image: airbyte/server:0.50.0
environment:
DATABASE_URL: jdbc:postgresql://airbyte-db:5432/airbyte
DATABASE_USER: airbyte
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
STATE_STORAGE_MINIO_ENDPOINT: http://minio:9000
STATE_STORAGE_MINIO_BUCKET_NAME: airbyte-state
WEBAPP_URL: https://airbyte.yourcompany.com
depends_on: [airbyte-db, minio]
# Airbyte Python SDK でプログラム的にパイプラインを設定
pip install airbyte-api
import airbyte_api
from airbyte_api.models import (
SourceGitHub, SourceConfiguration,
DestinationClickhouse, DestinationConfiguration,
)
client = airbyte_api.AirbyteAPI(
security=airbyte_api.Security(
basic_auth=airbyte_api.BasicAuth(
username="airbyte",
password="password",
)
),
server_url="http://localhost:8000",
)
# GitHubソースを作成(スター・PR・Issueを収集)
source = client.sources.create_source(
source_put_request=airbyte_api.SourcePutRequest(
name="GitHub Stats",
workspace_id="workspace-id-here",
configuration=SourceGitHub(
access_token="ghp_xxxxxxxx",
start_date="2024-01-01T00:00:00Z",
repositories=["myorg/myrepo"],
),
)
)
# ClickHouseデスティネーション
dest = client.destinations.create_destination(
destination_put_request=airbyte_api.DestinationPutRequest(
name="ClickHouse Analytics",
workspace_id="workspace-id-here",
configuration=DestinationClickhouse(
host="clickhouse.yourcompany.com",
port=8123,
database="github_analytics",
username="default",
password="clickhouse-password",
),
)
)
# ソース→デスティネーションの接続を作成
connection = client.connections.create_connection(
connection_create_request=airbyte_api.ConnectionCreateRequest(
source_id=source.source_response.source_id,
destination_id=dest.destination_response.destination_id,
schedule_type="cron",
schedule_data=airbyte_api.ScheduleData(
cron=airbyte_api.Cron(
cron_expression="0 * * * *", # 毎時同期
cron_time_zone="Asia/Tokyo",
)
),
)
)
dlt(data load tool)
2022年に公開されたPython製のOSS ELTライブラリです。GitHubスター3.7k+。Pythonのライブラリとして使えるELTフレームワークで、WebUIを立てずにPythonスクリプトからデータパイプラインを定義・実行できます。@dlt.source・@dlt.resourceデコレータでAPIからデータを取得するGeneratorを定義し、BigQuery・SnowflakeへのロードをPIPELINEとして実行します。
# pip install dlt[bigquery] # BigQuery用
# pip install dlt[snowflake] # Snowflake用
# pip install dlt[duckdb] # ローカル開発・テスト用(無料)
import dlt
from dlt.sources.helpers import requests
# @dlt.source でデータソースを定義
@dlt.source
def github_source(repo: str, access_token: str = dlt.secrets.value):
headers = {"Authorization": f"token {access_token}"}
@dlt.resource(write_disposition="replace")
def stargazers():
url = f"https://api.github.com/repos/{repo}/stargazers"
while url:
response = requests.get(url, headers=headers)
response.raise_for_status()
yield response.json()
# 次のページを取得
url = response.links.get("next", {}).get("url")
@dlt.resource(write_disposition="append")
def issues(since: str = "2024-01-01T00:00:00Z"):
url = f"https://api.github.com/repos/{repo}/issues"
params = {"state": "all", "since": since, "per_page": 100}
while url:
response = requests.get(url, headers=headers, params=params)
response.raise_for_status()
yield response.json()
url = response.links.get("next", {}).get("url")
params = {} # ページネーション後はparamsをクリア
return stargazers, issues
# パイプラインを定義して実行
pipeline = dlt.pipeline(
pipeline_name="github_analytics",
destination="bigquery", # または "snowflake", "clickhouse", "duckdb"
dataset_name="github_data",
)
# ローカルDuckDBでテスト
dev_pipeline = dlt.pipeline(
pipeline_name="github_dev",
destination="duckdb",
dataset_name="github_data",
)
source = github_source(repo="myorg/myrepo")
# データを取得してBigQueryにロード
load_info = pipeline.run(source)
print(load_info)
# Loaded 1 package(s) to bigquery in 4.78 seconds.
# Package github_analytics contains 2 tables:
# stargazers: 1234 rows (1234 new)
# issues: 567 rows (567 new)
# スケジューリング(GitHub Actionsで毎日実行)
# .github/workflows/etl.yml でpython github_pipeline.py を実行
# dlt でSupabaseのPostgreSQLからBigQueryへの差分同期
import dlt
from dlt.sources.sql_database import sql_database
# Supabase PostgreSQLをソースに
source = sql_database(
credentials="postgresql://user:password@db.ucceyqlk.supabase.co:5432/postgres",
schema="public",
table_names=["articles", "tools", "categories"],
).with_resources(
"articles",
"tools",
)
pipeline = dlt.pipeline(
pipeline_name="supabase_to_bq",
destination="bigquery",
dataset_name="opensourcelab",
)
# articles テーブルはupdated_atで差分同期
info = pipeline.run(
source.articles.apply_hints(
incremental=dlt.sources.incremental("updated_at"),
)
)
print(f"Loaded: {info}")
機能比較表
| 比較項目 | Airbyte | Meltano | dlt |
|---|---|---|---|
| 設定方法 | WebUI + API | CLI/YAML | Pythonコード |
| コネクター数 | 300+ | 300+(Singer) | 20+(Python拡張可) |
| 自作コネクター | Python SDK | Python(tap) | デコレータ関数 |
| セットアップ | Docker必要 | CLI | pipだけ |
| 向いている人 | エンジニア以外も | データエンジニア | Pythonエンジニア |
| GitHub Stars | 17k+ | 1.7k+ | 3.7k+ |
ETLで集めたデータをDevOpsカテゴリ/categories/devopsのClickHouse・SupabaseなどのデータウェアハウスやOLAPエンジンに保存してBIツールで可視化します。データパイプラインの実行スケジューリングはDevOpsカテゴリ/categories/devopsのAirflow・Prefect・Dagsterと組み合わせるのが一般的です。
FAQ
Q. AirbyteのOSSとAirbyte Cloudの違いは何ですか?
A. Airbyte OSS(セルフホスト): ①全コネクターが無料②データ量課金なし③自前でDocker/Kubernetesインフラ管理が必要④カスタムコネクターを自作できる⑤エンタープライズSSO・RBAC・暗号化は別途Airbyte Enterprise(有料)。Airbyte Cloud(SaaS): ①セットアップ不要②コネクターの認証・更新をAirbyteが管理③クレジット制(同期するデータ量に応じた課金、月$100〜)。Fivetranからの乗り換えでデータ量が多い場合はAirbyte OSSのセルフホストが最大コスト削減になります。PoC段階ではAirbyte Cloudで始めて、本番化・大量データになったらOSSに移行する戦略も使われます。
Q. dltで社内DBのカスタムコネクターを最速で作るには?
A. dltの場合、Generator関数を定義するだけでコネクターが作れます。社内REST APIのカスタムコネクター例:
@dlt.source
def internal_crm(api_key: str = dlt.secrets.value):
@dlt.resource(
write_disposition="merge",
primary_key="customer_id",
)
def customers(
updated_after: dlt.sources.incremental[str] = dlt.sources.incremental(
"updated_at", initial_value="2024-01-01T00:00:00Z"
)
):
url = "https://crm.internal/api/v1/customers"
params = {"updated_after": updated_after.last_value, "limit": 100}
response = requests.get(url, headers={"X-API-Key": api_key}, params=params)
yield from response.json()["customers"]
return customers
このGeneratorをdlt.pipelineで実行するだけでSnowflake・BigQueryに同期できます。MeltanoのSinger tapと比べてPythonの知識だけで開発できる点がdltの最大の強みです。
Q. AirbyteでJSONデータを正規化してSQLテーブルに変換するには?
A. AirbyteのTransformation機能を使います。接続設定 → Transformation → Basic NormalizationをオンにするとJSONのネスト構造を自動でフラットなSQLテーブルに展開します。より高度な変換にはdbt(データビルドツール)との連携が一般的です。Airbyteが生データをRaw Tableにロード→dbtがSQLでクレンジング・集計→分析用のMartテーブルを作成。ELT(Extract→Load→Transform)パターンです。
Q. AirbyteのDockerが重くてメモリ不足になる場合の対処法は?
A. Airbyte OSSは複数のDocker Serviceを起動するため最低4GB・推奨8GB以上のメモリが必要です。軽量な代替アプローチ: ①dlt: Dockerなし、pip + Pythonスクリプト、ローカルPCでも動く。②Meltano: Docker不要、virtualenv + CLIで動く。③Cloudflare Workers + dlt: サーバーレスでETLを実行(小〜中規模向け)。④AWS ECS Fargateでdltを実行: コンテナをサーバーレスで動かしてコスト最適化。Airbyteはデータエンジニアリングチームがいるミドルサイズ以上の組織向け、dltは1〜2名のPythonエンジニアが運用するスタートアップ向けです。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| WebUIでの設定・300以上のコネクター・Fivetran代替 | Airbyte |
| Singer tap互換・CLI重視・GitOps | Meltano |
| Pythonコードでパイプライン・軽量・カスタムAPI | dlt |