# ============================================================================= # eBdesk SiCABE — dependensi image Airflow 3.3.2 / Python 3.11 (BERDAMPINGAN) # ============================================================================= # SUMBER (input) untuk `uv pip compile`. Jangan tambahkan pin hasil ke sini — # hasilnya ada di requirements.332.lock. # Berdampingan dengan `requirements.in` (3.3.1) yang TIDAK diubah. # Rencana & bukti: reviews/sicabe-18-merge-airflow332-plan.md · experiments/airflow332/ # # Perubahan dari requirements.in (3.3.1): # 1. apache-airflow 3.3.1 -> 3.3.2 # 2. + apache-airflow-providers-mysql (keputusan K3 — sebelumnya sengaja tidak ada) # 3. openmetadata-* 2.0.2.0 -> 2.0.3.0 ; extra `[airflow]` DILEPAS # 4. + sqlalchemy<2.1 (PIN WAJIB, hasil langkah A1) # # ⚠️ CONSTRAINT: resolusi ini di-resolve BEBAS (tanpa constraints resmi Airflow), # karena constraints resmi 3.3.2 TIDAK dapat dipakai bersama OpenMetadata 2.0.3.0: # constraints tabulate==0.10.0 vs OM tabulate==0.9.0 (keras) # constraints kubernetes==36.0.3 vs OM kubernetes<36 # Jalur `--override` sudah dicoba dan TIDAK menang atas constraints. # Preseden: lock produksi 3.3.1 pun di-resolve bebas (ia memakai tabulate 0.9.0). # ============================================================================= apache-airflow==3.3.2 # Provider Airflow yang dipakai DAG / konektor apache-airflow-providers-trino apache-airflow-providers-amazon apache-airflow-providers-http # WAJIB: Postgres adalah metadata DB Airflow (postgresql+psycopg2://). apache-airflow-providers-postgres # ⚠️ BARU (keputusan K3): untuk konek ke server MySQL eksternal. Provider ini # menarik EMPAT klien (mysqlclient, mysql-connector-python, aiomysql, pymysql) # sehingga ketiga rute Extra `client` tersedia. `mysqlclient` tidak punya wheel # Linux → dibangun di stage builder Dockerfile.332 + libmariadb3 sebagai runtime. apache-airflow-providers-mysql # OpenLineage — memancarkan event lineage dari task Airflow. # ⚠️ INERT tanpa backend: provider ini hanya aktif bila transport/endpoint # OpenLineage dikonfigurasi (mis. OPENLINEAGE_URL + OPENLINEAGE_API_KEY, atau # transport lain). Di stack ini BELUM ada backend OpenLineage, jadi penambahan # ini mengaktifkan KEMAMPUAN — belum menghasilkan lineage sampai dikonfigurasi. # Dependensinya ringan dan hanya batas bawah: attrs>=22.2 (kita punya 26.1.0), # providers-common-sql/common-compat (sudah ada), plus dua paket baru: # openlineage-python + openlineage-integration-common. apache-airflow-providers-openlineage # ─── PIN WAJIB: melindungi plugin OpenMetadata dari kerusakan SENYAP ───────── # SQLAlchemy 2.1 mematahkan rantai: # flask_appbuilder -> sqlalchemy_utils -> sqlalchemy.orm.attributes # AttributeError: module 'sqlalchemy.orm.attributes' has no attribute # 'ScalarAttributeImpl' # Akibatnya plugin `openmetadata-managed-apis` GAGAL DIMUAT saat Airflow start # (log hanya "Failed to import plugin openmetadata_managed_apis"), sehingga tombol # "Test Connection" dan jalur pipeline service client (install-phases §8.11) mati. # ⚠️ Berkas constraints RESMI Airflow pun TIDAK mem-pin sqlalchemy — jadi hanya # pin eksplisit inilah yang melindungi (ditemukan di experiments/airflow332). sqlalchemy<2.1 # Transformasi & data quality # dbt-core<1.12: 1.12.x menarik `dbt-core-experimental-parser` yang sdist-only. dbt-core<1.12 dbt-trino>=1.8,<2.0 great_expectations>=1.0,<2.0 # Metadata ingestion # ⚠️ Extra `[airflow]` DILEPAS (keputusan pemilik proyek). Dampaknya TERUKUR di H7: # produksi (dengan extra) 18/18 modul · eksperimen (tanpa extra) 13/18 # yang hilang: tornado, elasticsearch, opensearchpy, # providers-elasticsearch, providers-opensearch # TETAP ADA (yang menentukan): workflow_factory, api.routes.deploy, pygtrie, # attrs, werkzeug, starlette, python-multipart, otlp, presidio, spacy # → jalur DAG ingestion metadata TETAP UTUH; OM 2.x hanya punya 2 sink # (`file`, `metadata_rest`) dan keduanya impor bersih. # Bila kelak memakai pipeline yang meng-ingest DARI Elasticsearch/OpenSearch, # tambahkan paket spesifik di atas — bukan mengembalikan seluruh extra. # Extra `[pii-processor]` TETAP dipasang (presidio + spacy) agar DAG pipeline DQ # yang dibangkitkan plugin dapat diimpor Airflow. Versi WAJIB sama dengan server. openmetadata-ingestion[pii-processor]==2.0.3.0 # Plugin REST API OpenMetadata yang disajikan Airflow di prefix /pluginsv2/ # (yang menghidupkan tombol "Test Connection"). Paket ini TIDAK mem-pin Airflow # (`apache-airflow>=2.2.2`) sehingga netral terhadap pilihan versi kita. openmetadata-managed-apis==2.0.3.0 # Lineage dbt (bronze→silver→gold) di OpenMetadata — tanpa ini workflow dbt gagal # dengan "No module named 'collate_dbt_artifacts_parser'". collate-dbt-artifacts-parser==0.1.4 # ─── Ditambahkan 2026-10-06 atas permintaan pemilik proyek ────────────────── # 1) statsd — WAJIB agar Airflow memakai StatsClient (StatsD → statsd-exporter). # Tanpa paket ini Airflow jatuh ke NoStatsLogger: # "Could not configure StatsClient: No module named 'statsd'" # sehingga TIDAK ada metrik yang terkirim (menutup caveat non-permanen M2). statsd # 2) duckdb — analitik lokal di dalam task DAG. duckdb # 3) pyiceberg[s3fs,pyarrow] — akses tabel Iceberg langsung (S3FileIO via s3fs) # + konversi tabel Arrow. Menarik pyarrow, s3fs, dan aiobotocore (lihat lock). pyiceberg[s3fs,pyarrow]