Apache Pulsar结合Hudi构建Lakehouse方案分析


Posted in Servers onMarch 31, 2022

1. 动机

Lakehouse最早由Databricks公司提出,其可作为低成本、直接访问云存储并提供传统DBMS管系统性能和ACID事务、版本、审计、索引、缓存、查询优化的数据管理系统,Lakehouse结合数据湖和数据仓库的优点:包括数据湖的低成本存储和开放数据格式访问,数据仓库强大的管理和优化能力。Delta Lake,Apache Hudi和Apache Iceberg是三种构建Lakehouse的技术。

与此同时,Pulsar提供了一系列特性:包括分层存储、流式卸载、列式卸载等,让其成为一个可以统一批和事件流的存储层。特别是分层存储的特性,然Pulsar成为一个轻量级数据湖,但是Pulsar还是缺乏一些性能优化,比如索引,数据版本(在传统DBMS管理系统中非常常见),引入列式卸载程序的目的是为了缩小性能差距,但是还不够。

本提议尝试将Apache Pulsar作为Lakehouse,该提案仅提供顶层设计,详细设计和实现在后面的子提议中解决;

2. 分析

本部分将分析构建Lakehouse需要的关键特性,然后分析Pulsar是否满足要求以及识别还有哪些差距。

Lakehouse有如下关键特性:

  • 事务支持:企业级Lakehouse中很多数据pipeliine会并发读写数据,支持ACID事务可以保证并发读写的一致性,特别是使用SQL;Delta Lake,Iceberg,Hudi三个数据湖框架都基于低成本的对象存储实现了事务层,都支持事务。Pulsar在2.7.0版本后引入了事务支持,并且支持跨topic的事务;
  • Schema约束和治理:Lakehouse需要支持Schema的约束和演进,支持数仓型Schema范式,如星型/雪花型Schema,另外系统应该能够推理数据完整性,并且应该具有健壮的治理和审核机制,上述三个系统都有该能力。Pulsar有内置的Schema注册服务,它满足Schema约束和治理的基本要求,但是可能仍有一些地方需要改进。
  • BI支持:Lakehouses可以直接在源数据上使用BI工具,这样可以减少陈旧性,提高新鲜度,减少等待时间,并降低必须同时在数据湖和仓库中操作两个数据副本的成本。三个数据湖框架与Apache Spark的集成非常好,同时可以允许Redshift,Presto/Athena查询源数据,Hudi社区也已经完成了对多引擎如Flink的支持。Pulsar暴露了分层存储中的段以供直接访问,这样可以与流行的数据处理引擎紧密集成。 但是Pulsar中的分层存储本身在服务BI工作负载方面仍然存在性能差距,我们将在该提案中解决这些差距。
  • 存储与计算分离:这意味着存储和计算使用单独的集群,因此这些系统可以单独水平无限扩容。三个框均支持存储与计算分离。Pulsar使用了存储与计算分离的多层体系结构部署。
  • 开放性:使用开放和标准化的数据格式,如Parquet,并且它们提供了API,因此各种工具和引擎(包括机器学习和Python / R库)可以"直接"有效地访问数据,三个框架支持Parquet格式,Iceberg还支持ORC格式,对于ORC格式Hudi社区正在支持中。Pulsar还不支持任何开放格式,列存卸载支持Parquet格式。
  • 支持从非结构化数据到结构化数据的多种数据类型:Lakehouse可用于存储,优化,分析和访问许多新数据应用程序所需的数据类型,包括图像,视频,音频,半结构化数据和文本。尚不清楚Delta,Iceberg,Hudi如何支持这一点。Pulsar支持各种类型数据。
  • 支持各种工作负载:包括数据科学,机器学习以及SQL和分析。 可能需要多种工具来支持所有这些工作负载,但它们都依赖于同一数据存储库。三个框架与Spark紧密结合,Spark提供了广泛的工具选择。Pulsar也与Spark有着紧密结合。
  • 端到端流:实时报告是许多企业的常态,对流的支持消除了对专门用于服务实时数据应用程序的单独系统的需求,Delta Lake和Hudi通过变更日志提供了流功能。 但这不是真正的“流”。Pulsar是一个真正的流系统。

可以看到Pulsar满足构建Lakehouse的所有条件。然而现在的分层存储有很大的性能差距,例如:

  • Pulsar并不以开放和标准的格式存储数据,如Parquet;
  • Pulsar不会为卸载的数据部署任何索引机制;
  • Plusar不支持高效的Upserts;

这里旨在解决Pulsar存储层的性能问题,使Pulsar能作为Lakehouse。

3. 当前方案

图1展示了当前Pulsar流的存储布局。

  • Pulsar在ZooKeeper中存储了段(segment)元数据;
  • 最新的段存储在Apache BookKeeper中(更快地存储层)
  • 旧的段从Apache BookKeeper卸载到分层存储(便宜的存储层)。 卸载的段的元数据仍保留在Zookeeper中,引用的是分层存储中卸载的对象。

Apache Pulsar结合Hudi构建Lakehouse方案分析

当前的方案有一些缺点:

  • 它不使用任何开放式存储格式来存储卸载的数据。 这意味着很难与更广泛的生态系统整合。
  • 它将所有元数据信息保留在ZooKeeper中,这可能会限制可伸缩性。

4. 新的Lakehouse存储方案

