在HDFS上合并多个LZO压缩文件

时间:2015-07-24 14:24:10

标签: java hadoop mapreduce compression hdfs

我们说我在HDFS上有这个结构:

NotifyAllClients(...)

我想合并' dir2'中每个目录的每个文件。并将结果附加到/dir1/DirName.lzo

中的文件

例如,对于/ dir1 / dir2 / Name1_2015,我想合并file1.lzo,file2.lzo,file3.lzo并将其附加到/dir1/Name1_2015.lzo

每个文件都经过LZO压缩。

我该怎么做?

由于

3 个答案:

答案 0 :(得分:3)

如果你不太关心并行性,那么这就是bash one-liner:

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文件。因此,我们无法提供单节点解决方案。

答案 1 :(得分:2)

我会用Hive做这件事,如下:

  1. 将子目录重命名为name = 1_2015,name = 2_2015

  2. CREATE EXTERNAL TABLE sending_table ( all_content字符串 ) 分区(名称字符串) 位置&#34; / dir1 / dir2&#34; 行格式删除字段由{您知道不会出现在任何行中的列分隔符}终止}

  3. 创建第二个表,看起来像第一个,名为&#34;接收&#34;,但没有分区,在另一个目录中。

  4. 运行:

    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

    插入表格接收 从sending_table中选择all_content

答案 2 :(得分:1)

您可以尝试将所有单个LZO文件存档到HAR(Hadoop存档)中。我认为将所有文件合并到单个LZO中的开销。