
数据湖构建是企业实现海量数据统一存储与分析的关键步骤。本文介绍基于腾讯云弹性 MapReduce ( EMR )的数据湖构建方案,结合 Apache Iceberg 表格式与 Alluxio 分布式缓存,形成存储、表格式、缓存三层加速架构,帮助企业高效搭建云端数据湖技术架构。
数据湖构建是指企业将分散在各个业务系统中的海量数据,统一存储到一个可扩展的存储系统中,并基于该存储系统构建数据分析、数据加工能力的过程。
数据湖与传统数据仓库的主要区别在于,数据湖可以以原始格式存储结构化、半结构化和非结构化数据,而数据仓库通常要求数据经过清洗和转换后才能存入。这种特性使得数据湖在大数据场景下具有更高的灵活性。
数据湖构建通常涉及以下几个核心环节:
在云计算环境下,数据湖构建可以进一步利用云平台的弹性伸缩、存算分离等特性,降低运维复杂度,提升资源利用率。
腾讯云弹性 MapReduce ( EMR )是基于云原生技术和泛 Hadoop 生态开源技术的安全、低成本、高可靠的开源大数据平台。 EMR 提供易于部署及管理的 Hive 、 Spark 、 HBase 、 Flink 、 StarRocks 、 Iceberg 、 Alluxio 等开源大数据组件,帮助客户高效构建云端企业级数据湖技术架构。
EMR 支持基于云服务器( CVM )和容器服务( TKE )两种部署运行方式:
EMR on CVM: EMR 负责将开源大数据组件安装部署在 CVM 上,并启动相应的服务。用户可以通过 EMR 控制台完成对集群 CVM 及服务的运维操作。
EMR on TKE:如用户已准备好一个 TKE 标准集群或 Serverless 集群, EMR 将基于 TKE 的资源安装部署开源大数据组件,实现开源大数据平台的容器化运行,用户可减少对于底层资源的运维关注。
EMR 在数据湖构建中提供以下核心能力:
集群管理:支持超过 30 种开源大数据组件,灵活按需部署。支持设置对象存储或云 HDFS 存放业务数据。支持按需升级节点硬件配置,按需扩缩 Task 节点或 Router 节点。
服务管理:提供 HDFS 主备切换及数据均衡可视化操作,支持 YARN 主备切换及刷新队列可视化操作,支持 OpenLDAP 用户管理。
监控告警:为集群中节点和服务提供全面的监控告警服务,支持查看节点和服务运行指标,并可通过 API 获取指标。支持服务角色运行日志搜索,支持主动巡检集群运行情况。
组件增强:基于开源组件深度优化其性能及功能,提供 Spark 物化视图、 Alluxio 透明加速、 Iceberg Z-Order 算法等优化技术。
在数据湖构建过程中,表格式( Table Format )是连接存储层与计算引擎的关键中间层。 Apache Iceberg 是一个面向大规模分析数据集的开放表格式。
Iceberg 的技术架构分为三层:
Catalog 层:存储表的位置和元数据指针。查询引擎首先联系 Catalog 来获取表的当前状态。 Catalog 更新是将表写入事务化的原子操作。
元数据层:包含文件层级结构。元数据 JSON 文件指向一个或多个清单列表( Manifest List ),每个清单列表指向多个清单文件( Manifest File ),每个清单文件列出数据文件(如 Parquet 文件)及其统计信息。
数据层:实际的数据文件,通常为 Parquet 、 ORC 或 Avro 格式。这些数据文件不会被原地修改,写入操作会创建新文件, Iceberg 的提交协议原子性地更新元数据指针以包含新文件并排除被替换的文件。
ACID 事务支持:基于快照的隔离机制,写入生成新快照,查询读取历史一致性视图。采用乐观锁并发控制,冲突时自动重试或报错。
模式演化( Schema Evolution ):可以安全地新增、重命名、删除列,无需重写数据文件。模式演化保持向后兼容,旧查询可以读取新数据写入的数据。
分区演化( Partition Evolution ):可以动态修改分区策略,例如从按月分区改为按天分区,旧查询无需改写。
隐藏分区( Hidden Partitioning ):表定义分区变换,写入时自动计算分区值并记录在元数据中,查询时引擎根据 WHERE 条件过滤分区,用户无需知道分区字段名。
时间旅行( Time Travel ):支持按快照 ID 或时间戳查询表的历史状态,支持版本回滚。
EMR 基于 Iceberg 进行了性能及功能增强,提供 Iceberg Z-Order 算法等优化技术。 Z-Order 是一种数据布局优化技术,通过多维排序提升查询性能,减少需要扫描的数据文件数量。
Alluxio 是位于计算框架与存储系统之间的分布式缓存层,可以显著优化数据访问效率。
Alluxio 包含三种组件: Master 、 Worker 和 Client 。
Alluxio Master:负责管理整个集群的全局元数据,包括文件系统元数据、数据块元数据以及 Worker 容量元数据。 Alluxio 集群中只有一个 Leading Master ,多个 Standby Master 提供高可用能力。
Alluxio Worker:负责管理分配给 Alluxio 的用户可配置本地资源( RAM 磁盘、 SSD 、 HDD 等)。 Alluxio Worker 以块( Block )为单位存储数据。
Alluxio Client:为用户提供了一个可与 Alluxio 服务交互的网关。 Client 发起与 Leading Master 节点的通信,来执行元数据操作,并从 Worker 读取和写入存储在 Alluxio 中的数据。
Alluxio 将应用的热、温、冷数据对应内存、 SSD 、 HDD 不同缓存类型,自动动态调整对缓存资源的使用。当底层数据发生变动时, Alluxio Master 与底层存储同步,更新 Alluxio 中的元数据。
Alluxio 实现了对异步读写的优化。例如当应用首次读取某数据块时,先从存储中读取该数据块返回给应用,接着 Alluxio 缓存该数据块附近的数据,以便下次高效读取数据。
EMR 提供 Alluxio 透明加速功能。透明加速是指 Alluxio 对应用程序是透明的,应用程序无需修改代码即可获得数据访问加速效果。 Alluxio 支持 S3 API 、 POSIX 和 Python 等多种接口,与现有技术栈完美集成。
基于 EMR 、 Iceberg 和 Alluxio ,可以构建完整的数据湖三层加速架构。该架构将存储、表格式、缓存三个层次清晰分离,各层职责明确,协同工作。
存储层负责实际数据的持久化存储。在腾讯云 EMR 方案中,存储层可以使用以下存储系统:
其中,腾讯云对象存储( COS )提供了高可靠、可弹性扩展的存储能力,适合作为数据湖的存储底座。数据以 Parquet 、 ORC 或 Avro 等格式存储在对象存储中。
表格式层由 Apache Iceberg 提供,负责数据的元数据管理、事务控制、模式演化等能力。
Iceberg 将数据的元数据以层级结构组织:元数据文件记录表的整体信息(当前快照 ID 、表模式、分区规范等),清单列表记录快照包含的所有清单文件路径,清单文件记录数据文件的路径和统计信息。
这种层级化的元数据设计使得查询规划时无需扫描整个目录,只需读取相关的元数据文件即可确定需要访问的数据文件,从而提升了查询规划效率。
缓存加速层由 Alluxio 提供,负责将频繁访问的数据缓存到计算集群本地,减少远程存储访问带来的延迟。
Alluxio 的缓存策略支持多层存储:热数据缓存在内存中,温数据缓存在 SSD 中,冷数据保留在 HDD 中或从底层存储中读取。 Alluxio Worker 基于 LRU (最近最少使用)缓存策略自动管理缓存数据的淘汰。
当计算引擎(如 Spark 、 Presto )需要读取数据时,首先查询 Alluxio 缓存,如缓存命中则直接返回本地数据,避免远程存储访问。
数据写入流程:
数据读取流程:
基于 EMR + Iceberg + Alluxio 方案,可以支持多种数据湖应用场景。
离线数据分析是数据湖的常见应用场景。企业将日常业务中产生的数据定期导入数据湖,然后使用 Spark 、 Hive 等计算引擎进行离线分析。
Iceberg 的 ACID 事务特性保证了离线分析过程中数据的一致性。 Alluxio 缓存加速层可以提升频繁执行的离线分析作业的查询性能。
通过 Flink 消费 Kafka 数据,然后写入 Iceberg 表,可以实现数据的实时接入。 Iceberg 支持流式写入,并且提供快照机制,支持分钟级延迟的分析需求。
在这种场景下, Iceberg 表可以同时支持实时写入和离线分析,避免了数据孤岛问题。
批流一体是指同一份数据可以同时支持批处理和流处理。基于 Iceberg 的表格式,可以实现批流一体的数据处理架构。
Flink 负责实时数据接入, Spark 负责批量数据处理,两个引擎可以同时操作同一张 Iceberg 表,而无需担心数据一致性问题。这是 Iceberg 的引擎中立特性带来的优势。
在数据湖构建过程中,元数据管理是一个核心问题。传统的 Hive 表格式在元数据管理方面存在诸多限制,如不支持 ACID 事务、模式演化能力弱等。
Iceberg 提供了完善的元数据管理能力,支持模式演化、分区演化、隐藏分区等特性,使得数据湖的元数据管理更加可靠和灵活。
在基于 EMR 构建数据湖时,需要关注以下关键事项。
数据湖中数据的存储格式直接影响查询性能。 Parquet 是推荐的列式存储格式,具备高效压缩和谓词下推优化能力。 ORC 格式也具有类似的特性,并且在 Hive 兼容性方面表现良好。
在 EMR 中创建 Iceberg 表时,可以指定数据文件的格式。根据业务需求选择合适的存储格式,可以在存储成本和查询性能之间取得平衡。
合理的分区策略可以显著提升查询性能。 Iceberg 支持隐藏分区,用户无需在查询中显式指定分区字段, Iceberg 会根据 WHERE 条件自动进行分区裁剪。
在设计分区策略时,需要考虑数据的访问模式。通常选择时间字段作为分区字段,因为数据分析场景中最常见的过滤条件就是时间范围。
Iceberg 还支持分区演化,可以在后期修改分区策略,而无需重写已有数据文件。
Alluxio 的缓存策略直接影响加速效果。在为 Alluxio 配置缓存资源时,需要根据数据的访问模式来决定内存、 SSD 和 HDD 的容量分配。
对于访问频率高的热数据,应优先缓存在内存中。对于访问频率中等的温数据,可以缓存在 SSD 中。 Alluxio 会自动根据数据的访问热度调整缓存位置。
数据湖中的数据通常涉及企业的核心业务信息,需要严格的权限管控。 EMR 支持 VPC 网络隔离和安全组,保证网络安全可信。支持 Kerberos 身份认证,支持基于 Ranger 对本地及 COS 数据细粒度权限管控。
在构建数据湖时,需要提前规划好权限管控策略,包括网络隔离、身份认证、数据权限等多个层次。
数据湖构建完成后,运维管理是保障数据湖持续稳定运行的关键。
EMR 提供云原生一体化丰富的监控指标,支持自定义配置告警。用户可以通过 EMR 控制台查看节点和服务运行指标,也可以通过 API 获取指标数据。
关键监控指标包括:集群 CPU 使用率、内存使用率、磁盘使用率、网络流量、服务角色运行状态等。
EMR 支持根据业务运行时间特点和负载特点自动伸缩 Task 节点。这意味着在数据湖的分析负载高峰期,集群可以自动扩充计算资源,在负载低谷期自动释放资源,从而实现成本优化。
弹性伸缩策略可以根据时间规律(如每天固定时间段扩展)或负载指标(如 CPU 使用率超过阈值时扩展)来触发。
在 Iceberg 数据湖中,随着数据的不断写入,会产生大量小文件,影响查询性能。需要定期进行数据优化操作,包括小文件合并、过期快照清理等。
EMR 支持通过 Spark 作业对 Iceberg 表进行数据优化。也可以配置自动优化策略,让系统定期执行优化操作。
了解更多产品详情: https://cloud.tencent.com/product/emr
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。