新方案建议在分层存储中使用Lakehouse存储卸载的数据。该提案建议使用Apache Hudi作为Lakehouse存储,原因如下:

  • 云提供商在Apache Hudi上提供了很好的支持。
  • Apache Hudi已经作为顶级项目毕业。
  • Apache Hudi同时支持Spark和Flink多引擎。同时在中国有一个相当活跃的社区。

4.1 新的存储布局

图2展示了Pulsar topic新的布局。

  • 最新片段(未卸载片段)的元数据存储在ZooKeeper中。
  • 最新片段(未卸载片段)的数据存储在BookKeeper中。
  • 卸载段的元数据和数据直接存储在分层存储中。 因为它是仅追加流。 我们不必使用像Apache Hudi这样的Lakehouse存储库。 但是如果我们也将元数据存储在分层存储中,则使用Lakehouse存储库来确保ACID更有意义。

Apache Pulsar结合Hudi构建Lakehouse方案分析

4.2 支持高效Upserts

Pulsar不直接支持upsert。它通过主题(topic)压缩支持upsert。 但是当前的主题压缩方法既不可扩展,也不高效。

  • 主题压缩在代理内(broker)完成。 它无法支持大量数据的插入,特别是在数据集很大的情况下。
  • 主题压缩不支持将数据存储在分层存储中。

为了支持高效且可扩展的Upsert,该提案建议使用Apache Hudi将压缩后的数据存储在分层存储中。 图3展示了使用Apache Hudi支持主题压缩中的有效upserts的方法。

Apache Pulsar结合Hudi构建Lakehouse方案分析

该想法是实现主题压缩服务。主题压缩服务可以作为单独的服务(即Pulsar函数)运行以压缩主题。

  • 代理向压缩服务发出主题压缩请求。
  • 压缩服务接收压缩请求,并读取消息并将其向上插入到Hudi表中。
  • 完成upsert之后,将主题压缩游标前进到它压缩的最后一条消息。

主题压缩游标将引用位置的元数据存储在存储Hudi表的分层存储中。

4.3 将Hudi表当做Pulsar Topic

Hudi会在不同的即时时间维护对表执行的所有操作的时间轴,这有助于提供表的即时视图,同时还有效地支持按_arrival_顺序进行数据检索。Hudi支持从表中增量拉取变更。我们可以支持通过Hudi表备份的_ReadOnly_主题。这允许应用程序从Pulsar代理流式传输Hudi表的变更。图4展示了这个想法。

Apache Pulsar结合Hudi构建Lakehouse方案分析

4.4 可扩展的元数据管理

当我们开始将所有数据存储在分层存储中时,该提案建议不存储卸载或压缩数据的元数据,而只依赖分层存储来存储卸载或压缩数据的元数据。

该提案提议在以下目录布局中组织卸载和压缩的数据。

- <tenant>/
  - <namespace>/
    - <topics>/
      - segments/ <= Use Hudi to store the list of segments to guarantee ACID
        - segment_<segment-id>
        - ...
      - cursors/
        - <cursor A>/ <= Use Hudi to store the compacted table for cursor A.
        - <cursor B>/ <= ...

5. 引用

[1] Lakehouse: A New Generation of Open Platforms that Unify Data Warehousing and Advanced Analytics. http://cidrdb.org/cidr2021/papers/cidr2021_paper17.pdf

[2] What is a Lakehouse? https://databricks.com/blog/2020/01/30/what-is-a-data-lakehouse.html

[3] Diving Deep into the inner workings of the Lakehouse and Delta Lake. https://databricks.com/blog/2020/09/10/diving-deep-into-the-inner-workings-of-the-lakehouse-and-delta-lake.html

以上就是Apache Pulsar结合Hudi构建Lakehouse方案分析的详细内容,更多关于Apache Pulsar结合Hudi构建Lakehouse的资料请关注三水点靠木其它相关文章!

Servers 相关文章推荐
win10安装配置nginx的过程
Mar 31 Servers
Nginx配置https原理及实现过程详解
Mar 31 Servers
nginx限制并发连接请求数的方法
Apr 01 Servers
Nginx进程管理和重载原理详解
Apr 22 Servers
CentOS下安装Jenkins的完整步骤
Apr 07 Servers
Consul在linux环境的集群部署
Apr 08 Servers
Docker 镜像介绍以及commit相关操作
Apr 13 Servers
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 Servers
Win Server2016远程桌面如何允许多用户同时登录
Jun 10 Servers
openEuler 搭建java开发环境的详细过程
Jun 10 Servers
使用 DataAnt 监控 Apache APISIX的原理解析
Jul 07 Servers
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
Aug 14 Servers
Apache Hudi的多版本清理服务彻底讲解
Z-Order加速Hudi大规模数据集方案分析
Mar 31 #Servers
深入解析Apache Hudi内核文件标记机制
Apache Hudi数据布局黑科技降低一半查询时间
Apache Hudi集成Spark SQL操作hide表
Nginx工作模式及代理配置的使用细节
nginx常用配置conf的示例代码详解
Mar 21 #Servers
You might like
用PHP实现小型站点广告管理
2006/10/09 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
文本加密解密
2006/06/23 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
对比分析json及XML
2014/11/28 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现在控制台输入密码不显示的方法
2015/07/02 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
python判断正负数方式
2020/06/03 Python
Spy++的使用方法及下载教程
2021/01/29 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
学习雷锋寄语大全
2014/04/11 职场文书
参赛口号
2014/06/16 职场文书
2014年质检员工作总结
2014/11/18 职场文书
毕业生评语大全
2015/01/04 职场文书
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers