Перейти к основному содержимому

Пакетная работа с данными

Всем

Зачем нужна пакетная обработка

Большинство корпоративных систем не обязаны отвечать на каждую запись за миллисекунду. Зарплата считается раз в месяц, отчёт за вчера собирается ночью, каталог синхронизируется с ERP каждые 15 минут, поисковый индекс перестраивается пакетом. Во всех этих случаях выгоднее собрать работу в группу и выполнить её одним прогоном, чем имитировать миллион отдельных "микроопераций" в реальном времени.

В основе пакетной обработки лежит сознательный отказ от real-time в пользу:

  • меньших накладных расходов (сеть, парсинг SQL, открытие транзакций);
  • предсказуемой нагрузки на БД и диск (ночное окно, лимиты CPU);
  • более простой отладки (лог по чанкам, checkpoint, повтор прогона).

Эта статья — теоретический хаб: термины, цикл ETL, разбиение тяжёлых задач, атомарность, поток vs пакет, очереди, распределённые фреймворки, массовые CRUD в одном HTTP-запросе. Практика интеграций и REST batch API — в интеграционных потоках и восьми принципах REST; потоковая аналитика — в 423; оркестрация пайплайнов — в 425.


Карта терминов — не путать batch, bulk и chunk

В разговорах и документации слова смешивают. Ниже — различия, которые архитекторы закладывают в контракты и код.

ТерминУровеньСмыслТипичный пример
Batching (пакетирование)МетодЗадачи группируют и выполняют одним запуском или одной фазой планировщикаНочной job "все заказы за вчера"; Kafka producer копит записи 50 ms
Batch (пакет, батч)Логика обработкиДанные копят по времени или объёму и обрабатываются в фоне без участия пользователяРасчёт зарплаты; выгрузка DWH за сутки
Bulk (массовость)Оптимизация I/OМного записей одной операцией вместо тысяч одиночных round-tripCOPY, bulk insert, POST /users/batch, массовый CRUD
Chunk (чанк, слайс)Подраздел пакетаНеделимая порция внутри большого batch; ограничивает RAM и время блокировки1 000 000 строк → 1000 чанков по 1000
Stream (поток)Модель данныхБесконечная последовательность событий; обработка по мере поступленияKafka topic, SSE, логи приложения
Micro-batchГибридПоток режется на микропакеты по времени (например, 1 с)Spark Structured Streaming, Flink mini-batch

Batching отвечает на вопрос "когда и как группировать работу?". Bulk"как передать много строк за один вызов API/СУБД?". Chunk"как не убить память и не держать транзакцию час?". Stream — другая ось: не ждём полного массива, работаем с событием сразу (см. потоковая аналитика).

Памятка

"Сделали batch insert" обычно значит bulk на уровне БД. "Запустили batch job" — весь ночной прогон, внутри которого могут быть тысячи чанков с bulk-записями.


Пакетная обработка, поток и real-time

КритерийПакетная (batch)Потоковая (stream)Синхронный API (request/response)
ЗадержкаМинуты — часыМс — секундыМс — секунды (один запрос)
Единица работыФайл, срез БД, массив в HTTPСобытие, запись в логеОдин ресурс / одна команда
ХранениеДиск, DWH, object storageБуфер, Kafka, state в RAMЧасто без долгого хранения
ОшибкиПерезапуск job, checkpointReplay offset, watermarkRetry, idempotency key
СтоимостьНиже на объём (амортизация overhead)Выше (постоянная инфраструктура)Высокая при миллионах мелких вызовов
ПримерыОтчёт, ML training, ночной ETLАнтифрод, алерты, дашборд liveGET /user/42

Lambda-архитектура (упрощённо): один и тот же поток событий обрабатывают два пути — быстрый stream-слой для оперативных метрик и batch-слой для точных исторических витрин. Сходимость достигают периодической пересборкой batch поверх того же сырья (lake + stream), что снижает риск расхождения цифр.

Пакет не "лучше" потока — они закрывают разные SLA. Сравнение с примерами — в 423, таблица и Big Data — batch vs stream.


Теоретический цикл — как работает batch-конвейер

Любой пакетный процесс (часто называемый ETL — Extract, Transform, Load, или ELT — с трансформацией уже в целевой СУБД) концептуально — цикл по чанкам, пока не исчерпан диапазон данных:

