hive sql运行时候reduce 只有2个问题解决

发布时间 2023-08-21 15:39:58作者: 一九七

我们在explan sql

时候发现 width 是负数,事实上原因

width是通过data Size / rowNum计算出来的,这两个参数都是在执行计划中根据每个operator通过stats计算出来的。对于select query来说,data size是根据column stats、尤其是non-null的数据计算出来的,这些non-null value按照如下公式计算: long nonNullCount = cs.getNumNulls() > 0 ? numRows - cs.getNumNulls() + 1 : numRows; 不过有时候总计的行数会比null value数量少,因此会导致负数的row count和负数的data size。由于这些数据都是预估的数值,因此的确有发生这种问题的可能。 根据公示Max(1, Min(hive.exec.reducers.max [1099], ReducerStage estimate/hive.exec.reducers.bytes.per.reducer)) x hive.tez.max.partition.factor ,data size会在optimizer估算reducer数量的时候用到,因此如果data size为负数,最后生成reducer数量为1。 然后hive.tez.max.partition.factor   默认值为2  ,导致  redcue 最终生成值为2.

解决方式是,不用hive 元数据的 column stats ,而是使用其他方式预估功能。参数为 set  hive.stats.fetch.column.stats=false; 既可解决reduce 一直为2的问题