AI

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}")

機能比較表

比較項目AirbyteMeltanodlt
設定方法WebUI + APICLI/YAMLPythonコード
コネクター数300+300+(Singer)20+(Python拡張可)
自作コネクターPython SDKPython(tap)デコレータ関数
セットアップDocker必要CLIpipだけ
向いている人エンジニア以外もデータエンジニアPythonエンジニア
GitHub Stars17k+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重視・GitOpsMeltano
Pythonコードでパイプライン・軽量・カスタムAPIdlt

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。