将不同文件夹的 map-reduce 输出合并到单个文件夹中

Posted

技术标签:

【中文标题】将不同文件夹的 map-reduce 输出合并到单个文件夹中【英文标题】:Combine map-reduce output from different folders into single folder 【发布时间】:2013-11-14 14:11:47 【问题描述】:

我在网格上的 map-reduce 输出分布在多个文件夹中。每个文件的格式都是一样的。每个文件夹都有一堆文件: 示例:/folderpath/folder1/part-r-00001 到 /folderpath/folder1/part-r-00100 ... /folderpath/foldern/part-r-00001 到 /folderpath/foldern/part-r-00100

将内容组合在一起的最简单方法是什么,即将文件聚合到单个文件夹中(我想稍后使用) /folderpath/merged/part-r-0000* ... /folderpath/merged/part-r-000n

我可以想到 pig 脚本,它从每个路径读取输出并读取关系并集,然后转储它们。

还有其他选项/命令吗?

【问题讨论】:

【参考方案1】:

使用 Pig 会非常简单:

data = LOAD '/folderpath/folder*' USING PigStorage('\n');
STORE data INTO '/newfolderpath';

您也可以使用 hadoop shell 的 getmerge 函数,但这会将所有内容变成本地磁盘上的单个文件。

如果文件不是太大,这将是一种将其转换为 HDFS 上的单个文件的简单方法:

hdfs dfs -cat /folderpath/folder* | hdfs dfs -copyFromLocal - /newfolderpath/file

【讨论】:

是的,即使我之前也想到了猪脚本(如 ques 中所述)。我会去的。谢谢! 我确实在问题中看到了它,但请注意,它可能比您描述的更简单——无需单独阅读输入并执行UNION。只需LOAD 一次,然后STORE 哦,是的。那要简单得多!不需要联合。再次感谢。【参考方案2】:

老实说,我会使用 hadoop fs 命令编写一个简短的 bash 脚本。

hadoop fs -mv /source1/somefolder/.* /destination/somefolder
hadoop fs -mv /source2/somefolder/.* /destination/somefolder

为您需要移动的每个文件夹添加一行。

【讨论】:

这行不通,因为不同目录下的文件同名。 @WinnieNicklaus 只需指定绝对路径。例如,如果您有一个文件夹,请说以下内容:put /user/all/folders/back/to/root/source1/somefolder/.* 对其他文件夹执行相同操作。两个文件夹不可能有相同的绝对路径,这样应该可以解决问题。 对,但是文件本身是同名的,所以不重命名是不能放到同一个文件夹里的。 感谢您的建议。我猜猪脚本解决了重命名问题,所以我同意了!

以上是关于将不同文件夹的 map-reduce 输出合并到单个文件夹中的主要内容,如果未能解决你的问题,请参考以下文章

Map-Reduce作业无法提供预期的分区文件

DMHS搭建DMDSC 2节点集群同步到单库

不同形式的预编译会影响性能吗?

Hadoop合并小文件的几种方法

Keras,Tensorflow:将两个不同的模型输出合并为一个

map-reduce 中不同组件/动作的执行顺序