所以我试着在hive上做一些测试查询,当我连接两个有100k行的表时,我运行的查询运行得非常好,但是当我尝试两个有200k行的表时,查询完全中断
从本质上讲,控制台在特定的数量(在本例中,map 0%reduce 0%)上卡住了,并不断地重复这个操作,而在mapper中,它开始转发大量的行。我一辈子都搞不清楚这里出了什么问题。如果你能帮忙,我会非常感激的!
这是查询
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
1条答案
按热度按时间fykwrbwg1#
因为您正在执行map side join,所以Map器作为输入进入表中,另一个表由每个Map器完全读取。
现在,对于每条记录中的10万条,这可能是可行的,但对于20万条记录,我认为根据每条记录的大小,jvm可能会面临内存问题。
您可以尝试增加堆分配。
理想情况下,在场景中使用map-side-join是不正确的。只有当您知道一个表很小并且有固定数量的记录时才使用它。一旦您在较大的表上使用map-side-join,您将面临性能问题。