我有一份hadoop的工作。当工作被陈述时,我开始使用一些映射器。每个映射器都会将一些文件写入磁盘,例如part-m-00000,part-m-00001。据我所知,每个映射器创建一个零件文件。我有大量的数据,所以必须有多个映射器,但我可以以某种方式控制这个输出文件的数量?我的意思是,hadoop将启动,例如10个映射器,但是只有三个部分文件?
我找到了这篇文章 How do multiple reducers output only one part-file in Hadoop? 但是有使用旧版本的hadoop库。我正在使用org.apache.hadoop.mapreduce。*中的类而不是org.apache.hadoop.mapred中的类。*
我正在使用hadoop版本0.20和hadoop-core:1.2.0.jar
使用新的hadoop API是否有可能做到这一点?
答案 0 :(得分:5)
如果没有减速器,则输出文件的数量等于减速器的数量或映射器的数量。
您可以向作业添加一个reducer,以便将所有映射器的输出定向到它,并获得单个输出文件。请注意,效率会降低,因为所有数据(映射器的输出)都将通过线路(网络IO)发送到减速器将运行的节点。此外,由于单个进程(最终)将获得所有数据,因此它可能会运行得更慢。
通过wat,有多个部分的事实不应该非常重要,因为你可以将包含它们的目录传递给后续作业
答案 1 :(得分:0)
我不确定你能做到(你的链接是关于多个输出没有收敛到只有一个),为什么只使用一个输出?你会失去排序的所有并行性吗?
我也在处理大文件(每个大约10GB),我的MR处理每个大约100GB。因此,为了降低地图编号,我在hdfs中设置了较大的块大小值(仅适用于较新的文件),mapred.min.split.size
中的mapred-site.xml
值更高
答案 2 :(得分:0)
您可能需要查看MultipleOutputFormat
Javadoc所说的部分内容:
这个抽象类扩展了FileOutputFormat,允许编写 输出数据到不同的输出文件。
Mapper和Reducer都可以使用它。
检查this link,了解如何从不同的映射器指定输出文件名或更多以输出到HDFS。
注意:此外,请确保您不使用context.write(),以便不会创建10个映射器中的10个文件。仅使用MultipleOutputFormat输出。
答案 3 :(得分:0)
如果作业没有reducers,partitioners和combiners,则每个mapper输出一个输出文件。在某些时候,你应该运行一些后期处理来将输出收集到大文件中。