OPPO 数仓与数据湖融合架构升级的实践与思考

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
简介: 过去几年,数据仓库和数据湖方案在快速演进和弥补自身缺陷的同时,二者之间的边界也逐渐淡化。云原生的新一代数据架构不再遵循数据湖或数据仓库的单一经典架构,而是在一定程度上结合二者的优势重新构建。在云厂商和开源技术方案的共同推动之下,2021 年我们将会看到更多“湖仓一体”的实际落地案例。InfoQ 希望通过选题的方式对数据湖和数仓融合架构在不同企业的落地情况、实践过程、改进优化方案等内容进行呈现。本文,InfoQ 采访了 OPPO 云数架构部部长鲍永成,请他与我们分享 OPPO 引入数据湖和数仓融合架构的探索工作和实践中的一些思考。

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

当我们谈数据湖,谈的是什么?

InfoQ:数据湖和数仓融合架构是当下大数据领域非常重要的议题之一,不仅各大云厂商先后提出了自己的技术方案,开源社区也有一些项目(包括 DeltaLake、Iceberg 和 Hudi)非常活跃。其实数据湖这个概念诞生至今有挺长时间了,在您看来,目前业内对数据湖的定义和重要性是否已经达成一致?云厂商的产品和开源项目之间有什么差异吗?

鲍永成:回答这个问题之前,我们得明确仓与湖的主要区别。仓里的数据,有明确的表、字段定义,表与表之间的关系清晰。湖里的数据,样式就多了,有结构化、半结构化(JSON、XML 等)、非结构化(图片、视频、音乐)。 数据入仓,我们要预先定义好 schema。 数据入湖,则没有这样的要求,只需要将原始数据写入指定存储即可(通常是对象存储),当真正需要使用的时候,我们再设法定义 schema,进行分析应用。显然,数据入湖比入仓要方便快捷。

回到我们的话题,云厂商的数据湖产品,通常积极推广他们的低成本云存储(S3、OSS 等),吸引用户将数据上云。一旦数据上云,进而吸引用户使用他们多年完善的大数据体系产品(计算引擎、依赖调度、质量管理、血缘管理、数据治理等),为用户提供数据开发、分析、应用的附加服务。其次,很多企业出于数据安全的考虑,并不愿意将自己的数据上云,一套兼容各类存储的仓湖融合方案,是云厂商对市场的迎合。

开源的几个数据产品 Delta Lake、Apache Iceberg、Apache Hudi 更多可以理解为一种 TableFormat,这种 TableFormat 可以灵活定制 Schema,对对象存储友好,同时可以实时处理数据,支持 Update、Insert、Upsert 特性。企业应用好他们,可以助力自身构建批流一体、仓湖融合的大数据架构。

仓湖融合架构升级的三个阶段

InfoQ:OPPO 是什么时候决定要引入数据湖和数仓融合架构的?能否介绍下当时的整个背景情况?是希望解决什么样的问题或痛点?

鲍永成:OPPO 在 2020 年初引入数据湖的架构方案,这是建立在 OPPO 进军 IoT 领域的大背景下。随着公司不断推出 IoT 产品,IoT 设备产生的数据源源不断,设备的智能化服务需要我们对这些数据做更深层次的挖掘。海量的数据如何高效存储、高效利用是大数据部门必须要解决的问题。数据湖方案可以帮助我们快速收集保存数据,有效支持我们做数据分析、市场预测,以及智能服务的算法训练。

InfoQ:为什么选择引入 Apache Iceberg?你们前期做了哪些技术选型和评估工作?

鲍永成:引入 Iceberg 构建我们的数据湖方案,主要出于两点考虑。

  • 一.云数融合:OPPO 已经基于 K8S,构建了自己的云平台,主要数据存在对象存储 OCS 上。大数据依靠 Yarn 调度,HDFS 做存储,目前云与大数据正在逐步完成融合,做到调度融合,存储融合,统一运维,进而降低成本。
  • 二.是在与 Delta Lake、Hudi,Iceberg 对比中,虽然 Hudi 的实时特性最完备,但与 Spark 耦合太紧,Schema 的定义缺乏灵活性。Iceberg 对 Upsert、Insert、Delete 的支持没有 Hudi 完备,但社区在积极跟进。摆脱了具体计算引擎的束缚,Iceberg 专注于数据湖 TableFormat 标准的制定,这个标准正在慢慢被各家计算引擎所接受,未来会赢得更多的用户认可。

