=============================Hadoop高级编程接口=======================1、Partitioner编程2、自定义排序编程3、Combiner编程4、常见的MapReduce算法5、加深拓展---MapReduce原理及源码分析partitioner编程:自定义的Partitioner必须先继承Partitioner类1.Partitioner是partitioner的基类,如果需要定制partitioner也需要继承该类。2.HashPartitioner是mapreduce的默认partitioner。计算方法是whichreducer=(key.hashCode()&Integer.MAX_VALUE)%numReduceTasks,得到当前的目的reducer。3.(例子以jar形式运行)##Partitioner的原理:Partitioner会根据数据分区规则,将数据分配给不同的Reducer,给了不同的Reducer就会最终产生不同的文件。##Maven的使用管理有了pom.xml文件,就不在需要在项目中在创建出lib包,但是我们需要在pom.xml文件中写入一些依赖。##Combiner的概念:每一个map可能会产生大量的输出,combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量。combiner最基本是实现本地key的归并,combiner具有类似本地的reduce功能。如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下。使用combiner,先完成的map会在本地聚合,提升速度。注意:Combiner的输出是Reducer的输入,如果Combiner是可插拔的,添加Combiner绝不能改变最终的计算结果。所以Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。**所以Combiner就是一个特殊的Reducer,这个Reducer将在Mapper端进行执行,达到合并数据减少Reducer压力的作用例如:对于统计词频的这个程序,现在Mapper端进行一次小计,然后再在Reduce端进行一次总计**Combiner的输入是Mapper的输出,Combiner的输出是Reducer的输入;**增加Combiner时,如果Combiner是可插拔的,则可以1、推测Combiner的功能与Reducer的功能是一样的,2、且Combiner绝不可以改变最终的计算结果,3、Combiner在可插拔是只适用于Reducer的输入与输出类型完全一致的情况Thinking:Combiner是否可以适用于求平均值的场景?所以在求平均数的情况下,不可以使得Combiner和Reducer的功能一样,只用改变Combiner的功能计算出来的平均数才不会出错,所以要求这个Combiner输出的是小计总合,相加的个数##倒排索引一个全文检索的结构使用MR(类似wordcount)实现一个倒排索引以上是需要的输出结果;倒推code:Mapper的代码://mapper(1)//表示一个单词的出现次数作为key,由于单词在文件中出现过3次,所以输出3次context.write(“hello-a.txt”,”1”)context.write(“hello-a.txt”,”1”)context.write(“hello-a.txt”,”1”)如果添加了一个不可插拔的Combiner,到时在集群中进行运算时,会产生错误得到的结果:”hello”-a.txt,{1,1,1}//反推得到一个map不能完成计算,所以需要多个mapcontext.write(“hello”,”a.txt-3”)context.write(“hello”,”b.txt-2”)context.write(“hello”,”c.txt-2”)//map方法被调用很多次,输出很多次,之后安照hello这个key进行分组redeucer的代码:接受的数据格式:”hello”,{“a.txt-3”,”b.txt-2”,”c.txt-2”}context.write(“hello”,”a.txt-3b.txt-2c.txt-2”)