更新时间:2022-12-08 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
父主题: 大数据业务开发