在hdfs上合并多个lzo压缩文件

4si2a6ki  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(540)

假设我在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压缩。
我该怎么做?
谢谢

lrpiutwd

lrpiutwd1#

如果您不太关心并行性,这里有一个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文件。所以我们无论如何都不可能想出一个单节点的解决方案。

daolsyd0

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
插入到接收表中从发送表中选择所有内容

mbzjlibv

mbzjlibv3#

您可以尝试将所有单独的lzo文件归档到har(hadoop归档)中。我认为把所有的文件合并成一个lzo是一种开销。

相关问题