Не так давно в блоге компании Arenadata был опубликован материал тестирования поведения различных распределенных файловых систем при работе с маленькими файлами (~2 Мб). Краткий вывод: по результатам проверки оказалось, что лучше всего с задачей маленьких файлов справляется старый-добрый HDFS, деградируя в 1.5 раза, S3 на базе minIO не тянет, замедляясь в 8 раз, S3 API над Ozone деградирует в 4 раза, а наиболее предпочтительной системой в при работе с мелкими файлами, по утверждению коллег, является Greenplum, в том числе для компаний «экзабайтного клуба». Коллеги также выполнили огромную работу по поиску «Теоретических подтверждений неожиданных показателей».

Результаты тестирования в части S3 minIO показались нашей команде неубедительными, и мы предположили, что они могут быть связаны с:
недостаточным практическим опытом эксплуатации SQL compute over S3 и S3 в целом;
особенностями сборок дистрибутивов;
отсутствием опыта работы с кластерами minIO. В частности в высоконагруженном продуктивном окружении на 200+ Тб сжатых колоночных данных Iceberg/parquet, особенно в сценариях, где проблема маленьких файлов быстро становится актуальной.
Мы благодарны коллегам за идею и вдохновение провести аналогичное тестирование. Давайте разбираться.
Описание окружения
Тестовая среда была собрана в виртуальном окружении Яндекс.Облака.
Конфигурация виртуальных узлов под minIO:
Число узлов |
4 |
vCores |
8 |
RAM, Gb |
32 |
Дисковая подсистема |
4 сетевых SSD-диска размером 1024 каждый (суммарно на кластер – 16 сетевых дисков) |
В качестве SQL-движка мы тоже использовали Impala – 4.5_2025.04 в составе релиза платформы Data Ocean Nova 2025.04.
Конфигурация Kubernetes узлов Impala:
Число узлов |
4 |
vCores |
32 |
RAM, Gb |
252 |
Локальное дата-кэширование SQL-движка на worker-узлах было полностью отключено, чтобы во время тестирования чтение шло только с S3.
В конфигурации стенда был намеренно сделан перекос в пользу Compute-мощностей, чтобы Storage стал узким бутылочным горлышком в случае возникновения проблем. И minIO, и SQL-движок настраивались на максимальную производительность как на уровне окружения облачной инфраструктуры, операционной системы, так и индивидуальными настройками и параметрами. решении любой практической задачи задействованы все компоненты по цепочке. Большой опыт промышленной эксплуатации подобных систем обогатил нас в достаточной степени знаниями тонкой настройки.
Описание эксперимента
Тестирование тоже проводилось по методике TPC-DS. Но мы решили не ограничиваться полумерами в виде последовательного запуска 99 SQL-запросов, а проводили замеры в 4 одновременные сессии TPC-DS с суммарным количеством SQL-запросов 396. Все строго требованиям методике при конкурентном запуске. Нашей целью было создать максимально некомфортный с точки зрения нагрузки на файловое хранилище сценарий. Буквально было желание, чтобы «плохой minIO» захлебнулся в запросах от движка на листинг и чтение маленьких файлов, и глубокое погружение в «теоретическое исследование неожиданных показателей» оригинальной статьи было не зря.
Коллеги из Arenadata посчитали, что размер файла в 2,3 Мб является достаточно маленьким и характерным для подхода Change Data Capture, особенно если работаешь с HDFS. Но мы решили падать на самое дно и постепенно с него выбираться, увеличивая размер. Наши данные были подготовлены через Spark в формате parquet в 14-ти схемах, в каждой из которых был свой целевой размер parquet-файла, который варьировался от 256 Кб до 128 Мб.
Номер эксперимента |
Объем файлов, Мб |
Число файлов в S3 |
1 |
128 |
248 |
2 |
96 |
322 |
3 |
64 |
463 |
4 |
48 |
612 |
5 |
32 |
956 |
6 |
24 |
1339 |
7 |
16 |
1878 |
8 |
12 |
3338 |
9 |
8 |
7037 |
10 |
4 |
11733 |
11 |
2 |
28107 |
12 |
1 |
46836 |
13 |
0,5 |
102178 |
14 |
0,25 |
140102 |
В самом неблагоприятном сценарии общее число файлов тестового набора данных превышало число файлов из теста Arenadata в 10 раз! – 140 тыс против 14 тыс.
Как видите, мы намеренно не стали ограничиваться крайними значениями самого маленького и самого большого, чтобы показать динамику «падения» производительности в зависимости от размера.
Результаты
На диаграмме представлены результаты прохождения теста каждым из 4-х независимых потоков TPC-DS, запускаемых одновременно:
На оси Y – время работы в секундах c шагом 125 секунд;
На оси X (логарифмическая шкала) – размер файла в Мб.

Для упрощения анализа выведем на диаграмму общее время прохождение теста, которое будет равно времени самого медленного потока в группе.

График. Время работы TPC-DS 4 потока в зависимости от размера файлов:
На оси Y – время работы в секундах c шагом 125 секунд;
На оси X (логарифмическая шкала) – размер файла в Мб.
Представим результаты в табличном виде.

Само по себе время прохождения теста в абсолютном значении нам тут неинтересно. Главное, что нам нужно понять, – длительность относительно времени работы на целевом в нашем тесте размере файла в 128 Мб.
Выводы
На реперной точке 2 Мб – результат в 1.8х раз хуже (вспоминаем результаты тестов коллег, где файлов в 10 раз меньше: HDFS - 1.5х, S3 API Ozone 4х, minIO - 8х);
В проведенном эксперименте значительная (больше чем 1.8 раза) деградация производительности начиналась только при размере файлов меньше 4 Мб;
-
В целом можно сделать вывод, что средние размеры файлов в 10-12 Мб еще могут являться допустимыми для эксплуатации, а далее наступает деградация:
Наш best practice для максимальной производительности: метрика среднего размера файла на всем кластере (весь объем / количество всех файлов) должна быть не ниже 30-40 Мб;
Максимальная деградация в 2.5 раза относительно размера файла в 128 Мб была зафиксирована при размере 256 Кб;
Несмотря на то, что интенсивность обращения к объектному хранилищу в несколько раз выше, чем у эксперимента коллег, максимальное снижение производительности в 2.5 раза при 256 Кб и 1.8 раза при 2 Мб в нашем случае далеко от заявленных коллегами 10+ раз (до 1000%+). При этом во время нашего эксперимента SQL-движок создавал на объектное хранилище нагрузку в 40 раз больше, чем в тесте коллег.
Для закрепления полученных результатов и усиления своей точки зрения не станем прибегать к поиску ссылок в интернете и компиляции pdf-документов в стиле аналитических записок. Вместо этого предлагаем пригласить нашу команду на очное тестирование, чтобы убедиться и сделать выводы на личном примере.
Существует ли вообще проблема маленьких файлов?
Конечно, существует! Для своевременного предотвращения деградации в решениях класса Lakehouse или Data Lake важно превентивно бороться с этой проблемой и мониторить состояния объекта, оценивая средний размер файла. Особенно сильно проблема маленьких файлов проявляется при real-time загрузке данных. Для таких сценариев процесс компактирования и обслуживания настраивается до начала подключения потока данных.
В пределе эта проблема не только влияет на производительность, но и в случае ставших мейнстримом Iceberg-таблиц «ломает» их из-за приведения в необслуживаемое состояние. В итоге в запущенном случае потребуется неадекватно большое количество ресурсов кластера, чтобы сделать компакцию таблицы. Запросы на чтение значительно замедляются по времени на уровне SQL-compute, когда необходимо прочитать в 100х+ больше файлов и метаданных iceberg.
В нашей платформе Data Ocean Nova есть встроенный managed-сервис обслуживания Iceberg с графическим интерфейсом, который является частью платформы и избавляет пользователей от создания самостоятельных проектных решений.
А как же HDFS?
C практической точки зрения HDFS namenode ограничена 200М-300М файлов, независимо от их размера. Хотя, при этом существует абсолютный максимальный лимит fsimage inode 2^31 (2 млрд).
Почему так происходит? Причин несколько:
Утилизация памяти на heap namenode (старая добрая JVM) и GC больших heap-ов самих по себе. В среднем на 150 млн объектов heap-область будет порядка 100 ГБ;
«Снапшутирование» HDFS – часто используемый подход в крупных промышленных кластерах, как минимум для задачи репликации и изолирования изменений без использования открытых табличных форматов. Если включить его, при 5 снапшотах на объект и всего лишь 5% изменений в каждом (обе цифры – очень консервативная оценка, на моей практике эксплуатации 5 Пт кластера HDFS на «снапшутирование» уходит до 20% объема при 3х снапшотах на объект) размер heap будет умножен на 1.3: для 150 млн объектов – 130 ГБ. Если продолжить эксперимент, то для 300 млн объектов – 260 ГБ;
Этот расчет характерен для файловых колоночных форматов parquet / orc. А теперь давайте представим, что у нас табличный формат Iceberg. Что он добавит? Появляется много метафайлов. Их количество сопоставимо с количеством дата-файлов + delete-файлы накопленных изменений + большая фрагментация самих дата-файлов + версионирование Iceberg. Как следствие, количество «полезных» файлов (именно файлов данных актуального снапшота iceberg) будет уже практически 30-50М на namenode, так как остальную «квоту» займет сопутствующее окружение Iceberg. Не стоит забывать и о непрерывности сервиса: время старта namenode на практике ~30 минут.
Как решают проблемы мелких файлов в HDFS? В первую очередь, следят за средним размером файлов и укрупняют их. В случае Iceberg, как и в S3, помогают обслуживание и компакция Iceberg-таблиц и манифестов. Если же количество файлов с учетом регламентного обслуживания все равно превышает практический предел, то используют HDFS-федерацию, но сложность решения и инсталляции с федерацией значительно увеличивается, потому что:
Каждая namenode требует своего HA;
Namespace изолированы: нельзя сделать move для перемещения, только копирование;
Балансировка нагрузки по namenode становится ручной: нет автоматического распределения, планирование размещения данных выполняется вручную, ведь дата-узлы могут быть перегружены одним namespace;
Операционная сложность: бэкап/рестор/репликации, HA-конфигурации, обновление версий, задание квот (per namespace), разграничение ресурсов и требования к компетенциям администраторов усложняются.
Все эти проблемы и являлись мотиватором миграции HDFS-федераций в native S3 решения (Ceph, minIO, public cloud S3), а также поводом создания самого проекта Apache Ozone.
А как же Greenplum?
Сперва – немного известных фактов об устройстве postgres / GP:
-
В postgres каждая секция каждой таблицы имеет свой набор файлов данных:
Сами дата-файлы со страничной организацией внутри и разбивкой по 1 Гб (каждый следующий гигабайт – новый файл);
Служебные файлы: free space map (FSM), visibility map (VM), _init (для unlogged-таблиц);
Индекс-файлы (если есть индексы);
GP состоит из сегментов. На одном физическом узле работает от 4 до 8 сегментов, каждый сегмент – инстанс postgres + один активный общий мастер и его standby postgres;
Главный тип таблиц в GP для аналитики / DWH – Append Only Column Oriented таблицы (АОСО): на каждом сегменте на каждую секцию на каждую колонку – свой файл данных с логикой пункта 1 по составу и по разбивке. Помимо колонок видимых есть еще технические колонки: 33 шт на AOCO, на них по одному файлу на секцию;
Второй ключевой тип таблиц – AOT Row – Append Only Row Oriented – со сжатием, но строчным хранением, существенно менее оптимален для HTAP- /OLAP-нагрузки для больших кластеров (меньше сжатие, нет возможности колоночных чтений). Но логика ближе к postgres в плане файлов: создается по одному дата-файлу на 1 Гб данных на одну секцию;
Все крупные таблицы должны быть распределены близко к равномерной дистрибьюции по всем сегментам (которые по сути и являются единицами параллелизма). Соответственно, каждый сегмент имеет свой кусочек каждой секции со всеми ее файлами для параллельной обработки (storage и compute жестко соединены + симметричный mpp-процессинг);
Каталог pg_catalog реплицируется на каждый сегмент;
Там, где далее по тексту используется термин «количество секций» кластера (или еще корректнее «количество объектов в терминах pg_catalog»), имеется в виду сумма количества всех таблиц без секций + сумма количества всех секций всех секционированных таблиц на всем кластере.
Проведем реальный практический эксперимент деградации работы pg_catalog
-
Сайзинг стенда:
On-prem выделенное оборудование, 4 сегмент-хоста с характеристиками 64 CPU Cores, 1 Tb RAM, 8 сегментов на хост;
Дисковая подсистема сегмент-хоста состоит из 2х массивов RAID-10 по 4х Enterprise NVMe PCIE gen4 х4 lines диска каждый (всего 8 дисков соответственно);
Локальная сеть 100 Гбс и дополнительный 100 Гбс бондинг для резервирования;
(!)Все цифры, полученные в эксперименте ниже, являются максимально производительными ввиду использования NVMe дисковой подсистемы и пропускной способности сети в 100 Гбс;
Сделаем 331 AOCO таблицу. В каждой таблице – 100 колонок (с учетом технических колонок – 133). В сумме по всем таблицам – 5,4 млн секций, 32 млн мелких файлов на каждом сегменте (!). В таблицах еще 0 строк, не создались файлы на каждую колонку. При первой операции INSERT хотя бы одной строки – там, куда попадает строка, будет +100 файлов на сегменте при всех заполненных секциях, не менее чем стократно умноженное количество секций каждой таблицы на каждом сегменте или примерно х15 файлов для этого кейса. Появление файлов на колонках не повлияет далее на работу каталога, а вот работу SELECT/DML и файловую систему физического узла изменит кардинально. Но мы тестируем пока что эффекты работы с каталогом, потому что кластер, увы, останавливается уже тут;
Системный каталог занимает 12 Тб до vacuum (картинка ниже) и 9 Тб после, в том числе потому что он replicated на всех сегментах. Дата-файлы с 0 фактических строк заняли 11 Тб – это уже реальная big data на пустом, буквально, месте!

