尝试连接 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/