Какой вариант лучше выбрать для передачи больших текстовых данных (около 10 Гб)?
Что проверяют
Умеете ли вы сначала уточнить условия, а потом выбирать инструмент. 10 ГБ текста это не «большие данные»: такой объём помещается на один диск и обрабатывается одной машиной. Интервьюер ждёт вопросов: откуда и куда, разово или регулярно, нужна ли потом распределённая обработка. Следом обычно спрашивают, что делать, если связь оборвалась на середине.
Как отвечать
Начните с уточнений, затем дайте решение под сценарий:
- сжатие: текст хорошо жмётся, часто в несколько раз.
zstdработает быстрееgzipпри сопоставимой степени сжатия. Один большой.gzнельзя читать параллельно по кускам, Spark обработает его одной задачей; - нарезка: делите на части от 128 МБ до 1 ГБ. Упавший кусок проще повторить, а части читаются параллельно;
- формат: если текст табличный (CSV, JSON Lines), переведите его в Parquet со сжатием
zstdилиsnappy. Колоночный формат занимает меньше и читается выборочно; - объектное хранилище: для обмена между системами берут S3-совместимое хранилище. Одним
PUTв S3 можно загрузить не больше 5 ГБ, поэтому большие файлы идут multipart-загрузкой, и упавшую часть повторяют отдельно. Утилитыaws s3 cpиrcloneделают это сами; - между серверами:
rsync --partialдокачивает после обрыва, для разовой передачи хватитscpилиsftp; - целостность: контрольные суммы (
sha256sumвсего файла или каждой части) на обеих сторонах; - поток: если данные появляются постепенно, их отправляют записями через Kafka, но не одним сообщением. Лимит сообщения в Kafka по умолчанию около 1 МБ, поэтому большие файлы кладут в хранилище, а в топик отправляют ссылку.
Итог для типичного случая: сжать, нарезать, выгрузить в объектное хранилище и передать путь потребителю.
Где спотыкаются
Предлагают отправить 10 ГБ одним HTTP-запросом или одним JSON в API. Запрос упадёт по таймауту или памяти, а повторять придётся целиком.
Выбирают Kafka или «стриминг» по умолчанию, не спросив про сценарий. Для разовой передачи файла это лишняя инфраструктура.
Сжимают всё в один большой .gz и потом удивляются, что Spark читает его одним исполнителем, пока остальные простаивают.