假设我在hdfs上有这样的结构:
/dir1
/dir2
/Name1_2015/
file1.lzo
file2.lzo
file3.lzo
/Name2_2015
file1.lzo
file2.lzo
Name1_2015.lzo
我想合并'dir2'中每个目录的每个文件,并将结果附加到/dir1/dirname.lzo中的文件
例如,对于/dir1/dir2/name1\u 2015,我希望合并file1.lzo、file2.lzo、file3.lzo并将其附加到/dir1/name1\u 2015.lzo
每个文件都经过lzo压缩。
我该怎么做?
谢谢
3条答案
按热度按时间lrpiutwd1#
如果您不太关心并行性,这里有一个bash one liner:
可以使用map reduce并行提取所有文件。但如何从多个文件并行创建一个存档?据我所知,不可能同时从多个进程写入单个hdfs文件。所以我们无论如何都不可能想出一个单节点的解决方案。
daolsyd02#
我会用Hive做这个,如下所示:
将子目录重命名为name=1\u 2015和name=2\u 2015
创建外部表,发送按(名称字符串)位置“/dir1/dir2”行格式分隔的字段进行分区的表(所有内容字符串){您知道在任何行中都没有显示的列分隔符}
在另一个目录中创建第二个与第一个表类似的表,名为“receiving”,但没有分区。
运行以下命令:
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
插入到接收表中从发送表中选择所有内容
mbzjlibv3#
您可以尝试将所有单独的lzo文件归档到har(hadoop归档)中。我认为把所有的文件合并成一个lzo是一种开销。