本文将讨论火山引擎EMR团队针对 Iceberg 组件的优化思路 , 通过引入索引来提高查询性能 。
文章插图
Apache Iceberg 是一种开源数据 Lakehouse 表格式 , 提供强大的功能和开放的生态系统 , 如:Time travel , ACID 事务 , partition evolution , schema evolution 等功能 。
本文将讨论火山引擎EMR团队针对 Iceberg 组件的优化思路 , 通过引入索引来提高查询性能 。
采用 Iceberg 构建数据湖仓火山引擎 E-MapReduce(简称 EMR)是火山引擎数智平台(VeDI)旗下的云原生开源大数据平台产品 , 提供了企业级的 Hadoop、Spark、Flink、Hive、Presto、Kafka、StarRocks、Doris、Hudi、Iceberg 等大数据生态组件 , 100% 开源兼容 , 可以帮助企业快速构建企业级大数据平台 , 降低运维门槛 。秉承业界领先的 EMR Stateless 理念 , 火山引擎 EMR 可以实现集群级别的弹性伸缩 , 即无业务需求时释放集群 , 有业务需求时再拉起集群 , 配合智能化的冷热数据分层存储能力 , 助力企业在大数据基建领域进一步降本提效 。
基于火山引擎 EMR 产品 , 可以构建数据湖仓、近实时数仓、实时数仓等场景 。例如 , 使用 Iceberg 构建数据湖仓 , 从 ODS 到 DWD 等不同的分层进行建模 , 将数据 HFDS 或 TOS(火山引擎对象存储产品)上 , 然后采用 Trino 或者 Spark 去做分析 。
文章插图
如何加速查询性能 , 使其尽可能接近专门的分布式数仓(如 ClickHouse 等) , 是需要思考和探究的问题 。
索引是业界常用的提高查询性能的手段之一 , 针对 Iceberg 我们也采用了增加索引的方式 。对常用的列字段构建 Index , 在进行 table scan 时利用 Index 只返回匹配的数据 , 降低匹配数据量 , 从而大大提高查询性能 。
Iceberg 介绍介绍 Iceberg Index 功能之前 , 我们先简单介绍下 Iceberg 的架构 。Iceberg 具有分层的元数据架构 , 如下如所示 。
文章插图
Spark、Presto、Flink 等多种引擎读取 Iceberg 的数据 , 就是利用分层的元数据找到 data file 列表 。例如 , Spark 引擎解析 SQL 语句 , 然后调用 Iceberg 的接口 , 获取 data file 并进行 task 切分 。
文章插图
在 Manifest file 中记录了 data file 中字段的最大值和最小值 。
"data_file": {"content": 0,"file_path": "hdfs://emr-cluster/warehouse/hive/db.db/sample/data/ts_day=2020-12-31/category=diamond/00000-0-220aa9a6-4530-499f-9450-da946d667624-00001.parquet","file_format": "PARQUET",......"lower_bounds": {"array": [{"key": 1,"value": "u0006u0000u0000u0000"}, {"key": 2,"value": "diamond"}, {"key": 3,"value": "u0000u0004Ü?Å·u0005u0000"}]},"upper_bounds": {"array": [{"key": 1,"value": "u0007u0000u0000u0000"}, {"key": 2,"value": "diamond"}, {"key": 3,"value": "u0000¨odÆ·u0005u0000"}]},......}
利用这些信息 , 可以进行 data file 级别的初步过滤 , 把不符合条件的 data file 过滤掉 , 进而减少一部分数据的读取 。实现索引的必要性既然 Iceberg 已经提供 data file 级别的过滤 。为什么我们还需要引入索引呢?以下面例子进行介绍 , 左边两个表格分别是 data file 文件里面的内容 , 右边表格是 data file 对应的 manifest file 。
文章插图
针对
SELECT * FROM table WHERE age > 50
, 利用 min-max 统计信息 , 很容易发现 data file 1 中没有满足条件的数据 , 因此 data file 1 就不会参与计算 。但是针对多维分析 , 如
name = 'LiLy' AND age > 30
, 利用name
和age
的min-max的统计信息分别对条件
推荐阅读
- JavaScript中的四种枚举方式
- Maps与WeakMaps在DOM节点管理中的妙用
- C++中对JSON格式的解析以及序列化和反序列化
- 在 Linux 内核中调试 FUSE 死锁
- Linux初学者在学习中常见的困惑
- 河南最著名的12道美食
- 汽车行驶中松开油门,发动机会熄火的原因是什么?
- 酸枣仁泡水一天喝几次
- 银耳凉水可以泡一夜吗
- |《雪中悍刀行》:太安城中有十一位高手,韩貂寺实力位列第四