Объединение нескольких сжатых файлов 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.