join - 运行 HIVE Join 查询时,Reducers 在 66.68% 时停止工作

标签 join hadoop mapreduce hive

尝试连接 6 个表,每个表中大约有 500 万行。尝试加入在所有表上按升序排序的帐号。 Map 任务成功完成,reducer 在 66.68% 时停止工作。尝试了增加 reducer 数量等选项,还尝试了其他选项 set hive.auto.convert.join = true;并设置 hive.hashtable.max.memory.usage = 0.9;并设置 hive.smalltable.filesize = 25000000L;但结果是一样的。尝试使用少量记录(如 5000 行),查询效果非常好。

请建议可以在这里做什么以使其发挥作用。

最佳答案

66% 的 Reducers 开始执行实际的 reduce(0-33% 是洗牌,33-66% 是排序)。在与 hive 的连接中,reducer 在两个数据集之间执行笛卡尔积。

我猜测至少有一个外键在所有数据集中频繁出现。注意 NULL 和默认值。

例如,在一个连接中,假设键“abc”在六个表中的每一个中出现十次 (10^6)。那是那个键的一百万条输出记录。如果“abc”在一个表中出现 1000 次,在另一个表中出现 1000 次,在另一个表中出现 1000 次,然后在其他三个表中出现两次,您将获得 80 亿条记录 (1000^3 * 2^3)。你可以看到这是如何失控的。我猜至少有一个键导致了大量的输出记录。

这也是在 Hive 之外的 RDBMS 中避免的一般良好做法。在多对多关系之间进行多个内部联接会给您带来很多麻烦。

关于join - 运行 HIVE Join 查询时,Reducers 在 66.68% 时停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14171806/

相关文章:

mysql 使用同一表中的行作为条件?

mysql - 刚接触 SQL,如何使用 TableA 上的 SELECT 调用的结果来针对 TableB 进行 SELECT?

mysql - 基于列值的限制(不是行数)

Hadoop MapReduce log4j - 将消息记录到 userlogs/job_ 目录中的自定义文件?

java - 通过 for 循环在 MapReduce 中发出中间键 - 我是否误解了 MapReduce?包括基本示例。

MySQL单表互条件查询

bash - 计算 HDFS 文件夹中具有给定扩展名的文件数

hadoop - Datastax hadoop 节点基础知识

file - 与其他格式相比, Parquet 格式的优缺点是什么?

hadoop - 在hadoop中保存和访问类似表的数据结构