所以我试图在配置单元上进行一些测试查询,当我以100k行连接两个表时,我运行的查询工作得很好,但是当我尝试两个200k行的表时,它完全中断< / p>
本质上,控制台卡在特定的数量(在这种情况下,映射0%减少0%)并在映射器中保持重述,它开始转发荒谬的行数。我不能为我的生活弄清楚这里出了什么问题。如果你能帮助我,我会非常感激!
这是查询
SELECT /*+MapJoin(female_users)*/ male_users1m.id FROM male_users1m JOIN female_users1m ON (male_users1m.attractiveness = female_users1m.attractiveness);
id是一个bigint,吸引力是一个tinyint,但我已经尝试过这个与其他变量,似乎遇到了同样的问题。
2014-06-24 17:46:25,401 INFO org.apache.hadoop.hive.ql.exec.MapJoinOperator: 1 forwarding 118000000 rows
2014-06-24 17:46:25,401 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 2 forwarding 118000000 rows
2014-06-24 17:46:27,775 INFO org.apache.hadoop.hive.ql.exec.MapJoinOperator: 1 forwarding 119000000 rows
2014-06-24 17:46:27,775 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 2 forwarding 119000000 rows
2014-06-24 17:46:30,317 INFO org.apache.hadoop.hive.ql.exec.MapJoinOperator: 1 forwarding 120000000 rows
2014-06-24 17:46:30,317 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 2 forwarding 120000000 rows
2014-06-24 17:46:33,341 INFO org.apache.hadoop.hive.ql.exec.MapJoinOperator: 1 forwarding 121000000 rows
2014-06-24 17:46:33,341 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 2 forwarding 121000000 rows
答案 0 :(得分:0)
由于您正在进行地图侧连接 - 映射器作为输入获取表,并且每个映射器完全读取另一个表。
现在每个100K记录可能有效,但在200K记录中,我认为根据每条记录的大小,JVM可能会遇到内存问题。
您可以尝试增加堆分配。
理想情况下,在您的方案中使用地图侧连接是不正确的。仅当您知道一个表很小并且具有固定数量的记录时才使用它。只要在较大的表上使用地图侧连接,您就会遇到性能问题。