热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kylin(六)查询性能优化

目录前言一、使用排序列快速读取parquet文件二、使用shardby列来裁剪parquet文件三、减少小的或不均匀的parquet文件1.相关配置2.重分区的检查策略3.合理调整




目录


  • 前言
  • 一、使用排序列快速读取 parquet 文件
  • 二、使用 shardby 列来裁剪 parquet 文件
  • 三、减少小的或不均匀的 parquet 文件
    • 1. 相关配置
    • 2. 重分区的检查策略
    • 3. 合理调整参数的方式

  • 四、将多个小文件读取到同一个分区
  • 五、使用堆外内存





前言

在 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’ 值 &#xff0c;且parquet 文件数量大于 1&#xff0c;这种情况是为了避免小文件太多

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

${fileLengthRepartitionNum} &#61; Math.ceil(${parquet 文件大小 MB} / ${kylin.storage.columnar.shard-size-mb})
${rowCountRepartitionNum}&#96; &#61;&#96;Math.ceil(${parquet 文件总行数} / ${kylin.storage.columnar.shard-rowcount})

分区数量&#61;Math.ceil(( ${fileLengthRepartitionNum} &#43; ${ rowCountRepartitionNum } ) / 2)


3. 合理调整参数的方式

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

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

比如官方案例&#xff1a;可以看到分区数有 809 个。

在这里插入图片描述
B、增大 ‘kylin.storage.columnar.shard-rowcount’ 或 &#39;kylin.storage.columnar.shard-countdistinctrowcount’的值&#xff0c;重新构建&#xff0c;查看日志&#xff1a;

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

C、查询性能得到提高

原先查询要 1.7 秒&#xff0c;扫描 58 个文件&#xff1a;

在这里插入图片描述
调整参数后&#xff0c;查询只要 0.4 秒&#xff0c;扫描 4 个文件&#xff1a;

在这里插入图片描述


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

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

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


五、使用堆外内存

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

相关配置&#xff1a;


  • spark.memory.offHeap.enabled 设置为 true&#xff0c;使用堆外内存进行 spark shuffle
  • spark.memory.offHeap.size 堆外内存的大小






推荐阅读
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 使用Python构建网页版图像编辑器
    本文详细介绍了一款基于Python开发的网页版图像编辑工具,具备多种图像处理功能,如黑白转换、铅笔素描效果等。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 本文详细介绍了如何使用Linux下的mysqlshow命令来查询MySQL数据库的相关信息,包括数据库、表以及字段的详情。通过本文的学习,读者可以掌握mysqlshow命令的基本语法及其常用选项。 ... [详细]
  • 本文探讨了如何利用 Android 的 Movie 类来展示 GIF 动画,并详细介绍了调整 GIF 尺寸以适应不同布局的方法。同时,提供了相关的代码示例和注意事项。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 本文介绍了如何使用 Python 的 Pyglet 库加载并显示图像。Pyglet 是一个用于开发图形用户界面应用的强大工具,特别适用于游戏和多媒体项目。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • Eclipse 开发环境配置指南:从下载到免安装配置
    Eclipse 是一个广泛使用的开源Java开发环境,掌握其正确的安装与配置方法对于初学者至关重要。本文将详细介绍如何下载、安装及配置Eclipse,确保您的开发环境搭建顺利。 ... [详细]
  • 深入解析:存储技术的演变与发展
    本文探讨了从单机文件系统到分布式文件系统的存储技术发展过程,详细解释了各种存储模型及其特点。 ... [详细]
  • 本文探讨了一种统一的语义数据模型,旨在支持物联网、建筑及企业环境下的数据转换。该模型强调简洁性和可扩展性,以促进不同行业间的插件化和互操作性。对于智能硬件开发者而言,这一模型提供了重要的参考价值。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文详细记录了 MIT 6.824 课程中 MapReduce 实验的开发过程,包括环境搭建、实验步骤和具体实现方法。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
author-avatar
为爱进地狱天堂_954
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有