HiveOnSpark上跑Spark application时,发现部分stage对应的task数量很少,导致full-gc严重。例如下图中的stage只有17个tasks在跑。即使设置了spark.sql.shuffle.partitions=1201和spark.default.parallelism=1202也没有用,依旧是17个。
通过trace spark源码发现
mapred.reduce.tasks
参数虽然已经deprecated,但会优先spark.sql.shuffle.partitions
设置到环境变量中。(spark-2.0:SetCommand:44)
同时,根据同事给的hadoop参数优化项里
hive.exec.reducers.bytes.per.reducer
,把两者按如下配置后,4个stage启动的tasks数量分别从82/33/17/526变为了82/1201/1201/1201,大大增加了partition数量并as expected. 由此可见,HiveOnSpark时,Spark的execution plan应该还是走了Hive的逻辑,所以部分hadoop相关的参数会主导spark的执行计划的生成逻辑和结果
set hive.exec.reducers.bytes.per.reducer=67108864;
set mapred.reduce.tasks=1201;
P.S.
Hive version: 0.23
Spark version: 2.0.3
REFERENCE:
- https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-hive.exec.reducers.bytes.per.reducer
No comments:
Post a Comment