我有一份hadoop的工作。当工作说明,我有一些绘图员开始。每个Map器都会将一些文件写入磁盘,比如part-m-00000,part-m-00001。据我所知,每个Map器创建一个零件文件。我有大量的数据,所以必须有一个以上的Map器,但我可以控制这个输出文件的数量吗?我的意思是,hadoop将启动,例如10个Map器,但是只有三部分文件?
我发现这篇文章如何在hadoop中多个reducer只输出一个part文件?但是有一个使用hadoop库的旧版本。我使用的是org.apache.hadoop.mapreduce.中的类,而不是org.apache.hadoop.mapred中的类
我使用的是hadoop版本0.20和hadoop-core:1.2.0.jar
有没有可能做到这一点,使用新的hadoopapi?
4条答案
按热度按时间ecr0jaav1#
输出文件的数量等于还原器的数量,如果没有任何还原器,则等于Map器的数量。
您可以向作业中添加一个reducer,这样所有Map器的输出都将指向它,您就可以得到一个输出文件。请注意,这样会降低效率,因为所有数据(Map器的输出)都将通过导线(网络io)发送到运行reducer的节点。另外,由于单个进程(最终)将获得所有数据,因此它可能运行得较慢。
顺便说一句,有多个部分的事实应该不是很重要,因为您可以将包含它们的目录传递给后续作业
tvokkenx2#
如果作业没有reducer、partitioner和combiner,则每个Map器输出一个输出文件。在某个时候,您应该运行一些后处理来将输出收集到一个大文件中。
ccrfmcuu3#
您可能想看看multipleoutputformat
javadoc说的一部分:
这个抽象类扩展了fileoutputformat,允许将输出数据写入不同的输出文件。
mapper和reducer都可以使用它。
查看此链接,了解如何从不同Map器指定一个或多个输出文件名以输出到hdfs。
注意:另外,请确保不要使用context.write(),这样10个Map器中的10个文件就不会被创建。仅使用multipleoutputformat输出。
6pp0gazn4#
我不确定你能做到这一点(你的链接是关于多个输出不收敛到只有一个),为什么只使用一个输出?你会失去排序的所有并行性吗?
我也在处理大文件(每个10gb左右),我的mr进程每个100gb左右。所以为了降低Map数,我在hdfs中设置了更高的块大小值(仅适用于较新的文件)和更高的
mapred.min.split.size
在mapred-site.xml