您好,登錄后才能下訂單哦!
這篇文章主要介紹了Hadoop中使用Combiner有什么好處,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
使用Combiner好處:
減少M(fèi)apper任務(wù)輸出數(shù)據(jù)量,減少網(wǎng)絡(luò)傳輸時(shí)間,減少整體Job運(yùn)行時(shí)間。
Combiner僅作用于單個(gè)Mapper任務(wù),每個(gè)Map任務(wù)可能會(huì)產(chǎn)生大量的輸出,Combiner的作用就是在Map端對(duì)輸出先做一次合并,以減少傳輸?shù)絉educer的數(shù)據(jù)量。
Combiner最基本是實(shí)現(xiàn)本地Key的遞歸,Combiner具有類(lèi)似本地的Reduce功能。如果不用Combiner,那么所有的結(jié)果都是Reduce完成,效率會(huì)相對(duì)低下,使用Combiner先完成的Map會(huì)在本地聚合,提升速度。
注意:Combiner的輸出時(shí)Reduce的輸入,Combiner決不能改變最終的計(jì)算結(jié)果,所以從我的想法來(lái)看,Combiner只應(yīng)該用于那種Reduce的輸入key/value與輸出key/value類(lèi)型完成一致,且不影響最終結(jié)果的場(chǎng)景。比如累加,最大值等。
為什么使用Combiner:
集群上的可用寬帶限制了MapReduce作業(yè)的數(shù)量,因此最重要的一點(diǎn)是盡量避免Map任務(wù)和Reduce任務(wù)之間的數(shù)據(jù)傳輸。
Hadoop允許用戶(hù)針對(duì)Map任務(wù)的輸出指定一個(gè)合并函數(shù)(Combiner)——————合并函數(shù)的輸出作為Reduce函數(shù)的輸入。
由于合并函數(shù)是一個(gè)優(yōu)化方案,所以Hadoop無(wú)法確定針對(duì)Map任務(wù)輸出中任一條記錄需要調(diào)用多少次合并函數(shù)。換而言之,不管調(diào)用合并函數(shù)多少次,Reduce的輸出結(jié)構(gòu)都是一致的。
例子: package combiner; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import mapreduce.MyMapper; import mapreduce.MyReducer; 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.Job; 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; import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner; /** * 計(jì)算單詞 * @author Xr * */ public class WordCountApp { private static final String INPUT_PATH = "hdfs://hadoop:9000/hello"; private static final String OUTPUT_PATH = "hdfs://hadoop:9000/hello1"; public static void main(String[] args)throws Exception { Configuration conf = new Configuration(); //判處是否存在輸入目錄 existsFile(conf); Job job = new Job(conf,WordCountApp.class.getName()); //1.1 從哪里讀取數(shù)據(jù) FileInputFormat.setInputPaths(job, INPUT_PATH); //把輸入文本中的每一行解析成一個(gè)個(gè)鍵值對(duì) job.setInputFormatClass(TextInputFormat.class); //1.2 設(shè)置自定義map函數(shù) job.setMapperClass(MyMapper.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LongWritable.class); //1.3 分區(qū) job.setPartitionerClass(HashPartitioner.class); job.setNumReduceTasks(1); //1.4 TODO 排序分組 //1.5 規(guī)約 job.setCombinerClass(MyReducer.class); //2.1 是框架做的,不需要程序員手工干預(yù)。 //2.2 自定義reducer函數(shù) job.setReducerClass(MyReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); //2.3 寫(xiě)入到HDFS中 FileOutputFormat.setOutputPath(job, new Path(OUTPUT_PATH)); //格式化類(lèi) job.setOutputFormatClass(TextOutputFormat.class); //提交給JobTracker去執(zhí)行 job.waitForCompletion(true); } private static void existsFile(Configuration conf) throws IOException, URISyntaxException { FileSystem fs = FileSystem.get(new URI(INPUT_PATH), conf); if(fs.exists(new Path(OUTPUT_PATH))){ fs.delete(new Path(OUTPUT_PATH), true); } } }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Hadoop中使用Combiner有什么好處”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。