hive+tez::一个连接查询在最后两个Map器上停留了很长时间

ifsvaxew  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(501)

我有一个视图表与一个临时表连接,其中特意启用了以下参数。

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器来完成。
有没有什么方法可以优化它,优雅地运行它?

tjjdgumg

tjjdgumg1#

我通过下面的查询找到了解决方法。

set hive.exec.reducers.bytes.per.reducer=10000
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 (SELECT TIME,MULTI_DIM_ID,SV1 FROM VIEWS SORT BY TIME) TP    
JOIN  SCU_TMP CONV ON TP.USER_ID = CONV.USER_ID    
WHERE TP.TIME <= CONV.TIME;

出现这个问题的原因是,当一个用户id控制表时,该用户的join通过一个被卡住的Map器进行处理。
对它进行了两次修改,
1) 用子查询替换了表名-在联接之前添加了排序过程。
2) 将hive.exec.reducers.bytes.per.reducer参数减少到10kb。
在第(1)步中,sort by time添加了一个shuffle阶段,该阶段均匀地分布先前被用户id扭曲的数据。
减少每个reducer参数的字节数会将数据分发给所有可用的reducer。
通过这两项改进,10-12小时的跑步时间减少到45分钟。

相关问题