Ace*_*Ace 3 hadoop hive join mapreduce
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
'默认'连接将是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仅从保证在连接键上重叠的两个大表分割,因此映射任务可以使用哈希表来进行连接.
还有更多细节,例如偏斜加入支持和内存不足情况下的回退,但这可能会让您开始调查您的需求.
关于连接主题的一个非常好的演示是Hive中的Join Strategies.请记住,事情从2011年开始快速演变,有点过时了.