Объединение нескольких сжатых файлов LZO на HDFS

Скажем, у меня есть эта структура на HDFS:

/dir1
    /dir2
        /Name1_2015/
            file1.lzo
            file2.lzo
            file3.lzo
        /Name2_2015
            file1.lzo
            file2.lzo

    Name1_2015.lzo

Я хотел бы объединить каждый файл каждого каталога в 'dir2' и добавить результат в файл в /dir 1/DirName.lzo

Например, для /dir 1/dir2/Name1_2015, я хочу объединить файл1.lzo, file2.lzo, file3.lzo и добавить его в /dir 1/Name1_2015.lzo

Каждый файл сжат LZO.

Как я могу это сделать?

Спасибо

Ответ 1

Если вам не все равно parallelism здесь bash однострочный:

for d in `hdfs dfs -ls /dir2 | grep -oP '(?<=/)[^/]+$'` ; do hdfs dfs -cat /dir2/$d/*.lzo | lzop -d | lzop  | hdfs dfs -put - /dir1/$d.lzo ; done

Вы можете извлекать все файлы параллельно с помощью map-reduce. Но как вы создаете один архив из нескольких файлов параллельно? Насколько мне известно, невозможно одновременно записывать в один файл HDFS из нескольких процессов. Так как это невозможно, мы придумываем одно решение node.

Ответ 2

Я бы сделал это с Hive, следующим образом:

  • Переименуйте подкаталоги name = 1_2015 и name = 2_2015

  • СОЗДАТЬ ВНЕШНИЙ ТАБЛИЦА send_table ( Строка all_content ) PARTITIONED BY (строка имени) РАСПОЛОЖЕНИЕ "/dir1/dir2" ROW FORMAT DELIMITED FIELDS TERMINATED BY {разделитель столбцов, который, как вы знаете, не отображается ни в одной из строк}

  • Сделайте вторую таблицу, которая выглядит как первая, с именем "получение", но без разделов и в другом каталоге.

  • Запустите это:

    SET mapreduce.job.reduces = 1 #, это гарантирует, что он сделает один файл SET mapreduce.output.fileoutputformat.compress.codec = com.hadoop.compression.lzo.LzopCodec SET hive.exec.compress.output = true SET mapreduce.output.fileoutputformat.compress = true

    вставить в таблицу выберите all_content из send_table

Ответ 3

Вы можете попытаться архивировать все отдельные файлы LZO в HAR (Hadoop Archive). Я думаю, что его накладные расходы объединить все файлы в один LZO.