大数据——sparksql metastore谓词下推无效
背景:用户反馈生产上的hive元数据库MySQL查询非常慢,CPU经常负载100%。生产很多大表一天数据量大概50T左右,这个表的数据按照day_id、province_id、type和flag四个字段作为分区,这些分区会作为查询条件进行过滤数据,每天总分区数大概有10万左右。查询sparksql类似如下:
select count(*),day_id from table where province_id=815 and day_id>=20200901 and day_id<=2020097 and type=4g and flag in ('1','5');这条sql在hive元数据库会查询表PARTITION_PARAMS,这个表在生产大概3亿左右数据。通过分析MySQL的慢查询,发现大量查询这个表非常耗时,都是几分钟。生产慢sql如下(PART_ID作为条件有几十万):
这种条件这么多sql不慢才怪呢!于是从这条sparksql入手分析,使用hive执行这条sql在MySQL中没出现慢sql,返回非常快,这就非常容易定位问题了,sparksql有bug,把分区谓词下推。通过分析发现,正常满足条件的谓词只有几十个,也就是MySQL里part_id正常只有几十个,但是sparksql却出现了几十万。到spark的jira查找,发现了SPARK-20331这个patch。打上这个patch之后,相同sql测试执行,在MySQL上返回结果就只耗时不到1秒。
我们生产的spark版本是2.2.1,这个patch在spark2.3.0修复了

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有