MapReduce的表关联

1.  Reduce端链接缓存

  Map端的主要工做:为来自不一样表(文件)的key/value对打标签以区别不一样来源的记录。而后用链接字段做为key,其他部分和新加的标志做为value,最后进行输出。reduce端的主要工做:在reduce端以链接字段做为key的分组已经完成,咱们只须要在每个分组当中将那些来源于不一样文件的记录(在map阶段已经打标志)分开,最后进行笛卡尔乘积就ok了。网络

  之因此会存在reduce join这种方式,咱们能够很明显的看出缘由:由于总体数据被分割了,每一个map task只处理一部分数据而不可以获取到全部须要的join字段,所以咱们须要在将join key做为reduce端的分组将全部join key相同的记录集中起来进行处理,因此reduce join这种方式就出现了。框架

Reduce端的不足分布式

这种方式的缺点很明显就是会形成map和reduce端也就是shuffle阶段出现大量的数据传输,效率很低spa

 

2.  Map端链接blog

使用场景:一张表十分小、一张表很大。内存

  用法:在提交做业的时候先将小表文件放到该做业的DistributedCache中,而后从DistributeCache中取出该小表进行join key / value解释分割放到内存中(能够放大Hash Map等等容器中)。而后扫描大表,看大表中的每条记录的join key /value值是否可以在内存中找到相同join key的记录,若是有则直接输出结果。资源

Map端链接原理效率

  DistributedCache是分布式缓存的一种实现,它在整个MapReduce框架中起着至关重要的做用,他能够支撑咱们写一些至关复杂高效的分布式程序。说回到这里,JobTracker在做业启动以前会获取到DistributedCache的资源uri列表,并将对应的文件分发到各个涉及到该做业的任务的TaskTracker上。另外,关于DistributedCache和做业的关系,好比权限、存储路径区分、public和private等属性容器

  另外还有一种比较变态的Map Join方式,就是结合HBase来作Map Join操做。这种方式彻底能够突破内存的控制,使你毫无忌惮的使用Map Join,并且效率也很是不错。

3.  SemiJoin半链接

  在map端过滤掉一些数据,在网络中只传输参与链接的数据不参与链接的数据没必要在网络中进行传输,从而减小了shuffle的网络传输量,使总体效率获得提升,其余思想和reduce join是如出一辙的。就是将小表中参与join的key单独抽出来经过DistributedCach分发到相关节点,而后将其取出放到内存中(能够放到HashSet中),在map阶段扫描链接表,将join key不在内存HashSet中的记录过滤掉,让那些参与join的记录经过shuffle传输到reduce端进行join操做,其余的和reduce join都是同样的。

相关文章
相关标签/搜索