XCom и data passing — обзор модуля
XCom (cross-communication) — механизм передачи данных между tasks. По умолчанию хранится в metadata DB, имеет практический лимит 48KB. Для production data engineering этого мало — модуль учит, как масштабировать XCom через custom backends на S3/GCS/Object Storage abstraction.
Уроки модуля
| # | Урок | Что внутри |
|---|---|---|
| 01 | Обзор модуля | Текущий урок |
| 02 | Default XCom — DB storage | Таблица xcom, serialization (JSON vs pickle), 48KB лимит |
| 03 | xcom_pull deep | 7 параметров pull, XComArg.resolve, multiple_outputs, anti-patterns |
| 04 | Custom XCom Backend | Subclass BaseXCom, serialize/deserialize, S3 backend full code |
| 05 | Object Storage XCom (2.8+) | fsspec-based, S3/GCS/Azure unified API |
| 06 | XCom в Mapped Tasks | map_index, как xcom_pull агрегирует от mapped TI |
Ключевые концепты
- Default storage: таблица
xcomв metadata DB, колонкаvalue(bytea/mediumblob). Практический лимит ~48KB, выше — scheduler тормозит из-за раздутых select-ов - Сериализация: JSON (default через XComEncoder) или pickle (legacy, security risk)
- Custom Backend: subclass
airflow.models.xcom.BaseXCom, overrideserialize_value/deserialize_value. В DB сохраняется ссылка, blob — на S3/GCS - Object Storage XCom (2.8+): готовый
XComObjectStorageBackendчерез провайдерcommon.io. URL:xcom_objectstorage_path = s3://conn_id@mybucket/key - В Mapped tasks: каждая mapped TI хранит XCom отдельно (
map_indexcolumn).xcom_pull(task_ids='x')без map_index агрегирует всё
Killer takeaway
100MB pandas DataFrame через default XCom = error/timeout. Через S3 backend = работает прозрачно. Migration на S3 backend — одна из первых вещей при выходе в production.
Production gotchas
do_xcom_push=Trueдля всех PythonOperators по умолчанию → раздутые xcom-ы. Установить False, если return не используется.xcom_pullбезtask_idsподтянет всё из upstream — expensive.- Pickle security — never
enable_xcom_pickling=Trueесли есть user-submitted code. Deserialization attack. - Custom backend обязателен для production с pandas/numpy объектами.