InfoQ:能否详细介绍一下 OPPO 整体的数据平台架构或数据处理流水线?在引入 Iceberg 前后,有哪些变化和演进?

鲍永成:下图是 OPPO 的大数据架构,我们目前主要在推进两项工作。

27cfc4c6e7efbbdfd175feef2d8a6748.png

1. 云数融合:OPPO 已经基于 K8s 构建了自己的云平台,主要数据存在对象存储 OCS 上。大数据平台依靠 Yarn 调度,HDFS 做存储,后续二者将统一调度与存储,统一运维,降低成本。云数融合的一期重点,会通过我们自研的 ADLS 支持数据湖存储。ADLS 的冷热分层,全局缓存特性在数据湖落地的过程中,可以有效降低存储成本,减轻存算分离后的性能影响.

5e69b1f51cf390cc4f0e2b61af534c8c.png

2. 流批一体、仓湖融合的架构升级

9fdbd0cd556eb5cef1a06f01af0c27d1.png

对于传统的 Lambda 架构,流与批是单独的两条数据处理链路,维护成本高,且容易出现数据不一致的情况。新的 Kappa 架构使用 Kafka 作为存储,简化了架构,但 Kafka 数据承载能力有限,且数据格式并不利于计算引擎分析。

我们在以下两个方面,对传统架构进行了改造。

1)针对公司原来的数据埋点链路,我们引入了 Iceberg,将实时数仓库的 Kafka 替换成 IcebergFormat,通过 Spark/Presto 引擎做数据查询,增加数据仓库的实时性。

6dc52e8c7913c83320e2ef39d6a1e3cb.png

2)公司原有的数据库入仓链路通过 Flinkx 完成数据同步, 无法支持 CDC。目前 Flink 已经原生支持 CDC 数据解析,binlog 通过 flink-cdc-connector 拉取可以自动转化成 INSERT、DELETE、UPDATE_BEFORE、UPDATE_AFTER 消息,结合 Iceberg 支持的 Update、Delete 特性,可以高效准确地将数据库同步到数仓,方便计算引擎进行分析。

27729b1e9af0b79c0cb111ebaf3d771a.png

OPPO 的一些数据,存储在 Oracle,SqlServer 等数据库中,Flink 对这些数据库的数据的拉取并没有提供支持。我们封装了 Obus-DB 的组件,来适配各类数据库,将数据同步到 Kafka 中,支持后续数据入湖的消费。

InfoQ:你们是如何将基于 Apache Iceberg 的数据湖方案,与 OPPO 已有的数据仓库融合的(分哪些阶段、关键工作等)?改造过程中存在哪些难点和挑战?你们是如何解决的?

鲍永成:仓湖融合可以分为 3 个阶段,目标是做到 3 个统一:统一数据、统一元数据、统一计算引擎。

1)统一数据

大数据 Lambda 架构分实时离线两条链路,两条链路可能造成数据不一致。Kappa 架构虽然统一了链路,但 kafka 的特征注定了这套架构对历史分析并不友好。引入 Iceberg 换掉 kafka,可以认为是 Kappa 架构的升级,简称 Kappa+,可以做到在一条链路上完成数据入仓,支撑流批数据分析。Iceberg Commit Snapshot 架构实时性不及 Kafka。目前我们采用 Iceberg 备份 Kafka 数据,同时缩短 Kafka 数据的存储时间,以满足用户的实时性需求,并为后续的 Iceberg 优化预留空间。

2)统一元数据

目前大数据的元数据基本都存储在 HiveMetaStore 中,Iceberg 构建表,需要融合其中。Flink 1.9 版本以前,是自己管理元数据,基于此,OPPO 的元数据也分离线和实时两套;Flink 1.11 版本后,对 HiveMetaStore 的集成已经比较成熟,我们正在将实时链路的元数据逐部迁移到 HiveMetaStore。