[Источник] ──► ( Чтение: Chunk k ) ──► [ Фильтрация / Трансформация ] ──► ( Запись: Bulk ) ──► [ Цель ]
▲ │
└──────────────── watermark / checkpoint ──────────────────────┘
ШагДействиеЧто фиксируют в метаданных
1. ИнициализацияГраницы: "вчера UTC", id BETWEEN …, файл export_20260603.csvjob_id, версия схемы, параметры
2. Extract (чтение)Один chunk фиксированного размера из источникаoffset, last_id, номер файла
3. TransformВалидация, маппинг, расчёты в RAM чанкаСчётчики ошибок, dead-letter строки
4. Load (запись)Bulk в приёмник; освобождение памятиСтроки записаны, checksum чанка
5. Commit прогрессаОбновление watermark / checkpointlast_processed_id, completed_at

Схема оркестрации нескольких шагов (зависимости, retry) — в ETL-ELT и оркестрация. Пакетная загрузка в интеграциях (batch-окно, расхождение с продом) — 112#batch-etl-load.


Почему пакет выгоден — накладные расходы (overhead)

Пакетная обработка бьёт по overhead — затратам, не связанным напрямую с полезной работой: handshake TCP, парсинг SQL, commit транзакции, fsync диска, сериализация JSON.

Упрощённая модель. Пусть на одну одиночную запись уходит фиксированная задержка (L) (latency) плюс время записи строки (r). Для (N) строк:

  • Поштучно: T_row ≈ N × (L + r)
  • Пакетом (одна транзакция, один round-trip): T_bulk ≈ L + N × r′, где r′ ≤ r за счёт буферизации СУБД и бинарных протоколов

При (L \gg r) (типично для удалённой БД или REST через интернет) выигрыш десятки–сотни раз на том же железе — не магия, а амортизация (L).

Сценарий10 000 строкГде теряется время
10 000 × INSERT по HTTP10 000 round-tripTLS, JSON parse, connection pool
1 × COPY / bulk API1 round-trip + поток байтПодготовка буфера, lock таблицы
10 чанков × 1000 bulk10 round-trip + контроль памятиКомпромисс batch vs chunk
Не только сеть

Bulk увеличивает длительность блокировок и пиковое потребление RAM. Поэтому "один bulk на 10 млн строк" часто хуже, чем "1000 чанков по 10 000" — см. размер чанка.


Как разбивают тяжёлые операции

Если объём не помещается в одно окно памяти, одну транзакцию или один HTTP-ответ, задачу декомпозируют. Четыре базовых подхода (их комбинируют):

1. Постраничная выборка (pagination)

Данные читают порциями из источника:

  • OFFSET + LIMIT — просто, но на больших смещениях PostgreSQL/MySQL деградируют (сканируют "пропущенные" строки).
  • Keyset (seek)WHERE id > :last_id ORDER BY id LIMIT 1000 — стабильнее для больших таблиц; требует индекса по ключу итерации.
  • Курсор сервераDECLARE CURSOR в SQL; удерживает ресурсы на стороне БД.

Подходит, когда источник — одна таблица с монотонным ключом. Подробнее про API-пагинацию — шесть схем.

2. Разделение по диапазонам (range split)

Пакет делят по времени или идентификаторам:

  • processed_date = '2026-06-03' — отдельный job на день;
  • user_id от 1 до 10 000, 10 001 до 20 000 — параллельные воркеры без пересечения.

Плюс: естественные границы транзакций и простой restart "с упавшего диапазона". Минус: перекос (hot spot), если один диапазон аномально плотный — нужен динамический split (adaptive).

3. Очереди сообщений (fan-out)

Тяжёлая задача превращается в миллион мелких сообщений в брокере (Kafka, RabbitMQ, SQS). Воркеры забирают с ограниченным prefetch и обрабатывают независимо.

АспектBatch-job на одном сервереОчередь + воркеры
МасштабВертикальный + чанкиГоризонтальный (N consumers)
СбойCheckpoint в jobOffset в Kafka, ack в RabbitMQ
ПорядокПроще в одном процессеПартиции Kafka, single consumer

Семантика доставки и идемпотентность потребителя — 133. Батчинг продюсера Kafka — 119.

4. Параллельная обработка (MapReduce / ForkJoin)

Map: разбить вход на независимые части и обработать параллельно. Reduce: объединить результаты (сумма, merge сортированных списков, построение индекса).

  • Hadoop MapReduce — классика: map по блокам HDFS, shuffle, reduce.
  • Spark — DAG стадий в памяти/на диске; repartition, groupByKey.
  • ForkJoin в JVM — деление задачи в пуле потоков для CPU-bound работы на одной машине.

Ограничение: части должны быть независимы или нужна стадия shuffle с известной стоимостью.

Адаптивные пакеты

Размер чанка не фиксируют навсегда: если чанк обработался быстрее порога — увеличивают batch size; при таймаутах или OOM — уменьшают. Это связывает pagination и backpressure.


Атомарность и границы транзакций

Атомарность (ACID) в пакетном мире — не "всё или ничего на 10 млн строк", а осознанный выбор границы:

СтратегияГраница транзакцииПри сбое на 9 999-й строкеКогда уместно
Весь batchОдин COMMIT на весь прогонПолный ROLLBACKМалые объёмы, жёсткая согласованность
Один chunkCOMMIT после каждых N строкСохранены предыдущие чанкиТипичный ETL
Строка / сообщениеАвтокоммит или ack одного сообщенияПотеря только текущей единицыОчереди, идемпотентный upsert
SagaНет единой транзакции; компенсацииОткат через compensating eventsМикросервисы

Изоляция: длинный bulk-блокировка таблицы (EXCLUSIVE) мешает OLTP. Решения: загрузка в staging-таблицу без индексов → один MERGE в прод; READ COMMITTED + короткие транзакции; отдельный replica для отчётов.

Согласованность между системами: одна транзакция в PostgreSQL не откатит запись в Kafka. Паттерны: outbox (событие в той же БД, что бизнес-данные), двухфазная фиксация метаданных (сначала chunk в DWH, потом watermark), саги.

Пример границы "транзакция = chunk" (псевдо-SQL):

BEGIN;
INSERT INTO staging_orders SELECT * FROM import_chunk WHERE batch_id = :bid;
INSERT INTO orders SELECT * FROM staging_orders s
ON CONFLICT (id) DO UPDATE SET status = EXCLUDED.status, updated_at = now();
INSERT INTO etl_checkpoint (job, last_id, rows) VALUES (:job, :last_id, :cnt);
COMMIT;

Идемпотентность

Идемпотентность — повторный прогон даёт тот же итог, что и первый (без двойных скидок, дубликатов заказов, повторной отправки письма).

Почему в batch это критично: job падает на 4-м часе из 5; cron запускает снова; сеть доставила сообщение дважды.

МеханизмИдея
Стабильный ключexternal_id, business_key, hash тела сообщения
UPSERT / MERGEON CONFLICT DO UPDATE, не слепой INSERT
Дедуп-таблицаprocessed_message_id перед обработкой
Idempotency-Key (HTTP)Клиент шлёт ключ; сервер кэширует ответ
Версия строкиОбновлять только если source_version новее

Hub по доставке и exactly-once на практике — 133. Импорт с checkpoint в C# — 45.


Размер чанка — "закон Златовласки"

Размер чанка подбирают измерением, а не "1000 потому что красиво":

Слишком мало (5–50 строк)Слишком много (500k+ строк)
Доминирует (L) — сеть, COMMITOutOfMemory, GC pressure
CPU простаиваетДолгие блокировки, replication lag
Много записей в checkpointТрудно повторить один чанк при ошибке

Эвристики:

  1. Целевое время обработки чанка: 30 с – 5 мин (зависит от SLA ночного окна).
  2. RAM: размер чанка × средний размер строки × коэффициент копий < 50–70% heap воркера.
  3. СУБД: смотреть pg_stat_statements, slow log, innodb_row_lock_time.
  4. A/B на staging с тем же объёмом, что прод.

В Pandas аналог — chunksize в read_csv() (lab 120). В Hibernate — hibernate.jdbc.batch_size (Java 22).


Backpressure (обратное давление)

Backpressure — потребитель не успевает за производителем: очередь растёт, память кончается, воркер падает.

Источники быстрее sink:

  • Kafka topic без lag monitoring;
  • API отдаёт страницы быстрее, чем ETL пишет в DWH;
  • Spark читает быстрее, чем JDBC принимает.

Приёмы дозирования:

УровеньМеханизм
Очередьprefetch=1, лимит unacked, пауза consumer
ПотокReactive Streams, pause()/resume() в Kafka consumer
Batch jobОграничение параллелизма чанков, семафор
APIRate limit, 429, размер batch cap

Пакетная обработка обязана согласовать скорость Extract и Load; иначе "быстрый extract" только переносит проблему в OOM на Transform.


