Kylin (六) --------- 查询性能优化


前言

在 Kylin4.0 中,查询引擎(SparderContext)也使用 spark 作为计算引擎,它是真正的分布式查询擎,特别是在复杂查询方面,性能会优于 Calcite。然而,仍然有许多关键性能点需要优化。除了上面提到的设置适当的计算资源之外,它还包括减少小的或不均匀的文件,设置适当的分区,以及尽可能多地修剪 parquet 文件。Kylin4.0 和 Spark 提供了一些优化策略来提高查询性能。


一、使用排序列快速读取 parquet 文件

创建 cube 时,可以指定维度列的排序,当保存 cube 数据时,每个 cuboid 的第一个维度列将用于执行排序操作。其目的是在使用排序列进行查询时,通过 parquet 文件的最小最大索引尽可能地过滤不需要的数据。

在 cube 构建配置的高级配置中,rowkey 的顺序就是排序顺序:
在这里插入图片描述
页面中可以左键点击 ID 进行拖拽,调整顺序

在这里插入图片描述

二、使用 shardby 列来裁剪 parquet 文件

Kylin 4.0 底层存储使用的是 Parquet 文件,并且 Parquet 文件在存储的时候是会按照某一列进行分片的。这个分片的列在 Kylin 里面,我们称为是 shardBy 列,Kylin 默认按照 shardBy 列进行分片,分片能够使查询引擎跳过不必要的文件,提高查询性能。我们在创建 Cube 时可以指定某一列作为shardBy 列,最好选择高基列 (基数高的列),并且会在多个 cuboid 中出现的列作为 shardBy 列。

如下图所示,我们按照时间 (月) 过滤,生成对应的 Segment,然后按照维度 A 作为 shardBy 列进行分片,每个 Segment 里面都会有相应的分片。如果我们在查询的时候按照时间和维度 A 进行过滤,Kylin 就会直接选择对应 Segment 的对应分片,大大的提升的查询效率。

在这里插入图片描述
在 Kylin 4.0 中,parquet 文件存储的目录结构如下:

在这里插入图片描述
查询时,查询引擎可以通过日期分区列过滤出 segment-level 目录,并通过 cuboid 过滤出 cuboid-level 目录。但是在 cuboid-level 目录中仍有许多 parquet 文件,可以使用 shard by 列进一步裁剪parquet 文件。目前在 SQL 查询中只支持以下过滤操作来裁剪 parquet 文件:Equality、In、InSet、IsNull。

A、修改 cube 配置

这里拿已有的 cube 来做演示,先对已有 cube 清空数据。

在这里插入图片描述
对其 disable 禁用:

在这里插入图片描述

B、指定 shardby 列

进行编辑:

在这里插入图片描述
点击高级配置:

在这里插入图片描述
选择需要的列,将 shardby 改成 true。

在这里插入图片描述
点击 Overview,选择保存:

在这里插入图片描述
C、重新构建

在这里插入图片描述
当构建 cube 数据时,它会根据这个 shard 按列对 parquet 文件进行重分区。如果没有指定一个 shardby 的列,则对所有列进行重分区。

三、减少小的或不均匀的 parquet 文件

在查询时读取太多小文件或几个太大的文件会导致性能低下,为了避免这个问题,Kylin4.0 在将 cube 数据作为 parquet 文件构建时,会按照一定策略对 parquet 文件进行重分区,以减少小的或不均匀的 parquet 文件。

1. 相关配置

参数名默认值说明
kylin.storage.columnar.shard-size-mb128MB有 shardby 列的 parquet 文件最大大小
kylin.storage.columnar.shard-rowcount2500000每个 parquet 文件最多包含的行数
kylin.storage.columnar.shardcountdistinct-rowcount1000000指定 cuboid 的 bitmap 大小
kylin.storage.columnar.repartitionthreshold-size-mb128MB每个 parquet 文件的最大大小

2. 重分区的检查策略

如果这个 cuboid 有 shardBy 的列:

parquet 文件的平均大小 < 参数’kylin.storage.columnar.repartition-threshold-size-mb’ 值 ,且parquet 文件数量大于 1,这种情况是为了避免小文件太多

parquet 文件的数量 < (parquet 文件的总行数/ 'kylin.storage.columnar.shardrowcount' * 0.75),如果这个 cuboid 有精确去重的度量值(即 count(distinct)),使用’kylin.storage.columnar.shard-countdistinct-rowcount’ 来代替 ‘kylin.storage.columnar.shardrowcount’; 这种情况是为了避免不均匀的文件;如果满足上述条件之一,它将进行重分区,分区的数量是这样计算的:

${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)

3. 合理调整参数的方式

A、查看重分区的信息,可以通过下面命令去 log 中查找

grep "Before repartition, cuboid" logs/kylin.log

比如官方案例:可以看到分区数有 809 个。

在这里插入图片描述
B、增大 ‘kylin.storage.columnar.shard-rowcount’ 或 'kylin.storage.columnar.shard-countdistinctrowcount’的值,重新构建,查看日志:

在这里插入图片描述
在这里插入图片描述
可以看到:分区数变成了 3 个,构建的时间也从 58 分钟降低到 24 分钟。

C、查询性能得到提高

原先查询要 1.7 秒,扫描 58 个文件:

在这里插入图片描述
调整参数后,查询只要 0.4 秒,扫描 4 个文件:

在这里插入图片描述

四、将多个小文件读取到同一个分区

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

如果有足够的资源,可以减少该参数的值来增加并行度, 但需要同时减少
‘spark.hadoop.parquet.block.size’ (默认值为 128MB) 的值,因为 parquet 文件的最小分割单元是
RowGroup,这个 blocksize 参数表示 parquet 的 RowGroup 的最大大小。

五、使用堆外内存

Spark 可以直接操作堆外内存,减少不必要的内存开销,减少频繁的 GC,提高处理性能。

相关配置:

  • spark.memory.offHeap.enabled 设置为 true,使用堆外内存进行 spark shuffle
  • spark.memory.offHeap.size 堆外内存的大小
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kylin-arm64是一个针对ARM64架构的操作系统,它是中国自主研发的开源操作系统项目。kylin-arm64是基于Kylin操作系统的ARM64版本,旨在为ARM64架构的设备提供稳定、安全和高效的操作系统。 kylin-arm64的开发目标是能够在ARM64架构的硬件平台上运行,并支持多种不同类型的应用程序。它可以应用于手机、平板电脑、物联网设备以及服务器等领域。 kylin-arm64具有以下特点: 1. 高性能:kylin-arm64经过优化,能够充分利用ARM64架构的优势,提供高性能的计算能力和响应速度。 2. 安全性:kylin-arm64采用多种安全措施,包括安全启动、权限控制等,保证用户数据的安全和隐私的保护。 3. 稳定性:kylin-arm64经过严格的测试和验证,能够保持系统的稳定运行,减少崩溃和错误的发生。 4. 兼容性:kylin-arm64兼容ARM64架构的硬件设备,并支持多种应用程序和软件库。它可以运行基于Android的应用程序,同时还支持Linux上常用的开发工具和框架。 5. 可定制性:kylin-arm64的设计允许用户根据自己的需求进行定制和扩展。用户可以根据自己的应用场景,选择不同的功能模块和驱动程序。 总之,kylin-arm64是一个全面支持ARM64架构的功能强大的操作系统,它为ARM64设备提供了稳定、安全和高效的运行环境。该操作系统具有高性能、安全性、稳定性、兼容性和可定制性等优势,适用于多种应用场景和领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值