Hadoop实现join的三种方法是什么呢?我们先来说说Hadoop,它是一个由Apache基金会所开发的分布式系统基础架构。在用户并不了解分布式底层细节的情况下也可以开发分布式程序。它充分利用集群的威力进行高速运算及存储。Hadoop它其实实现了一个分布式文件系统,它的框架最核心的设计就是:MapReduce,HDFS。HDFS是为海量的数据提供了存储空间,而MapReduce就是为海量数据提供了运算。要知道只有当线程结束时,join方法才可以继续执行相关语句。我们来现在来说说Hadoop实现join的三种方法。
第一种:reduce side join
Reducesidejoin是最简单的连接方式,其主要思想如下:
在映射阶段,映射函数同时读取两个文件文件1和文件2,为了区分来自两个源的键/值数据对,每个数据都被标记。例如,标记=0表示来自文件文件1,标记=2表示来自文件文件2,即地图阶段的主要任务是标注不同文件中的数据。
在reduce阶段,reduce函数从具有相同键的File1和File2文件中获取valuelist,然后将File1和File2中的数据连接到相同的键。也就是说,实际的连接操作在减少阶段执行。
第二种:map side join
reducesidejoin之所以存在,是因为在映射阶段无法获得所有必要的连接字段,也就是说,相同关键词对应的字段可能在不同的映射中。Reducesidejoin效率不高,因为在洗牌阶段有大量的数据传输。
Mapsidejoin优化了以下几个场景:要连接的两个表中有一个很大,另一个很小,小表可以直接存储在内存中。这样,我们就可以在每个maptask内存中制作一个副本(例如存储在hashtable中),然后只扫描大表:对于大表中的每个记录键/值,找出hashtable中是否有相同的键记录,如果有,连接后输出。
第三种:SemiJoin
SemiJoin,也称为半连接,是从分布式数据库中借用的一种方法。其动机是:对于reducesidejoin,跨机器的数据传输量非常大,已经成为join操作的瓶颈。如果能在地图端过滤掉不参与加入操作的数据,可以大大节省网络IO。
实现方法很简单:选择一个小表,假设是File1.提取它的键进行联接,保存在File3中,文件3通常很小,可以放在内存中。在映射阶段,使用分布式缓存将文件3复制到每个任务跟踪器,然后过滤掉文件2中不在文件3中的键对应的记录。reduce阶段的其余工作与reducesidejoin相同。
Mapjoin是把一个数据集的数据放入mapset,在setup中把该集放入缓存,所以涉及到DistributedCache,因为涉及到内存,所以放入缓存的数据集样本要小,否则不适用,所以这个业务场景比较少。在reduce的连接中,所有需要连接的数据集都作为map的输入,数据在map的逻辑中标记,数据在reduce中合并,需要用户自定义数据类型。
以上我们介绍了Hadoop实现join的三种方法,希望能够对大家有一定的帮助,如果您想继续了解相关内容,请您继续关注中培伟业。