Перезапуск — Restart vs Resume (checkpoints)

Пятичасовой job упал на 4-м часе.

СтратегияДействиеПлюсыМинусы
RestartС начала, часто с truncate stagingПростотаДорого, риск дублей без идемпотентности
ResumeПродолжить с checkpoint / watermarkЭкономия времениНужна таблица метаданных, согласованность границ

Checkpoint — запись после успешного чанка: last_processed_id, chunk_no, hash, committed_at.

Watermark — "данные до момента T уже в витрине"; следующий прогон: WHERE updated_at > :watermark.

Типичная таблица:

CREATE TABLE etl_job_state (
job_name TEXT PRIMARY KEY,
watermark_ts TIMESTAMPTZ,
last_id BIGINT,
last_chunk INT,
status TEXT, -- running | failed | success
updated_at TIMESTAMPTZ DEFAULT now()
);

При скользящем batch-окне (изменения во время загрузки) watermark обновляют только после commit всего чанка; границы окна в UTC — FAQ интеграций.


Каскадность пайплайнов

Каскад — цепочка batch-задач, где выход шага k — вход шага k+1. Пример: сырой слой lake → нормализованные таблицы → витрина → экспорт в BI.

РискПроявлениеМитигация
Задержка волнойШаг 3 стартует до готовности шага 2Оркестратор с зависимостями (Airflow, Dagster) — 425
Частичный успехВитрина обновилась, raw — нетЕдиный batch_id, статус слоёв
Сбой посерединеЗависшие downstreamИдемпотентные пересборки, "сухой" прогон
Усиление ошибки0.1% битых строк ломает весь JOINQuarantine / DLQ, quality gates

Принцип lineage: каждая витрина знает source_batch_id — упрощает расследование расхождений с продом.


Маппинг в пакетных конвейерах

Маппинг — соответствие полей источника и приёмника плюс правила преобразования. В batch он выполняется на каждом чанке в памяти или в SQL (ELT).

ПодходГдеПлюсы
Декларативныйdbt, SQL SELECT с алиасамиВерсионируется, тестируется
КодPython, Java, C# mapperСложная логика, внешние API
КонфигJSON/YAML mapping tablesБез деплоя кода для простых полей
CDC + schema registryAvro/ProtobufЭволюция схемы без "тихих" поломок

Правила:

  • Один канонический тип на поле (DECIMAL для денег, TIMESTAMPTZ UTC).
  • Явная политика NULL / default / reject — счётчики в логе чанка.
  • Справочники (lookup) либо предзагружаются в hash-map на job, либо join в SQL — не N запросов на строку.

Сериализация объектов при bulk API — маршалинг.


Сферы применения

HTTP и REST — пакетные запросы

Клиент шлёт массив сущностей в одном запросе вместо N вызовов:

POST /v1/orders/batch
Content-Type: application/json
Idempotency-Key: 7f3c9a2e-4b1d-4e8a-9c0f-1a2b3c4d5e6f

{
"items": [
{ "externalId": "A-1", "amount": 100 },
{ "externalId": "A-2", "amount": 200 }
]
}

Ответ с поштучным статусом (не "200 и молчим про ошибки внутри"):

{
"results": [
{ "externalId": "A-1", "status": "created", "id": "uuid-1" },
{ "externalId": "A-2", "status": "error", "code": "DUPLICATE" }
]
}

Контракт: лимит max_items, rate limit, long-running для гигантских файлов — 117, принцип 7.

Массовые CRUD-операции в одном запросе

Под массовым CRUD понимают не только пакетное создание (bulk create), а любую комбинацию Create, Read (редко), Update, Delete над множеством записей за один round-trip к API. Типичный мотив — UI или интеграция прислали 500 изменённых строк каталога, 200 удалений и 80 новых позиций: слать 780 отдельных POST/PATCH/DELETE дорого по сети, лимитам и observability; один batch-эндпоинт амортизирует handshake, аутентификацию и парсинг JSON.

Это не замена ночного ETL: объём до тысяч–десятков тысяч записей в синхронном запросе, ответ за секунды–минуты. Миллионы строк — чанки, staging и фоновый job (425).

