日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mapreduce的规约(Combiner)

發(fā)布時間:2023/12/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mapreduce的规约(Combiner) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

聽了超哥的一席課后逐漸明白了Combiner,記錄一下自己的理解!(thanks 超哥)

首先貼上兩段代碼:

code1:

package combine;import java.io.IOException; import java.net.URI;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Counter; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; /*** @ClassName: WordCount2 * @Description: TODO(這里用一句話描述這個類的作用) * @author zhangweixiang* @date 2014年3月6日 下午1:34:50*/public class WordCount2 {static final String INPUT_PATH="hdfs://192.168.0.9:9000/hello.txt";static final String OUT_PATH="hdfs://192.168.0.9:9000/word";public static void main(String[] args) throws Exception {Configuration conf=new Configuration();Job job=new Job(conf, WordCount2.class.getSimpleName());//1.1指定讀取的文件位置FileInputFormat.addInputPaths(job, INPUT_PATH);//指定如何對輸入文件進(jìn)行格式化,把輸入文件每一行解析成鍵值對job.setInputFormatClass(TextInputFormat.class);//1.2指定自定義的map類job.setMapperClass(MyMapper.class);//map輸出的<k,v>類型。如果<k3,v3>的類型與<k2,v2>的類型一致,則可以省略job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);//1.3分區(qū) // job.setPartitionerClass(HashPartitioner.class);//有一個reudce任務(wù)運行 // job.setNumReduceTasks(1);//1.4 排序、分組//1.5規(guī)約 // job.setCombinerClass(MyReduce.class);//2.2指定自定義的reduce類job.setReducerClass(MyReduce.class);//指定reduce的輸出類型job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);//刪除已存在的文件FileSystem fileSystem = FileSystem.get(new URI(OUT_PATH), new Configuration());Path path = new Path(OUT_PATH);if(fileSystem.exists(path)){fileSystem.delete(path, true);}//2.3指定寫出到哪里FileOutputFormat.setOutputPath(job,new Path(OUT_PATH) );//指定輸出文件的格式化類job.setOutputFormatClass(TextOutputFormat.class);//把Job提交給JobTracker執(zhí)行job.waitForCompletion(true);}/*** @ClassName: MyMapper * @Description: map任務(wù)處理* @param KEYIN 即k1 表示行的偏移量* @param VALUEIN 即v1 表示行的文本內(nèi)容* @param KEYOUT 即k2 表示行中出現(xiàn)的單詞* @param VALUEOUT 即v2 表示行中出現(xiàn)的單詞數(shù),固定值為1* @author zhangweixiang* @date 2014年3月4日 下午4:16:00*/static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{@Overrideprotected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {String string = value.toString();//自定義計數(shù)器(查詢hello的出現(xiàn),以及出現(xiàn)次數(shù))Counter counter = context.getCounter("查找hello", "hello");if(string.contains("hello")){counter.increment(1l);//出現(xiàn)一次+1}//分割字符串String[] split = string.split(" ");for(String word:split){context.write(new Text(word), new LongWritable(1));//map任務(wù)輸出}}}/*** @ClassName: MyReduce * @Description: reduce任務(wù)處理* @param KEYIN 即k2 表示行中出現(xiàn)的單詞* @param VALUEIN 即v2 表示行中出現(xiàn)的單詞個數(shù)* @param KEYOUT 即k3 表示文本中出現(xiàn)的不同單詞* @param VALUEOUT 即v3 表示文本中出現(xiàn)不同單詞的總次數(shù)* @author zhangweixiang* @date 2014年3月4日 下午4:23:20*/static class MyReduce extends Reducer<Text, LongWritable, Text, LongWritable>{protected void reduce(Text key, Iterable<LongWritable> values,Context context)throws IOException, InterruptedException {long sum=0;for (LongWritable longWritable : values) {sum+=longWritable.get();}context.write(key, new LongWritable(sum));//reduce輸出}} }

code2

package combine;import java.io.IOException; import java.net.URI;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Counter; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; /*** @ClassName: WordCount2 * @Description: TODO(這里用一句話描述這個類的作用) * @author zhangweixiang* @date 2014年3月6日 下午1:34:50*/public class WordCount2 {static final String INPUT_PATH="hdfs://192.168.0.9:9000/hello.txt";static final String OUT_PATH="hdfs://192.168.0.9:9000/word";public static void main(String[] args) throws Exception {Configuration conf=new Configuration();Job job=new Job(conf, WordCount2.class.getSimpleName());//1.1指定讀取的文件位置FileInputFormat.addInputPaths(job, INPUT_PATH);//指定如何對輸入文件進(jìn)行格式化,把輸入文件每一行解析成鍵值對job.setInputFormatClass(TextInputFormat.class);//1.2指定自定義的map類job.setMapperClass(MyMapper.class);//map輸出的<k,v>類型。如果<k3,v3>的類型與<k2,v2>的類型一致,則可以省略job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);//1.3分區(qū) // job.setPartitionerClass(HashPartitioner.class);//有一個reudce任務(wù)運行 // job.setNumReduceTasks(1);//1.4 排序、分組//1.5規(guī)約job.setCombinerClass(MyReduce.class);//2.2指定自定義的reduce類job.setReducerClass(MyReduce.class);//指定reduce的輸出類型job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);//刪除已存在的文件FileSystem fileSystem = FileSystem.get(new URI(OUT_PATH), new Configuration());Path path = new Path(OUT_PATH);if(fileSystem.exists(path)){fileSystem.delete(path, true);}//2.3指定寫出到哪里FileOutputFormat.setOutputPath(job,new Path(OUT_PATH) );//指定輸出文件的格式化類job.setOutputFormatClass(TextOutputFormat.class);//把Job提交給JobTracker執(zhí)行job.waitForCompletion(true);}/*** @ClassName: MyMapper * @Description: map任務(wù)處理* @param KEYIN 即k1 表示行的偏移量* @param VALUEIN 即v1 表示行的文本內(nèi)容* @param KEYOUT 即k2 表示行中出現(xiàn)的單詞* @param VALUEOUT 即v2 表示行中出現(xiàn)的單詞數(shù),固定值為1* @author zhangweixiang* @date 2014年3月4日 下午4:16:00*/static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{@Overrideprotected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {String string = value.toString();//自定義計數(shù)器(查詢hello的出現(xiàn),以及出現(xiàn)次數(shù))Counter counter = context.getCounter("查找hello", "hello");if(string.contains("hello")){counter.increment(1l);//出現(xiàn)一次+1}//分割字符串String[] split = string.split(" ");for(String word:split){context.write(new Text(word), new LongWritable(1));//map任務(wù)輸出}}}/*** @ClassName: MyReduce * @Description: reduce任務(wù)處理* @param KEYIN 即k2 表示行中出現(xiàn)的單詞* @param VALUEIN 即v2 表示行中出現(xiàn)的單詞個數(shù)* @param KEYOUT 即k3 表示文本中出現(xiàn)的不同單詞* @param VALUEOUT 即v3 表示文本中出現(xiàn)不同單詞的總次數(shù)* @author zhangweixiang* @date 2014年3月4日 下午4:23:20*/static class MyReduce extends Reducer<Text, LongWritable, Text, LongWritable>{protected void reduce(Text key, Iterable<LongWritable> values,Context context)throws IOException, InterruptedException {long sum=0;for (LongWritable longWritable : values) {sum+=longWritable.get();}context.write(key, new LongWritable(sum));//reduce輸出}} }




code1和code2的唯一區(qū)別就是
//1.5規(guī)約
job.setCombinerClass(MyReduce.class);

code1中加了注釋,code2啟用了規(guī)約!
接下來看看控制臺的輸出(我win8下的eclipse)
code1:
/06 13:52:17 INFO mapred.JobClient: Counters: 20
14/03/06 13:52:17 INFO mapred.JobClient: ? File Output Format Counters?
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Bytes Written=28
14/03/06 13:52:17 INFO mapred.JobClient: ? FileSystemCounters
14/03/06 13:52:17 INFO mapred.JobClient: ? ? FILE_BYTES_READ=424
14/03/06 13:52:17 INFO mapred.JobClient: ? ? HDFS_BYTES_READ=84
14/03/06 13:52:17 INFO mapred.JobClient: ? ? FILE_BYTES_WRITTEN=128676
14/03/06 13:52:17 INFO mapred.JobClient: ? ? HDFS_BYTES_WRITTEN=28
14/03/06 13:52:17 INFO mapred.JobClient: ? File Input Format Counters?
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Bytes Read=42
14/03/06 13:52:17 INFO mapred.JobClient: ? 查找hello
14/03/06 13:52:17 INFO mapred.JobClient: ? ? hello=2
14/03/06 13:52:17 INFO mapred.JobClient: ? Map-Reduce Framework
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Map output materialized bytes=126
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Map input records=4
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Reduce shuffle bytes=0
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Spilled Records=16
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Map output bytes=104
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Total committed heap usage (bytes)=266469376
14/03/06 13:52:17 INFO mapred.JobClient: ? ? SPLIT_RAW_BYTES=98
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Combine input records=0
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Reduce input records=8
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Reduce input groups=4
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Combine output records=0
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Reduce output records=4
14/03/06 13:52:17 INFO mapred.JobClient: ? ? Map output records=8



code2:
14/03/06 13:55:11 INFO mapred.JobClient: Counters: 20
14/03/06 13:55:11 INFO mapred.JobClient: ? File Output Format Counters?
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Bytes Written=28
14/03/06 13:55:11 INFO mapred.JobClient: ? FileSystemCounters
14/03/06 13:55:11 INFO mapred.JobClient: ? ? FILE_BYTES_READ=364
14/03/06 13:55:11 INFO mapred.JobClient: ? ? HDFS_BYTES_READ=84
14/03/06 13:55:11 INFO mapred.JobClient: ? ? FILE_BYTES_WRITTEN=129072
14/03/06 13:55:11 INFO mapred.JobClient: ? ? HDFS_BYTES_WRITTEN=28
14/03/06 13:55:11 INFO mapred.JobClient: ? File Input Format Counters?
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Bytes Read=42
14/03/06 13:55:11 INFO mapred.JobClient: ? 查找hello
14/03/06 13:55:11 INFO mapred.JobClient: ? ? hello=2
14/03/06 13:55:11 INFO mapred.JobClient: ? Map-Reduce Framework
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Map output materialized bytes=66
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Map input records=4
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Reduce shuffle bytes=0
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Spilled Records=8
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Map output bytes=104
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Total committed heap usage (bytes)=266469376
14/03/06 13:55:11 INFO mapred.JobClient: ? ? SPLIT_RAW_BYTES=98
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Combine input records=8
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Reduce input records=4
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Reduce input groups=4
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Combine output records=4
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Reduce output records=4
14/03/06 13:55:11 INFO mapred.JobClient: ? ? Map output records=8



通過code1和code2的輸出比較(紅色部分),相信大家已經(jīng)看出了區(qū)別!
code1中沒有使用規(guī)約,所以:
Combine input records=0
Reduce input records=8
?Reduce input groups=4
Combine output records=0

code2中使用了規(guī)約,所以:
?Combine input records=8
?Reduce input records=4
Reduce input groups=4
Combine output records=4


很明顯使用了規(guī)約后 Reduce input records=4減少map到reduce過程中數(shù)據(jù)的傳輸!


為什么要使用規(guī)約呢?(總結(jié)超哥的!)
/**
?* 問:為什么使用Combiner?
?* 答:Combiner發(fā)生在Map端,對數(shù)據(jù)進(jìn)行規(guī)約處理,數(shù)據(jù)量變小了,傳送到reduce端的數(shù)據(jù)量變小了,傳輸時間變短,作業(yè)的整體時間變短。
?*?
?* 問:為什么Combiner不作為MR運行的標(biāo)配,而是可選步驟哪?
?* 答:因為不是所有的算法都適合使用Combiner處理,例如求平均數(shù)。
?*
?* 問:Combiner本身已經(jīng)執(zhí)行了reduce操作,為什么在Reducer階段還要執(zhí)行reduce操作哪?
?* 答:combiner操作發(fā)生在map端的,處理一個任務(wù)所接收的文件中的數(shù)據(jù),不能跨map任務(wù)執(zhí)行;只有reduce可以接收多個map任務(wù)處理的數(shù)據(jù)。
?*
?*/




總結(jié)

以上是生活随笔為你收集整理的mapreduce的规约(Combiner)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲色图在线播放 | 岛国av不卡 | 日日夜夜网 | 中文资源在线观看 | 波多野吉衣在线视频 | 成人av综合网 | 我们的2018中文免费看 | 国产欧美精品一区二区三区 | 操天天 | 少妇性l交大片免费观看 | 欧美第一页草草影院 | 国产精品久久久久久人妻精品动漫 | 一区二区三区在线观看视频 | 男女做爰猛烈吃奶啪啪喷水网站 | 中国黄色一级片 | 国产精品宾馆在线 | 男人疯狂高潮呻吟视频 | 妺妺窝人体色WWW精品 | 免费网站污 | 国产一区二区网址 | 蜜桃视频在线观看污 | av在线播放器 | 国产一二在线观看 | 欧美人与野 | 国产精品成人在线 | 久久久久精彩视频 | 色综合加勒比 | 久久蜜臀 | 欧美日韩激情视频在线观看 | 亚洲高清视频在线 | 精品久久综合 | 国产区免费观看 | 中文字幕一区二区久久人妻 | 美女扒开让男人桶爽 | 国产欧美成人 | 一级黄色片免费在线观看 | 男女插插插网站 | 国产乱淫精品一区二区三区毛片 | 亚洲剧情在线 | 久草视频免费在线观看 | 俄罗斯黄色录像 | 99产精品成人啪免费网站 | 国产aa毛片 | 国产黄色三级 | 干干天天 | 日干夜干天天干 | 日本亚洲高清 | 91看片淫黄大片91桃色 | 成人在线高清视频 | 国产一级片免费在线观看 | 国产学生美女无遮拦高潮视频 | 色呦呦一区二区三区 | 亚州精品毛片 | 九色视频91| 中文字幕乱码一区 | 妓院一钑片免看黄大片 | 亚洲美女免费视频 | 欧美一区二区三区免费视频 | 久草99| 黄视频在线播放 | 国产一区二区三区视频免费观看 | 久久五月激情 | 91精品小视频 | 国产精品影片 | 在线观看无遮挡 | 青青青国产| 先锋影音资源av | 成人午夜久久 | 欧美精品一区二区视频 | 久久久人人爽 | 成人乱人乱一区二区三区一级视频 | 国产精品伊人 | 波多野结衣视频免费看 | 狠狠躁18三区二区一区传媒剧情 | 精品熟女一区二区 | 新版红楼梦在线高清免费观看 | 国产成人av一区二区三区在线观看 | 国内精品久久久久 | 国产三级三级看三级 | 亚洲免费黄色网 | 草草影院国产第一页 | 爱爱视频欧美 | 先锋影音av中文字幕 | 俄罗斯av片 | 日韩精品美女 | 黄色国产在线播放 | 人妻无码中文字幕免费视频蜜桃 | 久久理论视频 | 欧美理论视频 | 打屁股疼的撕心裂肺的视频 | 欧美日韩1区 | 日韩欧美中文字幕一区二区 | 一级特黄aa大片免费播放 | av中文字幕亚洲 | 色玖玖| 欧美人与物videos另类 | 九一亚色| 中文字幕人妻色偷偷久久 | 色原网 |