-
Замеры и выводы при 0 строках в самих AOCO таблицах данных:
На 400к секций (взяли такую точку как наиболее релевантную крупным кластерам) запросы к каталогу уже деградируют до 5 секунд;
На 5,4 М секций – деградация уже больше минуты (75 секунд, а после vacuum full системного каталога – 55 секунд);
Динамика деградации линейна: на каждые 10к пустых секций приходятся плюсом дополнительные 100 Мс;
При 5.4 М секций: неконкурентный DDL в одну сессию (CREATE новой пустой дополнительной таблицы на 1000 секций) – 10 секунд, DROP пустой таблицы - 10 минут!
Конкурентные операции dml/ddl на 80-100 сессий над каталогом при 400К секций полностью останавливают работу кластера!

С AOT Row все получше: 1 млн секций AOT Row и 500 одновременных запросов на указанном типе дисков при правильном тюнинге – это порог, когда кластер пока еще не деградирует в части обращений к pg_catalog.
С практической точки зрения в промышленной эксплуатации важно количество конкурентных сессий. Да и сам оптимизатор на каждом запросе тоже пользуется каталогом.
Получается, что практические архитектурные ограничение Greenplum следующие:
AOCO – количество секций в рамках одного мощного физического кластера, собранного с NVMe-дисками: ~300К на кластер и 100 конкурентных сессий с минимальной нагрузкой – предел, независимо от аппаратного обеспечения для одного физического кластера GP;
AOT Row – 1 млн секций и 500 сессий для NVMe-дисков и достаточного кол-ва RAM.
Существенное замедление операций SELECT/DML/DDL, простой кластера на vacuum-операции каталога и дата-файлов, скорости и вообще выполнения операций обслуживания -backup\restore и репликации называется проблемой «bloat каталога GP».
Увы, как бы ни хотелось, Greenplum не переваривает большое количество мелких файлов из-за своей архитектуры, просто залипая на первичном шаге – листинге объектов pg_catalog’а.
Подводя итоги
С одной стороны, был проведен экстремальный эксперимент на 5,4 млн секций в Greenplum, что, конечно, является фантастикой. Но и не мы утверждаем, что GP масштабируется на ПЕТАБАЙТЫ сжатых данных с значимой конкурентной нагрузкой.
C другой стороны, крупные кластеры GP на пару сотен Тб в реальной жизни имеют те самые 100-400 тысяч секций AOCO, что, как мы видим, и является близким к технологическим пределам одного кластера.
За эксперимент и материал с Greenplum спасибо Марку Лебедеву и его команде! Недавно, кстати, Марк опубликовал большой качественный материал по сравнению производительности GP6, GP7 и Cloudberry. Рекомендую к прочтению.
В заключение, по традиции, анонсирую следующую статью на тему распределенных файловых хранилищ для аналитики «Сравнительное тестирование производительности: Apache Ozone vs S3 minIO». Также на подходе очередная итерация нагрузочного тестирования по методике TPC-DS со StarRocks и Spark. Обещаю, будет, как всегда, интересно и познавательно.
Справка о компании:
Data Sapience — российский вендор, разработчик ИТ-решений для бизнеса. Разработкой продуктов занимается команда с 15-летним опытом работы в консалтинге и с ведущими вендорами. Продукты организации состоят в Реестре отечественного ПО: CM Ocean – платформа CVM-маркетинга; TALYS Ocean – платформа интегрированного управления рисками; Kolmogorov AI — платформа аналитики данных, машинного обучения и MLOps; Data Ocean Governance – платформа управления данными организации; Data Ocean – универсальная Lakehouse-платформа данных.
Следите за обновлениями и подписывайтесь на телеграм-канал Data Sapience.
Комментарии (9)
StanislavRG
27.08.2025 03:45Коллеги, а в чем Ваши тайные знания настройки? Взять в два раза больший по ресурсам экземпляр Minio и получить границу деградации в другом диапазоне? Настройка Minio для подобных тестов очень подробно описана в расширенной статье сравнения Minio vs HDFS самими инженерами Minio (Minio vs HDFS), это не искусство. Достаточно только повторить, со своими параметрами.
Важно, а где пример c HDFS, Ozone, на сколько они деградировали на подобном оборудовании? Правильно, они возможно с этим оборудованием вообще не дошли бы до границы деградации. И главное, Вы не очень поняли суть статьи, на деградацию влияет не сам по себе размер файлов. Процессинговый движок «выедает» ресурс (rps) s3 при обработке этих маленьких файлов и начинается интенсивная деградация. Вы получили деградацию в 2,5! раза на границы 140 тыс. файлов за 1000 сек. Прекрасно! Увеличите взятое количество файлов (так как ресурсов выделено значительно больше) и когда получите 8-10, то дальше, сравните это с HDFS (Ozone) и может мы сойдемся в результатах.)) В целом, считаю это подтверждением выводов, которые я представил в своей статье. Спасибо!
EvgenyVilkov Автор
27.08.2025 03:45Добрый день.
Для эксперимента выбрана минимально достаточная конфигурация кластера minio для промышленной эксплуатации. Даже на самом минимальном пилотном проекте или эксперименте никто не собирает minio меньше, чем на 4 узла с характеристиками в 8 vCPU и 32Gb RAM и 4-мя выделенными дисками на каждый узел. Именно такой нижний порог рекомендован и самой minio (раздел hardware-документации). Уж если и тестировать, то тестировать рабочую минимально достаточную конфигурацию, а не "калькуляторы".
Мы не ограничиваемся документацией сообщества minio относительно настроек и конфигурации. У нас имеются свои наработки и изменения относительно oss. Кроме настроек самой файловой системы, настраиваться должны абсолютно все компоненты: начиная от операционной системы, заканчивая процессинговых движком и\или приложением, работающим с S3.
Помимо большего в 10 раз количества файлов, напомню, что нагрузка создается в нашем эксперименте в 4 раза выше, тк тест выполняется в 4-е параллельные сессии. И, согласно методике TPC-DS, эти сессии не пересекаются по запросам. Именно поэтому в нашем тесте нагрузка создается в 40 раз выше, хоть и ресурсов в два раза больше.
Также мы всегда пользуемся правом не доверять любой документации в открытом доступе, потому что:
— Опубликованные материалы очень быстро теряют свою актуальность. Статья, выпущенная 3-4 года назад, очень быстро становится неактуальной;
— Авторы могут ошибаться, даже если они аффилированы с вендором и выступают от его лица.Данная публикация преследовала следующие цели:
показать что вывод оригинальной статьи в части s3 minio не верен, а значит ставит под сомнение содержание всей статьи
рассказать о деталях архитектуры HDFS и GP в части маленьких файлов, показав что by design файлов быть много там не может. 3)
Дать ответ на вопросы коллег, возникающие при общении в нашем дружном дата сообществе
Я не призываю никого безапелляционно верить кому либо . Наоборот, прошу читателей засомневаться в любых утверждениях и пригласить и нас, и вас на тестирования и сделать выводы и выбор самостоятельно.
Mapar
27.08.2025 03:45В Greenplum файл - это партиция/таблица (для AOCO колонка таблицы/партиции), если записать в таблицу Greenplum 1000 раз по 1 записи и 1 раз по 1000 записей количество файлов не изменится (для AO будет не полностью заполнен блок, но мы же про файлы). В Iceberg - файл отдельный факт модификации таблицы - записать 1 раз 1000 строк - 1 файл, а 1000 раз по 1 строке - 1000 файлов.
Т.е. в Greenplum количество файлов - это элемент планирования и проектирования структуры, а в Iceberg - зависит от нагрузки и политики компекшен.Мне кажется это уже не техническая статья, а элемент маркетнинга/рекламы своего продукта, отсюда притянутое за уши сравнение с Greenplum, а также комментария про "недостаточный технический опыт" в начале статьи, что на мой взгляд не очень корректно по отношению к автору первоначальной статьи.
EvgenyVilkov Автор
27.08.2025 03:45Добрый день.
Автор утверждает, что Greenplum является лучшим выбором для задачи реал-тайм загрузки и репликации данных. Даже лучше, чем HDFS и minIO. По нашему мнению, данное утверждение не соответствует практическим реалиям. Не то чтобы реал-тайм, а даже обычная батч-обработка имеет свои технические архитектурные ограничения, которые мы приводим. Получены они практическим путем на реальном сценарии и клиенте, и, замечу, на серьёзном промышленном оборудовании. Нет ни одной инсталляции в мире, где в Greenplum бы бы реализован хоть какой-то серьезный онлайн. И не просто так.
Посыл нашего материала, как и материала компании Аренадата, направлен на презентацию преимуществ собственных решений относительно альтернативных, но это не преуменьшает техническую ценность статей. Однако, согласны ли вы адресовать свой вопрос о маркетинге\рекламе и к компании Аренадата?
Miha_S7
27.08.2025 03:45Проблема с распуханием каталога в GP при увеличении количества объектов есть. Но количество файлов можно увеличить не только увеличением количества метаданных, а самими данными. Чтобы в диск не упираться, можно было перекомпилить GP с меньшим размером файлов (<1ГБ) и нагенерить файлов вставкой в таблицы. Тогда бы было честнее. А так - сравнение тёплого с мягким, бессмсленное.
EvgenyVilkov Автор
27.08.2025 03:45Вы правы, но есть один нюанс - вакуумирование избавит от мелких файлов, вызванных мелкими вставками. А вот с каталогом так не получится.
Miha_S7
27.08.2025 03:45Как же он избавит, если все данные будут живыми? Мне кажется, вам просто следовало для чистоты эксперимента сделать меньше метаданных и большее количество файлов под этими метаданными, вот и всё.
Ваш подход - "нужно N файлов; давай нагенерим таблиц столько, чтобы метаданные по ним дали N файлов". А есть ещё другой - "нужно N файлов; давай нагенерим разумное число таблиц и сгенерим для них реальные данные, чтобы получилось N файлов". Вы в случае с GP даже не дошли до тестирования как он работает с множеством файлов ДАННЫХ, упёршись в методы работы с каталогом.
Кстати, откуда в случае с SQL движком над HDFS и S3 берутся медатанные и в чём отличие методов работы с ними от GP? Что там происходит при выполнении DDL?
AlekseyPeregudov
Добрый день. Не могли бы вы раскрыть, какие проблемы решаются использованием S3 Storage взамен классической архитектуры? (Если сформулировать вопрос совсем просто - зачем это надо?).
Бесконечное и прозрачное масштабирование? Ок, принимается. Но это же размен легкости разовых mantainance-tasks на постоянные real-time проблемы?
Облачное хранение? Но если это не Amazon, то облачные провайдеры вполне себе предоставляют блочные устройства.
Хочется понять point статьи - это про замену GreenPlumb и Arenadata DB на Data Ocean Nova или про использование S3 и HDFS как универсального хранилища систем класса DataLake?
EvgenyVilkov Автор
Добрый день. Про сравнение классических архитектурных решений и систем класса лейкхаус со всеми мотивациями, преимуществами, сильными и слабыми сторонами, можно ознакомиться в другом материале, например тут. В данной публикации ставится под сомнение утверждение, о том, что HDFS и GP более толерантны к работе с маленькими файлами чем S3 решение minIO.
Мой практический проектный опыт построения подобных систем на обеих технологиях не совпадает с утверждениями коллег, к сожалению. О том как real-time организуется в окружении Hadoop вы можете почитать тут.