ОперацияОдиночный REST (идеал)Массовый вариант в одном запросеЗамечание
CreatePOST /resourcesPOST /resources/batch, POST /bulk с массивом телЧастый кейс импорта
UpdatePUT /resources/{id} / PATCH /resources/{id}PATCH /resources/bulk, массив `{ id, patch }`Нужен стабильный ключ строки
DeleteDELETE /resources/{id}POST /resources/bulk-delete с массивом id (тело у DELETE в HTTP спорно)Идемпотентность по id
Upsertдва вызова или PUT по ключуPOST /resources/bulk-upsert + уникальный бизнес-ключСтыкуется с идемпотентностью
Смешанный CRUDодин payload с полем operations[]См. ниже

Смешанный пакет — один HTTP-запрос с упорядоченным списком подопераций (порядок может быть важен для FK и валидации):

{
"clientRequestId": "import-2026-06-04T12:00:00Z",
"operations": [
{ "op": "create", "resource": "products", "body": { "sku": "P-1", "price": 10 } },
{ "op": "update", "resource": "products", "id": "uuid-42", "body": { "price": 12 } },
{ "op": "delete", "resource": "products", "id": "uuid-7" }
]
}

Сервер обрабатывает список последовательно (одна транзакция или чанк внутри транзакции) либо параллельно по независимым сущностям — это должно быть явно в контракте. Аналоги в индустрии: OData $batch, GraphQL [mutation1, mutation2], Salesforce Composite API, Google { "requests": [ ... ] }.

Идемпотентность на уровне строки. Один Idempotency-Key на весь пакет защищает от повтора всего запроса; при partial success клиент не знает, что уже применилось. Практика:

  • ключ пакета + clientMutationId / externalId на каждой операции;
  • upsert по бизнес-ключу (sku, orderNo), а не только по UUID;
  • сервер хранит результат обработки пакета по ключу и при повторе отдаёт тот же отчёт без повторного применения.

Связка с идемпотентностью и заголовком Idempotency-Key213, HTTP-интеграции.

Граница атомарности — отдельное архитектурное решение (см. атомарность и транзакции):

РежимПоведение при ошибке на 50-й записиКогда уместно
Всё или ничегоHTTP 4xx/5xx, откат всего пакетаМалый пакет, жёсткая согласованность
Partial successHTTP 200/207 + массив статусов по строкамИмпорт из Excel, интеграции
Best effort + отчётПрименили валидные, остальные в errors[]Оператор исправляет и досылает

Для partial success коды ответа часто используют 207 Multi-Status (WebDAV) или 200 с телом `{ "succeeded": N, "failed": M, "results": [...] }`. Клиент обязан разбирать отчёт по элементам, а не только status: ok.

Пример ответа на смешанный bulk update/delete:

{
"summary": { "created": 80, "updated": 200, "deleted": 198, "failed": 2 },
"results": [
{ "index": 0, "op": "update", "id": "uuid-42", "status": "ok" },
{ "index": 41, "op": "delete", "id": "uuid-7", "status": "error", "code": "FK_CONSTRAINT", "message": "Есть активные заказы" }
]
}

Слой приложения vs СУБД. Массовый CRUD в API не означает автоматически bulk на диске:

  1. Наивно: цикл repository.save() / SaveChanges на каждую строку — тот же overhead, что N одиночных API, только внутри сервера (ORM FAQ).
  2. Правильно: один приём JSON → валидация пачки → один чанкbulk insert / COPY / MERGE / bulkWrite (sql-bulk, nosql-batch).

Проектирование контракта (чек-лист для API):

  • max_operations, max_payload_bytes, таймаут; при превышении — 202 Accepted + job id (long-running).
  • Семантика upsert vs create-only (дубликат — ошибка или merge).
  • Версия схемы (schemaVersion) при эволюции полей.
  • Единый формат ошибки с index, op, field, code — как в примере выше.
  • Ограничение глубины вложенности (граф сущностей в одном пакете быстро раздувает транзакцию).

Чего избегать: гигантский пакет без лимита; «тихий» пропуск failed строк; один COMMIT на 100k строк без staging; смешение read-тяжёлых отчётов с write-пакетом в одном эндпоинте. Массовый Read в одном запросе — скорее POST /search или batch GET по id (?ids=1,2,3 с лимитом), а не классический bulk CRUD.

Практика проектирования API — 117, bulk operations, восемь принципов REST.

SQL и реляционные СУБД — bulk

МеханизмСУБД / стекНазначение
Multi-row INSERTУниверсальноУмеренные объёмы
COPY / BULK INSERTPostgreSQL, SQL ServerМаксимальная скорость загрузки
LOAD DATA INFILEMySQLФайл → таблица
MERGE / ON CONFLICTPG, SQL Server, OracleИдемпотентная загрузка
JDBC batchJava, HibernateПакетирование prepared statements
bcp, pgloaderOpsМиграции, восстановление

