动手点关注
干货不迷路
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 切分。