一 、需求
用一个具体需求实例来说明Partitioner分区机制
例如: 将下列手机号进行分区,135,136,137,138,139等开头的手机号放到一个文件,150,159等开头的手机号放到一个文件,182,183等开头的手机号放到一个文件,其他手机号放到一个文件
手机号 上行流量 下行流量 总流量
13480253104 180 180 360
13502468823 7335 110349 117684
13560436666 1116 954 2070
13560439658 2034 5892 7926
13602846565 1938 2910 4848
13660577991 6960 690 7650
13719199419 240 0 240
13726230503 2481 24681 27162
13726238888 2481 24681 27162
13760778710 120 120 240
13826544101 264 0 264
13922314466 3008 3720 6728
13925057413 11058 48243 59301
13926251106 240 0 240
13926435656 132 1512 1644
15013685858 3659 3538 7197
15920133257 3156 2936 6092
15989002119 1938 180 2118
18211575961 1527 2106 3633
18320173382 9531 2412 11943
84138413 4116 1432 5548
二 、分区分析
1.执行位置:
Partitioner在Map之后,Reduce之前执行,接收Map的输出k2,v2,然后按照业务逻辑进行分区2.实现分区的步骤:
2.2 首先书写一个类,它要继承org.apache.hadoop.mapreduce.Partitioner这个类
2.3 重写public int getPartition这个方法,根据具体逻辑,读数据库或者配置返回相同的数字
2.4 在main方法中设置Partioner的类,job.setPartitionerClass(DataPartitioner.class);
2.5 设置Reducer的数量,job.setNumReduceTasks(4);
三 、代码实现
1.在main方法中设置Partioner的类和Reducer的数量
2.写一个类,它要继承Partitioner这个类
四 、结果实现
发现分成四个文件,每个文件对应一个Reducer
四 、Partitioner原理解析
如图,假设有三台机器,每台机器上有一个NodeManager,DataNode,启动一个YarnChild(资源好,可以启动多个YarnChild)实现Map(红色),现在要分成两个Reducer(黑色)上去计算。实际上在YarnChild上每个Map会先进行Partitioner分区处理,将数据分好区,通过getPartition得到区的号码,是0区的会跑到0的那个Reducer上,是1区的会跑到1的那个Reducer上