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

标签 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

最佳答案

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

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

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

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

关于连接主题的一个非常好的演示是 Join Strategies in Hive .请记住,事情发展很快,2011 年的介绍有点过时了。

关于join - Apache Hive 使用的默认 MapReduce 连接是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19474629/

相关文章:

MySQL 左连接 WHERE table2.field = "X"

hadoop - 将 Mapreduce 作业的 Reducer 输出写入单个文件

xml - Mapreduce - 处理大型 xml 文件时出现堆内存问题

c++ - Hadoop 2.6 java.lang.nullpointerException

java - MapReduce:如何让映射器处理多行?

sql - Oracle/SQL - 查找记录(如果不存在类似记录)并加入第二个表

mysql - Mysql中Join表创建新表

MySQL选择连接中没有匹配的地方

hadoop - 如何从Yarn rest API在浏览器上获取JSON?

java - hadoop maven Java 类 null : InvocationTargetException