3)统一引擎

Iceberg 目前可以支撑 Flink、Spark、Presto 的查询,这虽然给了用户更多的选择,但同时也给用户带来了选择困难。在引擎层,可以做到一套引擎出口,根据数据特征通过 HBO 灵活选择执行引擎。这项工作目前正在规划中。

目前数据埋点入仓与数据库 CDC 入仓两条链路已经完成了数据湖架构改造,但 OPPO 每天入仓的数据量巨大,Iceberg 性能还需要优化。

没有完备的数据体系,空谈湖仓之争没意义

InfoQ:您认为现阶段 Iceberg 还存在哪些不足待改进?你们有没有什么踩坑经验可以分享?

鲍永成:Iceberg 目前虽然有基于文件的统计信息,方便做谓词下推的数据过滤,但还缺少细致的索引规范来加速文件检索。同时 Row-level delete 的性能也不够高效,还有优化空间。

InfoQ:接下来对于数据湖引擎和调度平台的建设,以及湖仓融合架构改造,你们还有哪些规划?

鲍永成:谈论数据湖和数据仓库,立足点应该建立提供更好的数据服务上。完备的数据体系,包括数据存储、多模态计算引擎、依赖调度、质量管理、血缘管理、任务诊断、数据集成、统一元数据、数据安全、数据服务等多方面内容,只有这些方面的能力完备,才能提供优质的数据服务,这是 OPPO 数据中心的核心工作。无论是数据湖,还是数据仓库的数据,只有运转在这套体系下,才能得到高效利用。在上述能力具备的条件下,解决好湖数据快速构建 schema、湖与仓的元数据统一问题,仓湖自然融合。上述能力不完备,空谈湖与仓之争,没有太多意义,孤岛问题不可避免,数据利用率低,使用成本高。

InfoQ:您怎么看数据湖和数仓融合架构未来的发展趋势?企业或业务团队该从哪些方面去评估自己是否需要引入湖仓融合架构?

鲍永成:仓湖融合的架构是个必然趋势。数据时代,人们产生和接触的数据越来越多样,数据服务的要求也越来越高。快速而又低成本的利用数据,数据湖有着较为明显的优势。如果企业与团队面临这样的挑战,可以引入仓湖融合的架构。但要做到仓湖融合,可以结合自身的情况,参考上一个问题的回答。

采访嘉宾介绍

鲍永成,OPPO 云数架构 &个人云负责人。曾服务于土豆网、思科、京东、头条等公司。长期负责云计算平台、大数据平台的研发与技术演进。带领团队先后在京东商城、OPPO 实施完成了全量业务上云战略。目前致力于打造 OPPO 开放的云与大数据能力,在跨场景、多终端的超大空间为用户提供智慧服务。

相关文章:

从自研到 Delta 到 Iceberg,网易严选数据湖建设实践
Flink 集成 Iceberg 在同程艺龙的实践