Пример PostgreSQL (чанк в staging):

COPY staging_orders (id, amount, status)
FROM STDIN WITH (FORMAT csv);
-- ... поток из приложения ...

Транзакции и индексы — основы БД, углубление SQL — 3.07.

NoSQL

СистемаПакетный приём
MongoDBinsertMany, bulkWrite ordered/unordered
RedisPIPELINE, MSET — амортизация RTT
Elasticsearch_bulk API с NDJSON
CassandraUNLOGGED BATCH (осторожно с размером partition)

Пакетная миграция — NoSQL, блок 5. Unordered bulk часто быстрее, но порядок ошибок не гарантирован — фиксируют в контракте.

Очереди и брокеры

  • Producer batching (Kafka): batch.size, linger.ms — компромисс latency / throughput.
  • Consumer micro-batch: poll(max) → обработать пачку → commitSync.
  • RabbitMQ: prefetch + ack после обработки пачки сообщений.

Теория очередей: at-least-once, DLQ, повтор — 121, 122.

Распределённые системы — MapReduce и наследники

ТехнологияМодельТипичный batch-сценарий
Hadoop MapReduceДиск, map/shuffle/reduceИсторические ETL на HDFS
Apache SparkDAG, in-memoryETL, ML feature prep, read.jdbc с partition column
Apache FlinkStream-first + batch modeЕдиный код batch и stream
Apache BeamPortable modelGCP Dataflow, Flink runner
dbtSQL-трансформации в DWHELT слои staging → marts

Spark: чтение JDBC с numPartitions и диапазоном по numeric key — тот же range split, что выше. PySpark в аналитике — 426.


Справочник инструментов (кратко)

КатегорияИнструментыРоль
ОркестрацияAirflow, Prefect, Dagster, Luigi, cron/K8s CronJobРасписание, зависимости, retry
ETL/ELTAirbyte, Fivetran, Talend, Informatica, dbtExtract/load, SQL-трансформации
Поток + batchKafka + Connect, Flink, Spark StreamingМост event → lake
ОблакоAWS Glue, Azure Data Factory, BigQuery load jobsManaged batch
ИнтеграцияNiFi, Camel, n8nВизуальные/маршрутные потоки
ЯзыкиPython (pandas chunks), Go, Java Spring BatchКастомные job

Выбор инструмента вторичен относительно границ транзакций, идемпотентности и наблюдаемости — без них любой "крутой" оркестратор только быстрее создаст дубликаты.


Наблюдаемость batch-job

Минимальный набор метрик и логов:

МетрикаЗачем
rows_read, rows_written, rows_rejectedБаланс чанка
chunk_duration_msТюнинг размера
lag (для очередей)Backpressure
watermark_ageСвежесть витрины
checksum per chunkСверка с источником

Логи — структурированные (JSON) с job_id, chunk_no, correlation_idпроектирование API, логирование.


Чек-лист проектирования

  1. Зафиксировать SLA: допустимая задержка (ночь vs 15 мин vs real-time).
  2. Выбрать границу атомарности: весь job / chunk / сообщение.
  3. Спроектировать ключ идемпотентности и UPSERT, не "голый INSERT".
  4. Разбить объём: keyset или range, не OFFSET на миллионах.
  5. Подобрать размер чанка на staging с реальным объёмом.
  6. Записать checkpoint / watermark в отдельную таблицу.
  7. Ограничить параллелизм и настроить backpressure.
  8. Описать каскад зависимостей и batch_id для lineage.
  9. Сверить с потоком: что нельзя batch — вынести в 423.

Связанные материалы

ТемаСтатья
Поток vs пакет423 — потоковая аналитика
ETL, оркестрация425
Big Data, DWH11
Интеграционные потоки, batch-окно112#batch-etl-load
REST batch API117
Массовый CRUD в API§ bulk-crud, design/117
Идемпотентность доставки133
Проектирование БД, интеграции116 — БД, 117 — API и интеграции, 213 — идемпотентность
ГлоссарийBatch processing, Пакетная загрузка

Следующий шаг

После теории — соберите один сквозной кейс: keyset-выборка → transform в памяти → bulk в staging → MERGE → checkpoint. Параллельно прочитайте ETL-ELT и оркестрацию и закрепите SQL в реальных кейсах.

Содержание
Освоение главы0%