Apache Hive使用的默认MapReduce连接是什么?

时间:2013-10-20 06:38:47

标签: join hadoop mapreduce hive

Hive实现的默认MapReduce连接算法是什么?它是Map-Side Join,Reduce-Side,Broadcast-Join等吗?

在原始论文中没有指定,也没有在加入时的Hive wiki中指定:

http://cs.brown.edu/courses/cs227/papers/hive.pdf
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

2 个答案:

答案 0 :(得分:8)

'默认'连接将是shuffle join,aka。作为共同加入。见JoinOperator.java。它依赖于M / R shuffle来对数据进行分区,并且在Reduce侧完成连接。在shuffle期间,数据大小也是如此,它很慢。

更好的选择是MapJoin,请参阅MapJoinOpertator.java。如果您只有一个大表和一个或多个要加入的小表(例如,典型的星型模式),则此方法有效。首先扫描小表,构建哈希表并上传到HDFS缓存中,然后启动M / R作业,只需要拆分一个表(大表)。比shuffle join更有效,但需要将小表放入M / R map任务的内存中。通常Hive(至少从0.11开始)将尝试使用MapJoin,但这取决于你的配置。

专门的连接是bucket-sort-merge连接,又名。 SMBJoin,见SMBJoinOperator.java。如果您有2个与连接键上的bucketing匹配的大表,则此方法有效。然后可以安排M / R作业拆分,使得地图任务gest仅从保证在连接键上重叠的两个大表分割,因此映射任务可以使用哈希表来进行连接。

还有更多细节,例如偏差加入支持和内存不足情况下的回退,但这可能会让您开始调查您的需求。

关于联接主题的一个非常好的演讲是Join Strategies in Hive。请记住,从2011年开始,事情发展得很快,有点过时了。

答案 1 :(得分:4)

在Hive查询上执行explain,您可以看到执行计划。