Подтвердить что ты не робот

Hadoop: сжатие файла в HDFS?

Недавно я установил компрессию LZO в Hadoop. Каков самый простой способ сжать файл в HDFS? Я хочу сжать файл, а затем удалить оригинал. Должен ли я создать задание MR с IdentityMapper и IdentityReducer, которое использует сжатие LZO?

4b9b3361

Ответ 1

Я предлагаю вам написать задание MapReduce, которое, как вы говорите, просто использует Identity mapper. В то время как вы находитесь на нем, вам следует рассмотреть возможность записи данных в файлы последовательности, чтобы повысить производительность загрузки. Вы также можете хранить файлы последовательности в блочном уровне и сжатии уровня записи. Yo должен видеть, что лучше всего подходит для вас, поскольку оба оптимизированы для разных типов записей.

Ответ 2

Для меня это ниже, чтобы написать Hadoop Streaming для сжатия файлов.

Это команда, которую я запускаю:

hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \
  -Dmapred.output.compress=true \
  -Dmapred.compress.map.output=true \
  -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
  -Dmapred.reduce.tasks=0 \
  -input <input-path> \
  -output $OUTPUT \
  -mapper "cut -f 2"

Я также, как правило, записываю вывод в папку temp, если что-то пойдет не так:

OUTPUT=/tmp/hdfs-gzip-`basename $1`-$RANDOM

Еще одно замечание, я не указываю редуктор в потоковой работе, но вы, безусловно, можете. Он заставит все строки сортироваться, что может занять много времени с большим файлом. Возможно, есть способ обойти это, переопределив разделитель, но я не стал это понимать. Несчастливой частью этого является то, что вы потенциально в конечном итоге со множеством небольших файлов, которые не используют блоки HDFS эффективно. Это одна из причин заглянуть в Hadoop Archives

Ответ 3

@Chitra Я не могу комментировать из-за проблемы с репутацией.

Здесь все в одной команде: вместо использования второй команды вы можете напрямую сжать в один сжатый файл

hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \
        -Dmapred.reduce.tasks=1 \
        -Dmapred.output.compress=true \
        -Dmapred.compress.map.output=true \
        -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec \
        -input /input/raw_file \
        -output /archives/ \
        -mapper /bin/cat \
        -reducer /bin/cat \
        -inputformat org.apache.hadoop.mapred.TextInputFormat \
        -outputformat org.apache.hadoop.mapred.TextOutputFormat

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

Например, скажем, у меня есть 4 файла из 10 МБ (это обычный текст, форматированный JSON)

Только карта дает мне 4 файла размером 650 КБ Если я сопоставляю и уменьшаю, у меня есть 1 файл размером 1.05 МБ

Ответ 4

Команда потоковой передачи Jeff Wu вместе с конкатенацией сжатых файлов даст один сжатый файл. Когда передатчик не java передается в потоковое задание, а формат ввода - это потоки текстовых потоков, а только значение, а не ключ.

hadoop jar contrib/streaming/hadoop-streaming-1.0.3.jar \
            -Dmapred.reduce.tasks=0 \
            -Dmapred.output.compress=true \
            -Dmapred.compress.map.output=true \
            -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
            -input filename \
            -output /filename \
            -mapper /bin/cat \
            -inputformat org.apache.hadoop.mapred.TextInputFormat \
            -outputformat org.apache.hadoop.mapred.TextOutputFormat
hadoop fs -cat /path/part* | hadoop fs -put - /path/compressed.gz

Ответ 5

Это то, что я использовал:

/*
 * Pig script to compress a directory
 * input:   hdfs input directory to compress
 *          hdfs output directory
 * 
 * 
 */

set output.compression.enabled true;
set output.compression.codec org.apache.hadoop.io.compress.BZip2Codec;

--comma seperated list of hdfs directories to compress
input0 = LOAD '$IN_DIR' USING PigStorage();

--single output directory
STORE input0 INTO '$OUT_DIR' USING PigStorage(); 

Хотя это не LZO, это может быть немного медленнее.

Ответ 6

Ну, если вы сжимаете один файл, вы можете сэкономить некоторое пространство, но вы не можете использовать Hadoop power для обработки этого файла, так как декомпрессия должна выполняться одной задачей карты последовательно. Если у вас много файлов, Hadoop Archive, но я не уверен, что он включает любое сжатие. Основной прецедент для сжатия, о котором я могу думать, это сжатие вывода Maps, которое должно быть отправлено на Reduces (сохранение на сетевом вводе/выводе).

О, чтобы ответить на ваш вопрос более полно, вам, вероятно, понадобится реализовать собственный RecordReader и/или InputFormat, чтобы убедиться, что весь файл прочитан одной задачей Map, а также использовал правильный фильтр декомпрессии.