我有一个视图表与一个临时表连接,其中特意启用了以下参数。
hive.auto.convert.join=true;
hive.execution.engine=tez;
代码片段是,
CREATE TABLE STG_CONVERSION AS
SELECT CONV.CONVERSION_ID,
CONV.USER_ID,
TP.TIME,
CONV.TIME AS ACTIVITY_TIME,
TP.MULTI_DIM_ID,
CONV.CONV_TYPE_ID,
TP.SV1
FROM VIEWS TP
JOIN SCU_TMP CONV ON TP.USER_ID = CONV.USER_ID
WHERE TP.TIME <= CONV.TIME;
在正常情况下,两个表都可以有任意数量的记录。
但是,在scu\u tmp表中,只有10-50条记录具有相同的用户id。
但在某些情况下,在scu temp表中,两个用户id附带了大约10k-20k条记录,这会产生交叉积效应。
在这种情况下,它将永远只运行一个Map器来完成。
有没有什么方法可以优化它,优雅地运行它?
1条答案
按热度按时间tjjdgumg1#
我通过下面的查询找到了解决方法。
出现这个问题的原因是,当一个用户id控制表时,该用户的join通过一个被卡住的Map器进行处理。
对它进行了两次修改,
1) 用子查询替换了表名-在联接之前添加了排序过程。
2) 将hive.exec.reducers.bytes.per.reducer参数减少到10kb。
在第(1)步中,sort by time添加了一个shuffle阶段,该阶段均匀地分布先前被用户id扭曲的数据。
减少每个reducer参数的字节数会将数据分发给所有可用的reducer。
通过这两项改进,10-12小时的跑步时间减少到45分钟。