Partitioner的使用以及原理和规避误区(通俗易懂)

#Partitioner简介
shuffle是通过分区partitioner 分配给Reduce的 一个Reducer对应一个记录文件Partitioner是shuffle的一部分partitioner执行时机:在mapper执行完成,Reducer还没有执行的时候,mapper的输出就是partitioner的输入 即<k2,v2>partitioner 分区主要是用来提高效率的 例如从全国基站的数据中查找北京基站的数据,如果计算时不分区全国的数据都放在一起,查询的时候就相当于全表扫描 效率非常低,如果在第一次进行Mapreducer计算的时候按照省市进行分区,每个城市的基站数据都存储在对应的每个文件,那么下次再进行查询的时候直接从北京分区里直接查找 效率很高。分区的依据是具体业务需求,可以按照省市分区,时间进行分区等。如果不手动进行分区,Hadoop有一个默认的分区规则Partitioner是partitioner的基类,如果需要定制partitioner也需要继承该类。HashPartitioner是mapreduce的默认partitioner。计算方法是which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks,得到当前的目的reducer。
#Partitioner
在这里插入图片描述
以上流程省略了shuffle的过程DataNode在此处用于下载jarNodeManager用于运行Yarn 由YarnChild运行Mapper或Reducer当启动一个Reducer时会分配一个分区号 默认是按数字分区Partitioner是Shuffle的一部分,当Partition的返回值是N时 会将shuffle的结果输出给对应的分区号为N的Reducer一个Reducer对应一个分区文件 Reducer计算完毕后就会按照分区号写入对应的分区文件
#Partitioner创建流程
① 先分析一下具体的业务逻辑,确定大概有多少个分区
② 首先书写一个类,它要继承org.apache.hadoop.mapreduce.Partitioner这个类
③ 重写public int getPartition这个方法,根据具体逻辑,读数据库或者配置返回相同的数字④ 在main方法中设置Partioner的类,job.setPartitionerClass(DataPartitioner.class);
⑤ 设置Reducer的数量,job.setNumReduceTasks(6);

发布了56 篇原创文章 · 获赞 561 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/CZXY18ji/article/details/103071176