版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hongchenlingtian/article/details/53614098
一 、需求
用一个具体需求实例来说明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.1 先分析一下具体的业务逻辑,确定大概有多少个分区,本需求明显需要分成4个区
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上