一、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阶段

  1. <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为每个作业维护若干内置计数器,以描述多项指标。例如,某些计数器记录 已处理的字节数和记录数,使用户可监控已处理的输入数据量和已产生的输出数据量。
计数器适用方式:

  • 采用枚举的方式统计计数
  1. enum MyCounter{MALFORORMED,NORMAL}
  2. //对枚举定义的自定义计数器加1
  3. context.getCounter(MyCounter.MALFORORMED).increment(1);
  • 采用计数器组、计数器名称的方式统计
  1. context.getCounter("counterGroup", "counter").increment(1);

计数结果在程序运行后的控制台上查看。