Kylin查询性能优化之减少小的或不均匀的parquet文件、将多个小文件读取到同一个分区

1. 减少小的或不均匀的parquet文件

在查询时读取太多小文件或几个太大的文件会导致性能低下,可以配置参数,让cube构建时,按照一定策略对parquet文件进行重分区,以减少小的或不均匀的parquet文件

1.1 配置参数

参数名 默认值 说明
kylin.storage.columnar.shard-size-mb 128MB 有shardby列的parquet文件最大大小
kylin.storage.columnar.shard-rowcount 2500000 没有bitmap时,每个parquet文件最多包含的行数
kylin.storage.columnar.shard-countdistinct-rowcount 1000000 有bitmap时,指定cuboid的bitmap大小
kylin.storage.columnar.repartition-threshold-size-mb 128MB 每个parquet文件的最大大小

1.2 分区数量的计算规则

需满足下面的条件之一,才会进行重分区:

  1. 如果这个cuboid有shardBy的列
  2. parquet文件的平均大小 < 参数kylin.storage.columnar.repartition-threshold-size-mb的值 ,且parquet文件数量大于1。这种情况是为了避免小文件太多
  3. parquet文件的数量 < (parquet文件的总行数 / kylin.storage.columnar.shard-rowcount * 0.75), 如 果这个cuboid有精确去重的度量值, 使用kylin.storage.columnar.shard-countdistinct-rowcount来代替。这种情况是为了避免不均匀的文件

分区数量的计算规则:
fileLengthRepartitionNum = Math.ceil(【parquet文件总大小MB】/ 【kylin.storage.columnar.shard-size-mb】)
rowCountRepartitionNum = Math.ceil(【parquet 文件总行数】/ 【kylin.storage.columnar.shard-rowcount】)
分区数量 = Math.ceil((【fileLengthRepartitionNum】+【rowCountRepartitionNum】) / 2)

2. 将多个小文件读取到同一个分区

当已经构建的segments中有很多小文件时, 可以修改参数spark.sql.files.maxPartitionBytes(默认值为128MB)为合适的值,这样可以让spark 引擎将一些小文件读取到单个分区中,从而避免太多的小任务

如果有足够的资源, 可以减少该参数的值来增加并行度, 但需要同时减少spark.hadoop.parquet.block.size(默认值为128MB)的值,因为parquet文件的最小分割单元RowGroup由该参数确定

猜你喜欢

转载自blog.csdn.net/yy8623977/article/details/126057899
今日推荐