我们说我在HDFS上有这个结构:
NotifyAllClients(...)
我想合并' dir2'中每个目录的每个文件。并将结果附加到/dir1/DirName.lzo
中的文件例如,对于/ dir1 / dir2 / Name1_2015,我想合并file1.lzo,file2.lzo,file3.lzo并将其附加到/dir1/Name1_2015.lzo
每个文件都经过LZO压缩。
我该怎么做?
由于
答案 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做这件事,如下:
将子目录重命名为name = 1_2015,name = 2_2015
CREATE EXTERNAL TABLE sending_table ( all_content字符串 ) 分区(名称字符串) 位置&#34; / dir1 / dir2&#34; 行格式删除字段由{您知道不会出现在任何行中的列分隔符}终止}
创建第二个表,看起来像第一个,名为&#34;接收&#34;,但没有分区,在另一个目录中。
运行:
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中的开销。