技术干货| 阿里云基于Hudi构建Lakehouse实践探索「内附干货PPT下载渠道」
简介: 阿里云高级技术专家王烨(萌豆)在Apache Hudi 与 Apache Pulsar 联合 Meetup 杭州站上的演讲整理稿件,本议题介绍了阿里云如何使用 Hudi 和 OSS 对象存储构建 Lakehouse,为大家分享了什么是 Lakehouse,阿里云数据库 OLAP 团队如何构建 Lakehouse,也介绍了在构建 Lakehouse 时遇到的问题和挑战,以及如何解决这些问题和挑战。
本文PPT下载链接:
王烨(萌豆)-阿里云高级技术专家 -《阿里云基于Hudi构建Lakehouse实践》.pdf
一、数据湖与Lakehouse
2021年开发者大会上,我们的一位研究员分享的一个议题,提到了很多数据,主要想阐述的是行业发展到现在这个阶段,数据的膨胀非常厉害,数据增速非常可怕。无论是数据规模还是生产处理的实时化,到生产处理的智能化,以及数据加速上云的云化过程。
这些数据来自Gartner、IDC的分析,都是行业最权威的分析报告里沉淀总结出来的。这就意味着我们在数据领域尤其是分析领域的机遇和挑战都很大。
基于Lakehouse的新概念,想做到的是屏蔽格式上的各种差异,为不同的应用提供统一的接口以及更加简化的数据访问、数据分析能力。架构说实现数据仓、数据湖、Lakehouse一步步演进。
他的两篇论文阐述了很多新概念:第一,怎么设计和实现MVCC,能让离线数仓也有像数据库一样的MVCC能力,从而满足大部分对批事务的需求;第二,提供不同的存储模式,能够适应不同的读和写Workload;第三,提供一些近实时的写入和合并能力,为数据量提供链路能力。总之,他的思路能够较好解决离线数据分析的难题。
对我们来说,当时选择Hudi也是因为其产品成熟度方面的原因,还有它面向数据库方面的数据入湖能力,形态上比较满足我们在数据库团队做CDC方面的业务需求。
Hudi早期的定义是Hadoop Updates anD Incrementals的缩写,后面是面向Hadoop的Update、Delete、Insert的概念,核心逻辑是事务版本化、状态机控制和异步化执行,模拟整个MVCC的逻辑,提供对于内部列存文件比如Parquet、ORC等对象列表的增量式管理,实现高效的存储读写。它和Databricks定义的Lakehouse概念很相似,不谋而合,Iceberg也是一样,它的能力也在逐步往这个方向提升。
Hudi官方网站对外提供的架构是这样的形态。之前我们做技术选型、调研的时候发现很多同行也已经充分使用Hudi做数据入湖和离线数据管理的方案选型。第一,因为产品比较成熟;第二,它符合我们CDC的需求;第三,Delta Lake有一套开源版本,一套内部优化版本,对外只提供开源版本,我们认为它不一定把最好的东西呈现。Iceberg起步比较晚,早期相比其他两个产品能力不太完全,所以没有考虑它。因为我们都是Java团队,也有自己的Spark产品,Hudi正好比较契合我们用自己的runtime支持数据入湖的能力,因此也就选择了Hudi。
当然我们也一直在关注这三个产品的发展,后来国内的一个开源项目StarLake,也是做类似的事情。每种产品都在进步,长期来看能力基本对齐,我觉得会和论文里定义的能力慢慢吻合。
二、阿里云Lakehouse实践
下面介绍一下阿里云Lakehouse的技术探索和具体的实践。首先,大概介绍一下阿里云数据库团队近年来一直提的概念“数据库、仓、湖一体化”战略。
四个存储方向有各自的领域,同时又有关联分析诉求,主要就是要打破数据孤岛,让数据一体化,才能让价值更立体化。如果只是做一些日志分析,例如关联的地域、客户来源的话,也只是使用了GroupBy或者是Count等相对简单的分析能力。对于底层数据,可能要做多次清洗、回流,才能往向在线化、高并发的场景一层层分析。这里不仅仅直接将数据从湖到库写入,也可以到仓,到NoSQL/NewSQL的产品里,到KV系统里去,利用好在线化的查询能力,等等。
反过来也是一样,这些数据库/NewSQL产品甚至数仓中的数据也会向下流动,构建低成本、大容量的存储备份、归档,降低上面的存储压力、分析吞吐压力,且可以形成强大的联合分析能力。这也是我自己对数据库、仓、湖一体化的理解。
刚才讲了数据库的发展方向和定位,再看看数据库下面OLAP本身的分层数仓体系中Lakehouse是怎样的定位。做过数仓产品的同学都比我熟悉,(PPT图示)基本上是这样的分层体系,最开始各种各样的形态非数仓或者非数据湖系统外面有各种各样的形式存储数据,我们理解通过Lakehouse的能力,做入湖、建仓,通过清洗、沉淀和聚合,形成ODS或者是CDM层,这里做了初步的数据聚合和汇总能力,形成数据集市的概念。
整个过程中,我们会接入统一的元信息体系。因为如果系统的每个部分都有自己的术语,都要保留一份自己的元信息,对OLAP体系来讲是分裂的,因此元信息一定要统一,调度也是一样。不同数据仓层次的表在不同的地方要串联起来,一定要有完整、统一的调度能力。以上是我理解Lakehouse在OLAP体系中的的定位,主要是贴源层,汇聚离线数据的能力。
前面介绍了Lakehouse在数据库和OLAP团队里的定位,后面重点介绍一下Lakehouse在我们的领域设计是怎样的形态。因为之前我自己用过K8s做分析系统上云,所以对K8s的很多理念还是比较清楚。
我们认为Lakehouse也是一种范式,一种处理离线数据的范式。在这里,数据集是我们的核心概念,比如要构建一套面向某种场景、某个方向的数据集。我们能要定义A、B、C不同数据集,在我们看来这是一个实例。围绕这个数据集编排各种各样的Workload工作负载,比如做DB入湖。还有分析优化类的Workload,比如索引构建,比如像z-ordering、Clustering、Compaction等技术,查询优化能力提升得更好。还有就是Management类型的Workload,比如定期把历史数据清理了,做冷热存储分层,因为OSS提供了很多这样的能力,把这些能力用好。最下面一层是各种Job,我们内部是基于Spark建设离线计算能力,我们把Workload前后编排成小的job,原子的job全部弹性到Spark上执行,以上是我们对于Lakehouse在技术实践中的领域设计。
其实Serverless Spark是我们的计算基础,提供作业级弹性,因为Spark本身也支持Spark Streaming,通过短时间弹出一个Spark作业实现流计算。选择OSS和LindormDFS做存储基础,主要利用低成本、无限容量的好处。
用过阿里云OSS的同学都知道,OSS本身是阿里云VPC网络里的公网,它是共享区,不需要复杂的网络。而RDS和Kafka是部署在用户的VPC里,通过一套网络架构就可以实现多种网络打通。对比VPC网段冲突,共享区域没有这样的问题。其次,数据之间隔离,ENI有端到端的限制,比如VPC有ID标志、有不同的授权要求,非法用户尝试连接VPC,如果不是这个网卡则网络包无法联通,就可以实现安全的隔离和数据的通路。
在这里,为什么我们要把一个Workload面向用户侧的任务拆成N个不同的job?因为这些任务完全放在一个进程里跑,整个Workload的水位变化非常大,做弹性调度非常难。全量任务跑一次就可以了,但是配多少资源合适呢?很多时候Spark没有那么灵活,尤其是异步任务和定时任务拉起来消耗很大,但是用完之后又不知道下一次什么时候来,很难预测。就像很多信号系统处理里,需要做傅里叶变换一样,把复杂的波型拆成多个简单的波型,信号处理就简单起来。我们也是有这样感性的理解。用不同的Job来执行Workload中不同角色的任务,就很容易实现弹性能力。像定时或临时性的触发Job,临时拉一个job,资源消耗与常驻的流式任务完全无关,就可以完全不影响流式任务的稳定性、入湖延迟等等。这是设计背后的思考,就是让复杂的问题简单化。因为基于弹性的角度来讲,拆得波形越简单,弹性就会更好做,预测也会简单一点。
入湖里会涉及很多用户的账密信息,因为不是所有云产品都以AWS的IAM或阿里云的RAM等系统来构建完全云化的资源权限控制。很多产品还是以账密方式做认证和授权管理,包括用户自建的系统,数据库系统等等。这样,用户要把所有的连接账密都交给我们,怎么更安全的管理它们?我们是基于阿里云的两套体系:一套是KMS,以硬件级数据加密体系来加密用户数据;第二套是STS,完全云化的三方鉴权能力,实现用户数据的安全访问,尤其是敏感数据的隔离或者保护的机制,这就是我们现在的整个体系。
另一方面基于OSS的Bucket Policy能力,构建不同程序的权限校验能力。只允许Lakehouse的的任务有权限写数据,而其他程序不允许写,但其他程序可以读。同一个账号的这些数据本来就是为了共享、为了分析,为了各种应用场景的接入,就是可以读,但绝对不可以污染它。我们在这些方面做了可靠性工作。
在存储里通过元信息、分区等数据维护,并对接后续计算和分析,就无缝看到湖、仓里所有存的数据的元信息,无缝对接不同形态的应用场景。
在整个Watremark维护上需要考虑很多,如果全量挂了,再重试一下,位点应该从哪里开始,如果增量挂了,不仅要考虑增量之前已经进行到哪里,还要渐进式的维护增量位点,不能每次增量一挂就回退到最开始全量前的位点,那后面数据延迟太严重了。在Lakehouse表级别维护这些信息,在Workload运行时、重启、重试等过程可以自动衔接,对用户透明。
我们内部有基于Lindorm的方案。Lindorm是我们自研兼容HBase、Cassandra等大宽表接口的KV行存。它有很多的历史文件和很多Log数据,通过内部的LTS服务调,把全量和增量数据通过Lakehouse方式存在转换成列存文件,支持分析。
对Kafka、SLS系统中都有分片(Partition、Shard)概念,流量变化很大时需要自动扩缩容,因此消费侧要主动感知变化,不影响数据正确性的持续消费。并且这种数据都是偏Append-Only,正好可以利用好Hudi小文件合并能力,让下游分析更简单、更快、更高效。
三、客户最佳实践
以上是技术探索的分享,接下来会介绍一下在客户的应用。之前一个跨境电商的客户,他们问题就是DB数据不容易分析,目前有PolarDB和MongoDB系统,希望把所有数据近实时入湖到OSS上做分析。现在业界联邦分析FederatedAnalytics,问题在于直连查询数据时原库的压力很大,最好的方式就是入湖到离线湖中里做分析。通过Lakehouse方式构建离线湖仓,再对接计算和分析,或者对接ETL清晰,规避对线上数据的影响,同一架构把整体数据平台构建起来,应用、分析百花齐放,不影响任何东西。
另一个客户数是Kafka日志近实时分析。原来他们的方案需要人肉做很多步骤,包括入湖、数据管理、小文件合并等。通过Lakehouse方案,对接客户数据,自动合并入湖,维护元信息,客户直接应用就可以了,内部直接打通了。
还有一个问题小文件,在他们的场景里与Hudi社区一起参与Clustering技术的建设。Clustering就是自动将小文件合并成大文件,因为大文件利于分析。其次,在合并过程中,可以按照某些特定列把数据排序,后续访问这些数据列时,性能会好很多。
四、未来展望
最后,我再分享一下我们团队对未来的思考,Lakehouse可以怎么应用起来。
之前接触过一个客户,他需要存储三十年的数据,他们的业务是股票分析,要把交易所、券商的所有数据全部爬下来,传到大的湖仓里。因为要做三十年的分析,成本优化是非常关键的。原来选择在线系统,存几个月就扛不住了,因为数据量太大了。分析数据是有从冷到热、从相对低频到高频访问的特点,Lakehouse利用这些特点,通过定义规则和逻辑,自动屏蔽用户对哪些目录需要冷存储、哪些目录需要热存储的复杂维护,帮用户走得更进一步。
在Hudi中如果是Merge On Read类型的表,比如Delete、Update都会快速写到log文件,在后续读的时候Merge数据,形成完整的逻辑的数据视图。这里问题也很明显,如果有1000个log文件,每次读需要合并1000次,分析能力退化肯定非常严重。这时Hudi的Compaction能力就会定期把log文件合并起来。前面提到,如果完全要在同一个入湖作业里实现,尤其是文件合并,计算开销很大,在做这些重负载的时候,对入湖链路的延迟影响很大,一定要通过异步化调度的方式,实现写延迟保障。并且这些过程都是可弹性的,不论是100个文件要合还是1万个文件要合,都是可以快速弹性而不影响延迟,非常有优势。
原来都是近实时入湖场景,但是可能有些用户没有这么多实时性要求,周期性的T+1逻辑建仓可以满足,可以利用Hudi+Lakehouse能力,每天查询一部分逻辑增量数据并写入Hudi,并维护分区,和实现Schema Evolution能力。
早期数据量越来越大,客户通过分库分表实现逻辑拆分。分析的时候发现库、表太多了,分析、关联难度大,这时候可以通过构建多库多表合并建仓能力,汇总到一张表后做分析。
然后是跨区域融合分析,有很多客户提这样的需求,尤其是海外。有些客户要服务海外用户,必须有部分业务在海外,特别在跨境电商的场景,而它的采购体系、仓储体系、物流体系、分销体系等又都在国内建设,很多数据想要融合分析怎么办?首先OSS提供了跨域复制,但也只是到数据层面,没有任何逻辑,在这里可以通过Lakehouse做逻辑层建设,把不同region数据混合在一起,汇总到同一个区域之后,提供统一的SQL join、union等能力。
最后Hudi有TimeTravel、Incremental query的能力,这时候构建incremental ETL清洗不同的表,在一定程度上通用化,让用户用得更简单。未来内置更多场景化能力,让用户构建和应用湖仓更加简单!
原文链接
本文为阿里云原创内容,未经允许不得转载。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-09-09 Flink 源码 | 自定义 Format 消费 Maxwell CDC 数据