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

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

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

  1. hive.auto.convert.join=true;
  2. hive.execution.engine=tez;

代码片段是,

  1. CREATE TABLE STG_CONVERSION AS
  2. SELECT CONV.CONVERSION_ID,
  3. CONV.USER_ID,
  4. TP.TIME,
  5. CONV.TIME AS ACTIVITY_TIME,
  6. TP.MULTI_DIM_ID,
  7. CONV.CONV_TYPE_ID,
  8. TP.SV1
  9. FROM VIEWS TP
  10. JOIN SCU_TMP CONV ON TP.USER_ID = CONV.USER_ID
  11. WHERE TP.TIME <= CONV.TIME;

在正常情况下,两个表都可以有任意数量的记录。
但是,在scu\u tmp表中,只有10-50条记录具有相同的用户id。
但在某些情况下,在scu temp表中,两个用户id附带了大约10k-20k条记录,这会产生交叉积效应。
在这种情况下,它将永远只运行一个Map器来完成。
有没有什么方法可以优化它,优雅地运行它?

tjjdgumg

tjjdgumg1#

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

  1. set hive.exec.reducers.bytes.per.reducer=10000
  2. CREATE TABLE STG_CONVERSION AS
  3. SELECT CONV.CONVERSION_ID,
  4. CONV.USER_ID,
  5. TP.TIME,
  6. CONV.TIME AS ACTIVITY_TIME,
  7. TP.MULTI_DIM_ID,
  8. CONV.CONV_TYPE_ID,
  9. TP.SV1
  10. FROM (SELECT TIME,MULTI_DIM_ID,SV1 FROM VIEWS SORT BY TIME) TP
  11. JOIN SCU_TMP CONV ON TP.USER_ID = CONV.USER_ID
  12. 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分钟。

展开查看全部

相关问题