MapReduce Join(一)--原理

MapReduce Join

  对两份数据data1和data2进行关键词连接是一个很通用的问题。
  如果数据量比较小,完全可以在内存中完成连接;如果数据量比较大,在内存进行连接操会发生内存溢出(OOM)。那么此时就可以用 MapReduce Join 来解决大数据的连接问题。

1. Reduce Join

  map 端的主要工作:为来自不同表(文件)的key/value 打标记以区别不同来源的记录。然后用连接字段作为 key其余部分和新加的标记作为 value,然后进行输出。
  reduce 端的主要工作:在 reduce 端,以连接字段作为key 的分组已经完成,我们只需要在每一个分组当中将那些来源于不同文件的记录(在 map 阶段已经打标记)分开,最后进行合并就 ok 了。
  通俗的说,就是在map 阶段, 把关键字作为key输出,并在value中标记出数据是来自data1还是data2。因为在shuffle阶段已经自然按key分组,reduce 阶段,判断每一个value是来自data1还是data2,在内部分成2组,做集合的乘积。。
  但是,此方法有缺点:
  1、map 阶段没有对数据瘦身,shuffle的网络传输和排序性能很低。
  2、reduce 端对2个集合做乘积计算,很耗内存,容易导致OOM。

2. Map Join

  两份数据中,如果有一份数据比较小,小数据全部加载到内存,按关键字建立索引。大数据文件作为map的输入文件,对map()方法的每一对输入,都能够方便地和已加载到内存的小数据进行连接。把连接结果按key输出,经过shuffle阶段,reduce端得到的就是已经按key分组的,并且连接好了的数据。
  此方法的特点:
  1、要使用hadoop中的DistributedCache(分布式缓存)把小数据分布到各个计算节点,每个map节点都要把小数据库加载到内存,按关键字建立索引。
  2、有明显的局限性:数据中有一份数据比较小,在map端,能够把它加载到内存,并进行join操作。

  编程案例请参考下一篇

猜你喜欢

转载自blog.csdn.net/qq_41610418/article/details/81488342