Почему hasoop не может разделить большой текстовый файл, а затем сжать разделение с помощью gzip? - PullRequest
7 голосов
/ 28 июня 2011

Я недавно изучал Hadoop и HDFS. Когда вы загружаете файл в HDFS, он обычно разделяет файл на куски по 64 МБ и распределяет их по всему кластеру. За исключением того, что он не может сделать это с файлами gzip'd, потому что файл gzip'd не может быть разделен. Я полностью понимаю, почему это так (мне не нужно, чтобы кто-нибудь объяснял, почему файл gzip не может быть разделен). Но почему HDFS не может взять простой текстовый файл в качестве входных данных и разделить его, как обычно, а затем сжать каждый раздел с помощью gzip отдельно? При обращении к любому разделению он просто распаковывается на лету.

В моем сценарии каждый сплит сжимается полностью независимо. Между разделениями нет никакой зависимости, поэтому вам не нужен весь исходный файл для распаковки любого из разделений. Этот подход использует этот патч: https://issues.apache.org/jira/browse/HADOOP-7076, обратите внимание, что это , а не , что я хотел бы.

Это кажется довольно простым ... что мне не хватает? Почему это не могло быть сделано? Или, если это можно сделать, почему разработчики Hadoop не смотрели вниз по этому пути? Это кажется странным, учитывая, сколько обсуждений я нашел относительно людей, которые хотят разделить файлы gzip'd в HDFS.

Ответы [ 2 ]

8 голосов
/ 29 июня 2011

Простая причина заключается в конструктивном принципе «разделения интересов».

Если вы делаете то, что предлагаете, тогда HDFS должна знать, что означают действительные биты и байты файла.Также HDFS должна быть способна рассуждать об этом (т.е. извлекать, распаковывать и т. Д.).В общем, вы не хотите, чтобы в программном обеспечении смешивались такие обязанности.

Таким образом, «единственная» часть, которая должна понять, что означают эти биты, - это приложение, которое должно уметь его читать: что обычнонаписано с использованием части MapReduce Hadoop.

Как указано в Javadoc HADOOP-7076 (я написал эту вещь;)):

Всегда помните, что существуют альтернативные подходы:

HTH

1 голос
/ 13 июня 2018

HDFS имеет ограниченную область действия, являясь только службой распределенной файловой системы, и не выполняет тяжелых операций, таких как сжатие данных. Фактический процесс сжатия данных делегируется распределенным средам выполнения, таким как Map-Reduce, Spark, Tez и т. Д. Таким образом, сжатие данных / файлов является задачей среды выполнения, а не файловой системы.

Кроме того, наличие форматов файлов-контейнеров, таких как Sequence-file, Parquet и т. Д., Устраняет необходимость в HDFS для автоматического сжатия блоков данных, как предполагает вопрос.

Таким образом, чтобы подвести итог из соображений философии проектирования, любое сжатие данных должно выполняться механизмом выполнения, а не службой файловой системы.

...