该平台拥有重要的组件和功能,包括流式传输支持、原生计算引擎、自动化建模以及更智能的元数据处理。这些改进使其更加易于使用、性能更佳,并且更符合现代数据架构。
Apache Kylin 是一款开源OLAP 引擎,旨在为海量数据集提供亚秒级查询性能。Kylin 最初由 eBay 开发,后捐赠给 Apache 软件基金会,现已发展成为广泛采用的大数据分析工具,尤其适用于处理复杂管道中数万亿条记录的环境。
该平台以将 OLAP 性能与分布式系统的规模相结合而闻名。它弥合了复杂、大规模数据存储与现代商业智能工具的速度要求之间的差距,从而能够根据更新的数据做出更快的决策。
在本教程中,我们将探索 Kylin 的核心功能,逐步讲解其架构,并了解它如何改变大数据分析领域的格局。让我们开始吧!
理解 Apache Kylin 的核心能力
让我们首先看看 Apache Kylin 的优点。
Apache Kylin即使在处理数万亿行的数据集时也能实现亚秒级延迟。这得益于其大量使用预计算数据模型和优化的索引。当性能和速度至关重要时,Kylin 便能脱颖而出。
同样,Kylin 也能轻松处理高并发。无论系统是同时处理数百个查询,还是执行繁重的聚合操作,其底层架构都能够灵活扩展,不会成为瓶颈。
Kylin 的另一大优势在于其统一的大数据仓库架构。它与 Hadoop 生态系统和数据湖平台原生集成,非常适合已投资分布式存储的组织。在可视化和业务报告方面,Kylin 可与 Tableau、Superset 和 Power BI 等工具无缝集成。它公开的查询接口使我们能够探索数据,而无需了解底层的复杂性。
此外, 如果我们寻找可用于生产环境的功能,Kylin 提供了强大的安全性、元数据管理和多租户功能,使其适合大规模企业使用。Kylin 的性能并非仅仅源于运气;其组件采用多维建模、智能索引和高效的数据加载管道,从头开始设计。
让我们仔细看看这些元素如何为其功能做出贡献。
多维建模和模型的作用
Kylin 的核心是其数据模型,该模型使用星型或雪花型模式构建,用于定义底层数据表之间的关系。在此结构中,我们定义维度,即我们想要分析的视角或类别(例如区域、产品或时间)。此外,还有度量和聚合数值,例如总销售额或平均价格。
同样,Kylin 也支持计算列,这使我们能够使用表达式或转换来定义新字段,这对于标准化日期格式或创建派生属性非常有用。它在模型定义阶段处理连接,使 Kylin 能够理解关系并相应地优化模型。
模型一旦建立,就成为索引创建和数据加载的基础。
索引设计和预计算(CUBE)
为了实现其速度,Kylin 高度依赖于预计算。它会构建索引(也称为 CUBE),这些索引会根据模型维度和度量提前聚合数据。Kylin 中主要有两种类型的索引:
- 聚合索引:这些存储维度和度量的预先聚合组合,例如按产品和月份划分的总收入。
- 表索引:这些是多级索引,有助于提供详细或向下钻取的查询,例如获取特定用户下的最后 50 个订单。
值得注意的是,索引设计至关重要。索引越有针对性、越高效,查询时消耗的存储和处理能力就越少。
数据加载过程
模型和索引准备就绪后,我们需要加载数据。Kylin 中的数据加载包括构建 CUBE 并将预先计算的结果填充到其中。
传统上,这是使用离线数据以批处理模式完成的。Kylin 从源表(通常是 HDFS 中的 Hive 或 Parquet 文件)读取数据,并将数据处理到其索引结构中。
此外,Kylin 还支持Apache Kafka等流式数据源,实现近乎实时的提取和分析。这使得 Kylin 可以在混合批流式场景中使用,而无需更改分析层。
重要的是,一旦我们加载数据,查询就会针对预先构建的索引而不是原始数据集运行,无论底层容量如何,都能提供一致且可预测的性能。
如何在 Docker 中运行 Apache Kylin
探索 Apache Kylin 的最快方法是将其部署到 Docker 容器中。如果我们想在本地测试新功能或评估最新版本,这无疑是完美的选择。
让我们看一个docker run命令来开始使用 Apache Kylin:
$ docker run -d \ |
在这里,我们拉取 5.0 版本的独立镜像并启动它。我们将 Apache Kylin 5.0 作为独立容器启动,并公开一些常用端口以便于访问:
- –name:为容器分配名称
- –hostname:设置容器的主机名(有助于内部引用)
- -e TZ=UTC:将时区设置为 UTC
- -m 10G:将容器的内存使用量限制为 10 GB(建议为容器分配至少 10 GB 内存以获得更流畅的体验)
- -p选项:将容器中必要的 Kylin 和 Hadoop 相关服务端口映射到主机
- apachekylin/apache-kylin-standalone:5.0.0-GA:镜像,包含捆绑在一起的所有必要服务
$ docker ps --filter name=Kylin5-Machine |
确认容器已启动后,我们可以通过http://localhost:7070访问 Kylin Web UI并开始探索。此设置为我们提供了在独立环境中构建模型和探索数据集所需的一切。
验证 Kylin 实例
一旦容器运行,我们可以通过curl使用简单的健康检查来验证实例:
$ curl http://localhost:7070/kylin/api/system/health
如果一切正常,我们应该看到指示服务器状态为UP 的响应:
{ |
这确认 Kylin 的内部服务、元数据、查询引擎和存储正在运行并准备好接受操作。
访问 Kylin Web 界面
Kylin UI 的访问地址为http://localhost:7070。我们可以使用默认凭证登录:
Username: ADMIN |
一旦启动,Kylin 的 Web 界面还可以通过其他端口访问 Spark 和 Hadoop UI 组件。
从这里,我们可以创建项目、上传数据模型并开始构建 CUBE。界面还包含用于管理元数据、监控构建作业以及交互式测试 SQL 查询的部分。
如何使用 SQL 在 Apache Kylin 中定义模型并构建 CUBE
借助 Kylin,我们还可以使用纯 SQL 和 REST API 定义模型并启动 CUBE 构建。这使得整个流程更加简洁、自动化,非常适合开发密集型环境。让我们来详细了解一下。
将表加载到 Kylin
假设源表sales_data存在于 Hive 或类似目录中,我们首先将其告知 Kylin。
为此,我们可以通过curl向/tables API发出 POST 请求:
$ curl -X POST http://localhost:7070/kylin/api/tables/default.sales_data \ |
在这里,我们将源表sales_data注册到 sales_analytics 项目中。这会指示 Kylin 从已配置的目录(例如 Hive 或 JDBC)中提取sales_data表的元数据。我们来看一个示例输出:
{ |
我们可以看到,一旦注册,就可以用于模型创建。
从 SQL 创建模型
事情开始变得有趣了。现在我们可以使用 SQL 语句定义一个模型,Kylin 会自动推断维度、度量和连接。
让我们看一个示例 SQL:
SELECT |
这告诉 Kylin 尺寸和尺寸是多少。
现在,让我们通过 API 将此 SQL 发送给 Kylin 的建模引擎:
$ curl -X POST http://localhost:7070/kylin/api/models/sql \ |
如果请求成功,Kylin 会创建一个包含所有提到的列的新模型,以及对order_amount的基本聚合:
{ |
这里,通过直接从 SQL 推断元数据,创建了一个新的模型 sales_cube_model。它自动将分组字段标记为维度,并将聚合应用为度量。
触发 CUBE 构建作业
一旦模型创建完成,我们就可以触发构建作业来实现索引。
首先,我们获取模型的 ID(或名称),然后发送构建请求:
$ curl -X PUT http://localhost:7070/kylin/api/jobs \ |
运行此命令后,Kylin 开始使用默认聚合组构建 CUBE,并输出状态:
{ |
这将为模型安排一次完整的 CUBE 构建(覆盖所有时间范围)。Kylin 会预先计算模型中定义的聚合。此处的时间戳范围比较宽泛,非常适合完整构建。
监控构建状态
为了监控构建状态,我们可以随时使用作业 API 检查构建作业的状态:
$ curl -X GET "http://localhost:7070/kylin/api/jobs?projectName=sales_analytics" \ |
响应会显示作业阶段、状态、持续时间以及构建是否成功。一旦返回“ job_status”:“FINISHED ”,我们就可以进行查询了。
值得注意的是,Kylin 支持基于查询模式的索引剪枝。执行几次查询后,我们可以在 API 中查看索引使用情况统计。我们可能会发现某些维度很少一起使用,从索引定义中修剪这些组合可以缩短构建时间并减少存储量,同时不影响查询覆盖率。
简而言之,我们已经完整地建模了数据集,定义了聚合,并实现了 CUBE 的物化。现在我们可以查询 next,甚至可以将此流程作为 CI/CD 分析流水线的一部分自动化执行。对于重复的数据加载,我们可以使用 cron 作业或 CI 流水线自动化 CUBE 的构建过程。
Kylin 的 REST API 支持脚本,因此可以轻松地在午夜、每小时或新数据到达源系统时触发构建。