Разделение ввода Hadoop для сжатого блока

Если у меня сжатый файл объемом 1 ГБ, который можно разделить, и по умолчанию размер блока и размер входного разбиения составляет 128 МБ, то создается 8 блоков и 8 входных разделений. Когда сжатый блок считывается по карте, он распаковывается и, скажем, после распаковки размер блока становится 200 МБ. Но входное разделение для этого назначенного составляет 128 МБ, так как обрабатывается остальная часть 82 МБ.

  1. Это обрабатывается следующим входным разделением?
  2. Увеличивается ли размер входного сплита?

3 ответа

Вот мое понимание:

Предположим, 1 ГБ сжатых данных = 2 ГБ распакованных данных, поэтому у вас есть 16 блоков данных, Bzip2 знает границу блоков, так как файл bzip2 обеспечивает маркер синхронизации между блоками. Таким образом, bzip2 разбивает данные на 16 блоков и отправляет данные 16 картографам. Каждый маппер получает распакованный размер данных 1 входной размер разделения = 128 МБ. (конечно, если данные не совсем кратны 128 МБ, последний маппер получит меньше данных)

Я имею в виду сжатые файлы, которые могут быть разделены на таблицы типа bzip2, который можно разделить. Что произойдет, если для блока bzip2 размером 128 МБ создается разделение входных данных, а при обработке карты сокращается обработка, когда она распаковывается до 200 МБ?

Общий размер файла: 1 ГБ

Размер блока: 128 МБ

Количество сплитов: 8

Создание разделения для каждого блока не будет работать, так как невозможно начать чтение с произвольной точки в потоке gzip и, следовательно, для задачи карты невозможно прочитать его разделение независимо от других. Формат gzip использует DEFLATE для хранения сжатых данных, а DEFLATE сохраняет данные в виде серии сжатых блоков. Проблема в том, что начало каждого блока никак не различается. По этой причине gzip не поддерживает разбиение.

MapReduce не будет разбивать gzip-файл, поскольку он знает, что входные данные сжаты gzip (путем просмотра расширения имени файла) и что gzip не поддерживает разбиение. Это будет работать, но за счет локальности: одна карта будет обрабатывать 8 блоков HDFS, большинство из которых не будут локальными для карты.

Взгляните на: эта статья и название раздела: Проблемы сжатия и разделения ввода

РЕДАКТИРОВАТЬ: (для разделения с разделением)

BZip2 - это алгоритм сжатия / распаковки, который выполняет сжатие блоков данных, и позже эти сжатые блоки могут быть распакованы независимо друг от друга. Это действительно возможность, что вместо того, чтобы один сжатый файл BZip2 отправлялся одному мапперу, мы можем обрабатывать куски файла параллельно. Критерий правильности такой обработки состоит в том, что для сжатого файла bzip2 каждый сжатый блок должен обрабатываться только одним преобразователем, и в конечном итоге должны обрабатываться все блоки файла. (Под обработкой мы подразумеваем фактическое использование этих несжатых данных (выходящих из кодеков) в картографическом устройстве)

Источник: https://issues.apache.org/jira/browse/HADOOP-4012

Другие вопросы по тегам