|NO.Z.00035|——————————|BigDataEnd|——|Hadoop&MapReduce.V08|——|Hadoop.v08|MapReduce原理剖析之自定义分区及ReduceTask数|自定义分区案例.v01|
一、MapReduce原理剖析之自定义分区及ReduceTask数量
### --- MapReduce原理剖析之自定义分区及ReduceTask数量
~~~ [MapReduce原理剖析之自定义分区及ReduceTask数量]
~~~ [MapReduce原理剖析之自定义分区案例]
### --- MapReduce的分区与reduceTask的数量
~~~ 在MapReduce中,通过我们指定分区,会将同一个分区的数据发送到
~~~ 同一个reduce当中进行处理(默认是key相同去往同个分区),例如我们为了数据的统计,
~~~ 我们可以把一批类似的数据发送到同一个reduce当中去,在同一个reduce当中统计相同类型的数据,
~~~ 如何才能保证相同key的数据去往同个reduce呢?只需要保证相同key的数据分发到同个分区即可。
~~~ 结合以上原理分析我们知道MR程序shuffle机制默认就是这种规则!!
二、分区源码
### --- 分区源码
~~~ 翻阅源码验证以上规则,MR程序默认使用的HashPartitioner,保证了相同的key去往同个分区!!

一、自定义分区
### --- 自定义分区
~~~ 实际生产中需求变化多端,默认分区规则往往不能满足需求,
~~~ 需要结合业务逻辑来灵活控制分区规则以及分区数量!!
二、如何制定自己需要的分区规则?
### --- 具体步骤
~~~ 自定义类继承Partitioner,重写getPartition()方法
~~~ 在Driver驱动中,指定使用自定义Partitioner
~~~ 在Driver驱动中,要根据自定义Partitioner的逻辑设置相应数量的ReduceTask数量。
### --- 需求 按照不同的appkey把记录输出到不同的分区中
~~~ 原始日志格式
001 001577c3 kar_890809 120.196.100.99 1116 954 200
日志id 设备id appkey(合作硬件厂商) 网络ip 自有内容时长(秒) 第三方内 容时长(秒) 网络状态码
~~~ # 输出结果
根据appkey把不同厂商的日志数据分别输出到不同的文件中
一、编程实现案例
### --- 需求分析
~~~ 面对业务需求,结合mr的特点,来设计map输出的kv,以及reduce输出的kv数据。
~~~ 一个ReduceTask对应一个输出文件,
~~~ 因为在shuffle机制中每个reduceTask拉取的都是某一个分区的数据,一个分区对应一个输出文件。
~~~ 结合appkey的前缀相同的特点,同时不能使用默认分区规则,而是使用自定义分区器,
~~~ 只要appkey前缀相同则数据进入同个分区。
### --- 整体思路
~~~ # Mapper
读取一行文本,按照制表符切分
解析出appkey字段,其余数据封装为PartitionBean对象(实现序列化Writable接口)
设计map()输出的kv,key-->appkey(依靠该字段完成分区),PartitionBean对象作为Value输出
~~~ # Partition
自定义分区器,实现按照appkey字段的前缀来区分所属分区
~~~ # Reduce
reduce()正常输出即可,无需进行聚合操作
~~~ # Driver
在原先设置job属性的同时增加设置使用自定义分区器
注意设置ReduceTask的数量(与分区数量保持一致)
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通