Лучшее сплитматическое сжатие для входа Hadoop = bz2?
Мы слишком поздно поняли, что архивирование наших файлов в формате GZip для обработки Hadoop - не такая уж отличная идея. GZip не расщепляется, и для справки вот проблемы, которые я не буду повторять:
Мой вопрос: является ли BZip2 лучшим архивным сжатием, которое позволит обрабатывать один файл архива параллельно Hadoop? Gzip определенно нет, и из моего чтения у LZO есть некоторые проблемы.
Ответы
Ответ 1
BZIP2 является разделяемым в hadoop - он обеспечивает очень хорошую степень сжатия, но от времени процессора и производительности не обеспечивает оптимальных результатов, так как сжатие очень потребляет процессор.
LZO расщепляется в hasoop - используя hadoop-lzo, у вас есть сплитбельная сжатая LZO. Вам нужно иметь внешние .lzo.index файлы, чтобы иметь возможность обрабатывать параллельно. Библиотека предоставляет все способы генерации этих индексов локальным или распределенным образом.
LZ4 расщепляется в hasoop - используя hadoop-4mc, у вас есть сплиттируемые сжатые 4mc. Вам не нужна внешняя индексация, и вы можете создавать архивы с предоставленным инструментом командной строки или кодом Java/C внутри/вне hadoop. 4mc выпускается на hadoop LZ4 на любом уровне скорости/сжатия: от быстрого режима до 500 МБ/с при скорости сжатия до высоких/ультрамодулей, что обеспечивает повышенную степень сжатия, почти сравнимую с GZIP.
Ответ 2
Я не считаю правильный ответ правильным, bzip2 в соответствии с этим:
http://comphadoop.weebly.com/
расщепляется. LZO тоже индексируется.
Итак, ответ "да", если вы хотите использовать больше картографов, чем у вас есть файлы, тогда вы захотите использовать bzip2.
Чтобы сделать это, вы можете написать простое задание MR для чтения данных, а затем просто записать его снова, тогда вам нужно убедиться, что вы установили mapred.output.compression.codec
в org.apache.hadoop.io.compress.BZip2Codec
Ответ 3
Вот пять способов с gzip, три - с индексом, два - нет.
Можно создать индекс для любого файла gzip, т.е. специально не сконструированного, как это сделано zran.c. Затем вы можете начать декомпрессию на границах блоков. Индекс включает 32K несжатой истории данных в каждой точке входа.
Если вы создаете файл gzip, его можно сделать с помощью периодических точек входа, индекс которых не нуждается в несжатой истории в этих точках входа, делая для меньшего индекса. Это делается с опцией Z_FULL_FLUSH
на deflate()
в zlib.
Вы также можете сделать Z_SYNC_FLUSH
, за которым следует Z_FULL_FLUSH
в каждой такой точке, которая вставляет два маркера. Затем вы можете найти девятибайтный шаблон 00 00 ff ff 00 00 00 ff ff
, чтобы найти их. Это не отличается от поиска шестибайтового маркера в файлах bzip2, за исключением того, что ложный положительный результат гораздо менее вероятен с девятью байтами. Тогда вам не нужен отдельный индексный файл.
Оба gzip и xz поддерживают простую конкатенацию. Это позволяет вам легко подготовить архив для параллельной декомпрессии по-другому. Короче говоря:
gzip < a > a.gz
gzip < b > b.gz
cat a.gz b.gz > c.gz
gunzip < c.gz > c
cat a b | cmp - c
приведет к следующему результату сравнения.
Затем вы можете просто сжать куски нужного размера и объединить результаты. Сохраните индекс в смещениях начала каждого потока gzip. Декомпрессия от этих смещений. Вы можете выбрать размер кусков по своему усмотрению, в зависимости от вашего приложения. Если вы сделаете их слишком маленькими, сжатие будет затронуто.
С простой конкатенацией файлов gzip вы также можете отказаться от индекса, если вы сделали каждый кусок фиксированным несжатым размером. Затем каждый фрагмент заканчивается теми же четырьмя байтами, несжатая длина в порядке порядка юнитов, например. 00 00 10 00
для 1 кусков MiB, затем 1f 8b 08
из следующего фрагмента, который является началом заголовка gzip. Этот семибайтовый маркер можно искать так же, как маркер bzip2, хотя и с меньшей вероятностью ложных срабатываний.
То же самое можно сделать с конкатенированными файлами xz, заголовком которых является семь байтов: fd 37 7a 58 5a 00 00
.