更新时间:2022-12-14 GMT+08:00

SparkSQL访问hive分区表大量调用OBS接口

问题背景

使用SparkSql访问hive的一个数据存放于OBS的一个分区表,但是运行速度却很慢,并且会大量调用OBS的查询接口。

SQL样例:

select a,b,c from test where b=xxx

原因分析

按照设定,任务应该只扫描b=xxx的分区,但是查看任务日志可以发现,实际上任务却扫描了所有的分区再来计算b=xxx的数据,因此任务计算的很慢。并且因为需要扫描所有文件,会有大量的OBS请求发送。

MRS默认开启基于分区统计信息的执行计划优化,相当于自动执行Analyze Table(默认开启的设置方法为spark.sql.statistics.fallBackToHdfs=true,可通过配置为false关闭)。开启后,SQL执行过程中会扫描表的分区统计信息,并作为执行计划中的代价估算,例如对于代价评估中识别的小表,会广播小表放在内存中广播到各个节点上,进行join操作,大大节省shuffle时间。 此开关对于Join场景有较大的性能优化,但是会带来OBS调用量的增加。

处理步骤

在SparkSQL中设置以下参数后再运行:

set spark.sql.statistics.fallBackToHdfs=false;

或者在启动之前使用--conf设置这个值为false:

--conf spark.sql.statistics.fallBackToHdfs=false