Hadoop-----WordCount

一、基本形式

如上图所示,将HDFS上的文本作为输入,在map函数中完成对单词的拆分并输出为中间结果,并在reduce函数中完成对每个单词的词频计数。

文本作为MapReduce的输入,MapReduce会将文本进行切片处理并将行号作为输入键值对的键,文本内容作为输出的值,经过map函数的处理,输出中间结果为<word,1>的形式。MapReduce会默认按键分发给reduce函数,并在reduce函数中完成计数并输出最后结果<word,count>。

二、优化

当我们完成了程序的功能之后,不免会想到程序的性能。对于WordCount,我们完全可以让其更快些,具体的办法是设置Combiner。

combine对MapReduce是一个可选的过程,Combiner是具体执行combine这个过程的类。Hadoop的性能很大程度受限于网络带宽,map函数输出的中间结果都是通过网络传递给reduce函数,那么减少中间结果的数据量就可以提升程序运行的效率。而combine过程正是对map函数的输出结果进行早期聚合以减少传输的数据量。对于WordCount,我们完全可以在中间结果传递给reduce函数之前先做一次单词计数的操作,如下图所示:

combine过程发生在map函数和reduce函数之间,它将中间结果进行了一次合并,其作用其实和reduce函数是一样的,可以理解为在map函数执行的节点对中间结果执行了reduce函数。Hadoop不保证combiner是否被执行,有时候,它可能根本不执行,而某些时候,它可能被执行一次或者多次,这取决于map函数输出的中间结果的大小和数量。Combiner没有自己的接口,它必须拥有和Reducer相同的特征,因此也需要继承org.apache.hadoop.mapreduce.Reducer。如果想对WordCount开启combine过程,只需在main函数新增如下代码:

job.setCombinerClass(IntSumReducer.class)//IntSumReducer是Reducer类的名称。

需要注意的是,虽然Combiner能够提升程序性能,但并不是所有场景都适合使用Combiner,随意使用Combiner可能会造成逻辑错误导致结果有误。适合使用的Combiner的场景有求最大值、最小值、求和等。

              

猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/81460944
今日推荐