3

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

4

2 回答 2

8

“默认”连接将是随机连接,又名。作为共同加入。请参阅JoinOperator.java。它依靠 M/R shuffle 对数据进行分区,并且在 Reduce 端完成连接。由于是洗牌期间的数据大小副本,它很慢。

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

一个专门的连接是桶排序合并连接,又名。SMBJoin,请参阅SMBJoinOperator.java。如果您有 2 个与连接键上的分桶匹配的大表,则此方法有效。然后可以安排 M/R 作业拆分,以便映射任务 gest 仅拆分两个大表,保证在连接键上过度重叠,以便映射任务可以使用哈希表进行连接。

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

关于联接主题的一个非常好的演示文稿是Hive 中的联接策略。请记住,事情发展很快,2011 年的演示文稿有点过时了。

于 2013-10-20T07:46:06.257 回答
4

对 Hive 查询做一个解释,你可以看到执行计划。

于 2013-10-20T07:44:52.837 回答