相关实践学习
数据库实验室挑战任务-初级任务
本场景介绍如何开通属于你的免费云数据库,在RDS-MySQL中完成对学生成绩的详情查询,执行指定类型SQL。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
2天前
|
监控 负载均衡 数据安全/隐私保护
探索微服务架构下的服务网格(Service Mesh)实践
【5月更文挑战第6天】 在现代软件工程的复杂多变的开发环境中,微服务架构已成为构建、部署和扩展应用的一种流行方式。随着微服务架构的普及,服务网格(Service Mesh)作为一种新兴技术范式,旨在提供一种透明且高效的方式来管理微服务间的通讯。本文将深入探讨服务网格的核心概念、它在微服务架构中的作用以及如何在实际项目中落地实施服务网格。通过剖析服务网格的关键组件及其与现有系统的协同工作方式,我们揭示了服务网格提高系统可观察性、安全性和可操作性的内在机制。此外,文章还将分享一些实践中的挑战和应对策略,为开发者和企业决策者提供实用的参考。
|
3天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
25 1
|
3天前
|
API 持续交付 开发者
构建高效微服务架构:策略与实践
【5月更文挑战第6天】随着现代软件系统的复杂性增加,微服务架构逐渐成为企业开发的首选模式。本文深入分析了构建高效微服务架构的关键策略,并提供了一套实践指南,帮助开发者在保证系统可伸缩性、灵活性和稳定性的前提下,优化后端服务的性能和可维护性。通过具体案例分析,本文将展示如何利用容器化、服务网格、API网关等技术手段,实现微服务的高可用和敏捷部署。
|
3天前
|
存储 前端开发 Java
Android应用开发中的MVP架构模式实践
【5月更文挑战第5天】随着移动应用开发的复杂性增加,传统的MVC(Model-View-Controller)架构在应对大型项目时显得笨重且不灵活。本文将探讨一种更适应现代Android应用开发的架构模式——MVP(Model-View-Presenter),并展示如何在Android项目中实现该模式以提升代码的可维护性和可测试性。通过对比分析MVP与传统MVC的差异,以及提供一个实际案例,读者将能深入了解MVP的优势和实施步骤。
|
4天前
|
缓存 NoSQL Java
构建高性能微服务架构:Java后端的实践之路
【5月更文挑战第5天】在当今快速迭代和高并发需求的软件开发领域,微服务架构因其灵活性、可扩展性而受到青睐。本文将深入探讨如何在Java后端环境中构建一个高性能的微服务系统,涵盖关键的设计原则、常用的框架选择以及性能优化技巧。我们将重点讨论如何通过合理的服务划分、高效的数据存储策略、智能的缓存机制以及有效的负载均衡技术来提升整体系统的响应速度和处理能力。
|
4天前
|
监控 持续交付 数据库
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第5天】 在当今快速发展的软件开发领域,微服务架构已成为构建可扩展、灵活且容错的系统的首选模式。本文将探讨如何通过一系列经过验证的策略和最佳实践来构建一个高效且可靠的微服务系统。我们将深入分析微服务设计的核心原则,包括服务的细粒度划分、通信机制、数据一致性以及容错处理,并讨论如何利用现代技术栈来实现这些目标。文章将提供一套综合指南,旨在帮助开发者和架构师在保证系统性能的同时,确保系统的稳健性。
23 4
|
4天前
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
20 0
|
8天前
|
消息中间件 监控 JavaScript
Node.js中的微服务架构:构建与实践
【4月更文挑战第30天】本文探讨了在Node.js中构建微服务的实践,包括定义服务边界、选择框架(如Express、Koa或NestJS)、设计RESTful API、实现服务间通信(HTTP、gRPC、消息队列)、错误处理、服务发现与负载均衡,以及监控和日志记录。微服务架构能提升应用的可伸缩性、灵活性和可维护性。
|
8天前
|
消息中间件 测试技术 API
构建高效微服务架构:从理论到实践
【4月更文挑战第30天】 随着现代软件开发的演进,微服务架构成为了企业追求敏捷、可扩展和容错性的关键解决方案。本文将深入探讨构建高效微服务架构的核心原则和策略,并通过一个实际案例来展示如何将这些理论应用于生产环境。我们将重点讨论服务的划分、通信机制、数据一致性以及持续集成与部署的实践,旨在为开发者提供一个清晰、可行的技术蓝图,以支持快速迭代和系统的稳健运行。
|
9天前
|
运维 监控 负载均衡
探索微服务架构下的服务网格(Service Mesh)实践之路
【4月更文挑战第30天】 在现代云计算的大背景下,微服务架构以其灵活性和可扩展性成为众多企业转型的首选。然而,随着服务的激增和网络交互的复杂化,传统的服务通信模式已无法满足需求,服务网格(Service Mesh)应运而生。本文通过分析服务网格的核心组件、运作机制以及在企业中的实际应用案例,探讨了服务网格在微服务架构中的关键作用及其带来的变革,同时提出了实施过程中面临的挑战和解决策略。
http://www.vxiaotou.com