在大数据领域,数据管理和性能优化一直是永恒的话题。随着数据规模的不断增长和种类的增加,亟需有效地管理数据并确保高性能处理。亚信科技推出的 Hudi 自研特性为解决这一难题带来了全新的解决方案,包括:元数据服务、数据权限控制、常驻服务以及表达式 Payload,每一个特性都显著提升了数据入湖的易用性和性能。希望本文能够为广大数据工程师和开发者在实际工作中提供有价值的参考和帮助。
在引入元数据服务(Hudi MetaServer)之前,Hudi的元数据是以小文件方式存储在HDFS上。这种分散的存储方式导致元数据管理和查看对用户而言不是很方便。此外,在HDFS负载较高时,Hudi MetaClient的初始化时间会延长,导致写入和查询任务变慢;引入Hudi MS可以适当减缓HDFS访问压力。
为了解决这些问题,亚信科技在Hudi的演进方向上引入了Hudi MetaServer,实现了对Hudi表元数据的统一管理。Hudi MetaServer集中化管理元数据,提供了诸多增强的能力和特性:
1. 统一的权限管理:
• Hudi MetaServer 实现了对元数据的集中化管理,简化了权限控制。
• 提高了数据访问的安全性,确保了不同用户和应用程序之间的权限合规性。
• 减少了权限管理的复杂度。
2. 可视化服务平台:
• Hudi MetaServer 引入了直观的可视化界面,使用户能够方便地监控和管理元数据。
• 通过可视化工具,显著提升了问题分析效率,并降低了使用的复杂度。
• 实现了更高效的运维操作。
3. 表达式 Payload 处理扩展:
• 增强了数据处理的灵活性和功能性。
• 允许用户在处理数据时使用更丰富的表达式和逻辑,满足特殊的数据处理需求。
4. 多活水平扩展和动态最优分配策略:
• 通过架构设计,Hudi MetaServer 确保了系统的多活水平扩展。
• 通过动态最优分配策略提升系统性能,确保高负载情况下系统依然稳定运行,不影响数据处理任务的执行。
5. 跨平台的元数据服务管理:
• Hudi MetaServer 与 Flink、Spark、Hive 等主流计算查询引擎无缝对接。
• 用户可以在不同引擎间灵活切换和使用元数据,提升了数据处理的灵活性。
• 提供了更多选择,使得数据管理更加高效。
Hudi MetaServer的引入不仅简化了元数据管理,还大幅提升了系统的可用性和性能。未来,随着Hudi MetaServer的不断发展,其在权限管理、可视化服务和数据处理能力方面将进一步增强,成为数据湖管理领域的重要工具。这种演进将为企业在大数据处理和管理方面带来更高效、更可靠的解决方案。
在实现过程中解决了遇到的技术难题:
• 修改社区版本的hudi-common、platform-service模块,抽象新增Table API、Meta API、Permission API等,且分别实现server、client端相关逻辑。
• 实现基于Flink引擎自定义Hudi MetaServer Catalog。
• 实现基于Spark引擎自定义Hudi MetaServer Catalog。
• 实现Hive、Trino等主流引擎对接Hudi MetaServer查询数据能力。
• 实现Hudi MetaServer水平扩展能力,且支持动态最优分配策略。
• 实现基于Hudi MetaServer元数据可视化平台。
在Hudi MetaServer中,MetaServerAuthorizer负责总体权限检查,它通过调用checkTablePermission()方法来执行权限验证。权限验证流程从MetaServerDefaultAuthorizer开始,该组件根据设定的平台权限策略执行基础权限检查。
当使用Apache Ranger进行权限控制时,MetaServerRangerAuthorizer会与Ranger的管理服务器(RangerAdminServer)通信,获取最新的权限策略并执行检查。Ranger Hudi插件负责在Hudi MetaServer和Ranger之间传递权限策略,确保权限策略的一致性和实时性。
对于外部计算引擎(如Flink、Spark、Hive和Trino),权限检查通过RPC机制进行。每个计算引擎在执行数据读写操作之前,会调用HoodieTablePermissionMSClient中的checkTableWritePermission()方法,该方法继承自HoodieTablePermissionClient。该客户端负责与Hudi MetaServer进行通信,执行远程权限检查。
在执行权限检查时,HoodieTablePermissionMSClient会通过RPC请求将权限检查请求发送到TableService,后者负责具体的权限验证逻辑。TableService调用MetaServerDefaultAuthorizer或MetaServerRangerAuthorizer进行权限检查,并将结果返回给调用的计算引擎。
这种架构设计确保了权限控制的高效性和安全性,统一了不同计算引擎的权限管理,并通过集成Apache Ranger实现了更高级的权限管理功能。同时,权限检查的集中化和自动化进一步增强了系统的安全性和合规性,减少了人工干预和潜在的安全漏洞。
分区TTL(Partition TTL)主要依据分区数据的创建时间或最近更新时间,判断其是否小于设定的数据保留时间。如果小于设定的保留时间,则整个分区数据将被清除。
记录级TTL(Record TTL)通过在数据写入和查询时进行时间比对来管理数据的生命周期。查询时,如果数据不符合保留时间要求,则不会返回结果。对于已经写入但已过期的数据,系统通过Hudi的Compaction和Clustering服务进行清理,以确保数据时效性。
上图通过驻留时长业务实例,简要描述了表达式Payload的运行机制。
表达式Payload的使用主要体现在Hudi表的创建过程中,通过指定相关参数来实现。在任务提交后,系统根据指定的表达式参数进行加载和编译。数据流入时,系统基于编译后的表达式对数据进行处理,生成符合预期的结果,最终写入Hudi表进行汇总。该机制确保了用户可以在数据处理过程中应用高度定制化的逻辑,提升了数据处理的灵活性和效率。具体而言:
1. 表定义阶段:用户在创建Hudi表时,通过Flink SQL指定payload类和表达式路径。
2. 任务提交阶段:在作业提交后,系统进入初始化阶段,加载并编译指定的表达式。
3. 数据处理阶段:当数据流入时,系统根据编译后的表达式对每条记录进行处理,生成结果并写入Hudi表进行汇总。
这种方法不仅提高了数据处理的灵活性,还确保了处理效率,使得复杂业务逻辑的实现变得更加简便。
本文分享了亚信科技Hudi MetaServer探索演进,介绍了在大数据Hadoop架构下向湖仓一体演进的技术路线,提出了基于现有能力下的功能特性。未来随着数字化的发展,数据多样性和实时性要求也会越来越高,这对湖仓一体架构也会提出更高的要求,后续的演进方向:
• LLS(Long Live Service):Hudi常驻表服务,通过常驻服务集中化处理多表零碎的表服务任务,提升资源使用率,以及更近一步降低入湖门槛。
• 多表融合:支持多个Hudi表融合使用。
• 多索引融合:支持单表索引演进。
• JDBC协议支持:支持JDBC通用协议,进行数据查询、写入。