一、Reduce Join
将关联条件作为Map输出的key ,将两表满足 Join 条件的数据并携带数据所来源的文件信息,发往同一个 ReduceTask,在 Reduce 中进行数据的串联。
例子:
https://github.com/Wells-Lee/mapreduce-demo/tree/master/src/main/java/com/wells/demo/join/reducer
二、Map Join
Q:在 Reduce 端处理过多的表,非常容易产生数据倾斜。怎么办?
A:在 Map 端缓存多张表,提前处理业务逻辑,这样增加 Map 端业务,减少 Reduce 端数
据的压力,尽可能的减少数据倾斜。
Map Join不需要Reduce阶段
<br />适用场景:Map Join 适用于一张表十分小、一张表很大的场景
具体步骤:
在 Mapper 的 setup 阶段,将文件读取到缓存集合中。
在驱动函数中加载缓存。
// 缓存普通文件到 Task 运行节点。
job.addCacheFile(new URI(“file://e:/cache/pd.txt”));
例子:
https://github.com/Wells-Lee/mapreduce-demo/tree/master/src/main/java/com/wells/demo/join/mapper
三、计数器
Hadoop为每个作业维护若干内置计数器,以描述多项指标。例如,某些计数器记录
已处理的字节数和记录数,使用户可监控已处理的输入数据量和已产生的输出数据量。
计数器适用方式:
- 采用枚举的方式统计计数
enum MyCounter{MALFORORMED,NORMAL}
//对枚举定义的自定义计数器加1
context.getCounter(MyCounter.MALFORORMED).increment(1);
- 采用计数器组、计数器名称的方式统计
context.getCounter("counterGroup", "counter").increment(1);
计数结果在程序运行后的控制台上查看。