您的位置:首页 > 其它

MapReduce job.setNumReduceTasks(0)思考

2016-01-26 10:21 134 查看
一 概述

二 jobsetNumReduceTasks0唯一影响的是map结果的输出方式
1 有 reduce

2 无 reduce

三 总结

一. 概述

本文转自 http://zy19982004.iteye.com/blog/2068112?utm_source=tuicool&utm_medium=referral

/article/3724403.html 的最后曾经提到过,这里再详细探讨一下。

二. job.setNumReduceTasks(0)唯一影响的是map结果的输出方式

当 job.setNumReduceTasks(0) 时,即没有 reduce 阶段,此时唯一影响的就是 map 结果的输出方式

1. 如果有 reduce 阶段

map 的结果被 flush 到硬盘,作为 reduce 的输入;reduce 的结果将被 OutputFormat 的 RecordWriter 写到指定的地方(setOutputPath),作为整个程序的输出。

2. 如果没有 reduce 阶段

map 的结果将直接被 OutputFormat 的 RecordWriter 写到指定的地方(setOutputPath),作为整个程序的输出。

而 OutputFormat 可以是普通的 FileOutputFormat 等,也可以是一个空的 OutputFormat 如NullOutputFormat。

所以有无 reduce 和 OutputFormat 的多样性将组合出现以下情形(这个组合其实没什么意义,只是为了更加清楚而已)

2.1 有 reduce

reduce 的结果不需要输出到文件,如 reduce 里直接将结果插入 HBase,此时可以采用 NullOutputFormat,当然就不需要 setOutputPath。

reduce 的结果需要输出到文件,如采用 FileOutputFormat,需要 setOutputPath。

2.2 无 reduce

map 的结果需要不输出到文件,如 map 里直接将结果插入 HBase,此时可以采用 NullOutputFormat,当然就不需要 setOutputPath。

map 的结果需要输出到文件,如采用 FileOutputFormat,需要 setOutputPath。

三. 总结

有无 reduce 决定 map 结果的输出方式。有 reduce 时,reduce 的结果作为整个程序的输出;无 reduce时,map 的结果作为整个程序的输出。如果能在 map 阶段解决的问题尽量不要丢给直接输出的 reduce 如 IdentityReducer。

如 NullOutputFormat 层面上 OutputFormat 的不需要指定 OutputPath;其他如 FileOutputFormat 需要指定,不然

Exception in thread "main" org.apache.hadoop.mapred.InvalidJobConfException: Output directory not set.
at  org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:138)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: