博客
关于我
Apache Hudi和Presto的前世今生
阅读量:435 次
发布时间:2019-03-06

本文共 2114 字,大约阅读时间需要 7 分钟。

Apache Hudi与Presto集成深度解析

Apache Hudi(Hadoop数据湖 Unified)作为一款专为大规模数据集设计的分布式数据湖存储系统,已成为企业构建和管理PB级数据湖的重要工具。Hudi通过引入upserts、deletes和增量查询等原语,将流式处理的能力引入批处理领域,为企业提供了更快、更更新鲜的数据访问体验。

1. Apache Hudi概述

Hudi的核心设计目标是为企业构建和管理PB级数据湖。在数据组织和存储方面,Hudi采用了一种创新的模型,将数据文件写入到一个更受管理的存储层中,该层能够与主流查询引擎(如Presto)进行有效的互操作。此外,Hudi在项目演变中积累了丰富的经验,为数据湖的管理和扩展提供了坚实的基础。

2. Hudi的核心特性

Hudi通过以下两个主要原语实现流式处理与批处理的结合:

  • 记录级别更新/删除:支持更新或删除特定记录,使用文件/记录级别索引提供事务保证,查询时可获取最新提交的快照以生成结果。
  • 增量查询:支持从指定时间点开始对表中所有更新、插入、删除记录进行增量查询。

这些特性使得数据工程师无需重写整个表或重新加载所有数据,仅需处理更新和删除的记录即可显著提升处理效率。

3. Hudi表类型

Hudi支持两种主要表类型,适用于不同的数据访问和存储需求:

3.1 Copy On Write (COW) 表

  • 数据存储格式:列式存储格式(如Parquet)。
  • 特点:
    • 在写入时同步更新版本/重写数据。
    • 适合需要最新数据访问的场景,但可能带来较高的延迟和I/O开销。

3.2 Merge On Read (MOR) 表

  • 数据存储格式:结合列式存储格式(Parquet)和行存储格式(Avro)。
  • 特点:
    • 增量写入到delta文件中,后续通过压缩操作与基础Parquet文件合并。
    • 提供较低的数据延迟和I/O开销,但Parquet文件大小通常较大。

4. Hudi查询类型

Hudi提供三种主要查询类型,满足不同的数据访问需求:

4.1 快照查询

  • 查询特定提交/压缩版本的表的最新快照。
  • 对于Merge On Read表,通过合并基础Parquet文件和增量delta文件提供近实时数据(通常在分钟级别)。
  • 对于Copy On Write表,直接提供最新版本的Parquet数据。

4.2 增量查询

  • 查询从指定时间点以来新写入的数据。
  • 适用于需要处理数据变更流的场景,如ETL/派生管道。

4.3 读优化查询

  • 查询特定提交/压缩版本的表的最新快照。
  • 仅提供最新版本的基础/列式数据文件。
  • 与非Hudi表相同的列式查询性能。

5. Presto与Hudi集成

Presto作为一款高性能的查询引擎,与Hudi的集成是数据湖生态系统的重要组成部分。随着时间的推移,Presto对Hudi表的支持能力不断增强。

5.1 早期集成方案

  • Hudi最初通过自定义注解和inputformat实现与Presto的集成。
  • 提供了基本的COW表支持,并能读取MOR表的优化查询(仅从基础Parquet文件获取数据)。

5.2 移除InputFormat.getsplits()

  • 该方法存在以下缺陷:
    • 对NameNode的RPC调用次数过多,可能导致背压。
    • 冗余地扫描和复用Hudi表的分区文件。
  • 解决方案:
    • 通过在Hudi表中添加编译时依赖项,优化切片加载逻辑。
    • 在Presto的DirectoryLister接口中引入PathFilter,提供定制化的文件过滤逻辑。

5.3 Presto支持MOR表查询

  • 后续版本中,Presto增强了对MOR表的支持。
  • 通过引入新的InputFormatRecordReader类,实现对MOR表中更新鲜数据的访问。
  • 在Hive中,通过自定义切片加载器和记录读取器,支持对MOR表的实时查询。

6. Hudi与Presto的未来计划

Hudi与Presto的集成仍有诸多值得探索的领域:

6.1 引导表支持

  • 提供对外部数据引导表的支持,允许用户在不重写数据集的情况下迁移至Hudi表。
  • 利用现有的MOR查询支持,实现高效的数据迁移。

6.2 时间点查询

  • 在Presto中支持Hudi表的时间点查询。
  • 通过在metastore中注册增量表,结合查询谓词获取详细信息。
  • 在Spark中已有增量查询实现,Presto需要类似的支持。

6.3 压缩和优化

  • 优化Hudi的listStatus操作,减少对云/对象存储的大量元数据查询。
  • 提供更高效的文件切片和元数据管理机制,提升查询性能。

6.4 索引优化

  • 提供记录级别索引支持,减少查询开销。
  • 探索在Presto查询规划中利用索引信息的方法。

7. 总结

Apache Hudi为大规模数据湖的管理提供了强大的基础支持,而Presto作为一款高性能查询引擎,是连接数据湖和用户需求的重要桥梁。随着两者的深度集成,企业能够更高效地处理和分析数据,实现实时数据访问和快速决策。

如需了解更多技术细节或参与Hudi与Presto的集成项目,请访问Apache Hudi官方文档或参与开源社区讨论。

转载地址:http://ihcyz.baihongyu.com/

你可能感兴趣的文章
Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
查看>>
Netty工作笔记0050---Netty核心模块1
查看>>
Netty工作笔记0057---Netty群聊系统服务端
查看>>
Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
查看>>
Netty工作笔记0063---WebSocket长连接开发2
查看>>
Netty工作笔记0070---Protobuf使用案例Codec使用
查看>>
Netty工作笔记0077---handler链调用机制实例4
查看>>
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty工作笔记0085---TCP粘包拆包内容梳理
查看>>
Netty常用组件一
查看>>
Netty常见组件二
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty心跳检测机制
查看>>
Netty核心模块组件
查看>>
Netty框架内的宝藏:ByteBuf
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—3.Reactor线程模型三
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>