OPPO案例 | Alluxio在DataAI湖仓一体的实践

news2024/11/20 13:40:16
分享嘉宾:
付庆午-OPPO数据架构组大数据架构师

在OPPO的实际应用中,我们将自研的Shuttle与Alluxio完美结合,使得整个Shuttle Service的性能得到显著提升,基本上实现了性能翻倍的效果。通过这一优化,我们成功降低了约一半的系统压力,同时吞吐量也直接翻倍。这样的结合不仅解决了性能问题,更为OPPO的服务体系注入了新的活力。

观看完整分享

完整文字版分享内容↓

分享主题:《Alluxio在Data&AI湖仓一体的实践》

Data&AI 一体数据湖仓架构

上图是OPPO目前的整体架构,主要分为两部分:

1、Data

2、AI

OPPO在数据领域主要专注于结构化数据,即通常使用SQL处理的数据。在AI领域,主要关注非结构化数据。为实现结构化和非结构化数据的统一管理,OPPO建立了一个名为Data and Catalog的系统,通过这种Catalog元数据的形式进行管理。同时,这也是一个数据湖服务,其中上层数据接入层采用Alluxio分布式缓存。

为什么我们选择使用Alluxio呢?

因为OPPO国内机房规模庞大,计算节点上的内存闲置量相当可观。我们估算平均每天约有1PB的内存处于闲置状态,并且希望通过这种分布式内存管理系统使其充分利用。橙色部分代表非结构化数据的管理,我们的目标是通过数据湖服务,使非结构化数据能够像结构化数据一样方便管理,并为AI训练提供加速。

DAA-Catalog

DAA-Catalog,即Data and AI Catalog,是我们团队在数据架构底层追求的目标,我们选择这个名字是因为OPPO致力于与业界最优秀的公司竞争。目前,我们认为在Data&AI领域,Databricks是最杰出的公司之一。无论是技术性、理念的先进性还是商业模式,Databricks都表现出色。

受到Databricks的Unicatalog启发,我们看到Databricks的Service数据和AI训练流程主要围绕Unity Catalog展开。因此,我们决定构建DAA-Catalog,以追求在数据湖仓库领域与业界最佳公司竞争的目标。

具体而言,这一功能分为两个主要模块:

Metastore(元数据存储):这一部分负责元数据的管理,底层基于Iceberg元数据管理。包括并发提交和生命周期管理。同时,我们使用Down Service进行管理,因为我们的数据首先会进入Alluxio的庞大内存缓存池,并实现每一条记录的实时插入和查询。

Management(管理):这一部分是DOM服务,为什么选择Down Service呢?因为数据进入后首先存储在Alluxio的内存中,实现了秒级的实时性。整个流程中,数据进来后会自动通过Catalog下沉到Iceberg,元数据基本上都在Alluxio中。

为什么我们要实现这样的秒级实时功能呢?

主要是因为我们之前使用Iceberg时发现一个严重问题,它基本上需要每5分钟做一次Commit,每次Commit都会生成大量小文件,对Flink计算系统和HDFS的元数据都造成了很大的压力。同时,还需要手动清理和合并这些文件。通过Alluxio服务,数据可以直接进入内存,Down Service也通过Catalog进行管理。整个流程中,数据进入后会自动下沉到Iceberg,元数据基本上都在Alluxio中。

由于OPPO与Alluxio有许多合作,我们在2.9版本的基础上做了一些调整,性能得到了大幅提升。在数据湖上实现了流式文件的读写,每一条数据都可以像一个commit一样,而不需要整个文件进行commit。

结构化数据的加速

随着大数据的发展,许多基础设施已经相当完善,解决了许多不同场景的问题。然而,我们的关注点是如何更有效地利用闲置资源和内存。因此,我们致力于从两个方面入手:一个是缓存加速,另一个是对热表和索引的优化。

我们提出了一个名为“Dynamic Cluster”的概念,它是一个动态聚合数据的功能,灵感来自于Databricks的一项技术。尽管内部也使用了Hallway曲线,但我们在其基础上实现了“the order”和“增量 the order”排序算法,将它们融合在一起形成了Dynamic Cluster。这一创新可以在数据录入后动态地聚合数据以提升查询效率。与Hallway曲线相比,“the order”算法的效率更高,但Hallway曲线在实时变动方面的表现更为优越。这种融合为我们提供了更灵活、高效的查询和聚合数据的方式。

非结构化数据管理

上图展示了我们在非结构化数据领域的一些工作,主要涉及到AI领域。在OPPO内部,AI训练一开始使用的工具相对较老旧,通常是通过脚本直接读取数据,或者将数据以裸的txt文件、裸的image文件形式存放在对象存储上。借助Transfer服务,我们能够将数据自动导入数据湖,并将打包好的图片数据切割成update set的格式。在AI领域,尤其是在处理图片领域,update set是一个高效的数据集接口,它不仅兼容web数据集接口,还可以转换成H5格式。

我们的目标是通过对元数据的处理将非结构化数据管理变得像结构化数据一样便捷。在数据转换的过程中,将非结构化数据的元数据写入Catalog中。同时,我们与大模型结合,将元数据的一些信息写入向量数据库,以便更轻松地使用大模型或自然语言查询湖仓中的数据。这一整合工作的目标是提高对非结构化数据的管理效率,使得其更加符合结构化数据的管理方式。

非结构化数据 - 元数据管理示例

上图是OPPO非结构化数据管理的一个实例,实现可以像SQL一样去搜索文本、图片的位置。

DataPrompter

选择构建DataPrompter的初衷源自对更好地运用大模型的追求。OPPO致力于将数据与大模型结合的领域,推出了一个名为Data Chart的产品,通过内部聊天软件,用户可以轻松查询所有数据。例如,用户可以方便地查询昨天手机的销量,或者比较与小米手机销量的差异,通过自然语言进行数据分析。

在产品构建过程中,每个领域的数据表需要专业的业务人员输入Prompter。这对整个数据湖仓或产品的推广带来了挑战,因为每一张表的Prompter都需要花费相当长的时间。例如,想要输入财务表数据,需要详细填写表的字段、业务域含义、展开维表等专业且技巧性的信息。

我们的最终目标是使得数据进入湖仓后,大模型能够轻松理解上层数据。在数据入湖的过程中,业务需展示一些规定的信息,并结合我们在Data Prompter方面积累的经验,利用HBO Service提供的一些常用查询,最终生成一个使大模型容易理解的Prompter范本。这样的结合旨在让模型更好地理解业务数据,使湖仓与大模型的结合更为顺畅。

Alluxio助力秒级实时入湖

Alluxio助力秒级实时入湖,主要分为:

1、Real-data

2、Base-data

3、Dump Service

4、文件流式读写

Alluxio在湖仓架构中的实践

Alluxio与Spark RSS结合

我们最初选择将Alluxio与Spark RSS服务结合,通过自研的Spark Shuttle Service并以Shuttle的名义开源。起初,我们的底层基于分布式文件系统,但随后在性能方面遇到了一些问题,于是我们找到了Alluxio。

Shuttle与Alluxio的完美结合使得整个Shuttle Service的性能得到了显著提升,基本上实现了性能翻倍的效果。通过这一优化,我们成功降低了约一半的系统压力,同时吞吐量也直接翻倍。这次的结合不仅解决了性能问题,更为我们的服务体系注入了新的活力。

在OPPO的后续研发中,基于Alluxio+Shuttle的框架实现了更多创新。我们将Shuttle算子和广播算子都优化到内存数据层面,通过高效的内存数据交互,特别是在处理单点Reduce时,当数据倾斜的情况下,原本耗时长达50分钟的排序操作,迁移到新方案后,成功将处理时间降低到了10分钟以内。这一优化不仅大大提高了处理效率,也有效缓解了数据倾斜对系统性能的影响。

广播成果非常显著,特别是在Spark中,默认广播大小为10M,因为所有的广播数据都必须在Java端存放,在经过Java序列化后容易发生膨胀,进而引发OOM(Out of Memory)问题,这在线上环境中经常发生。

为了解决这个问题,我们目前将广播数据存放到Alluxio中。这样一来,几乎可以广播任意大小的数据,最大可达10个G。这一创新在OPPO线上已经有多个案例成功实施,对提升效率产生了显著的影响。

Alluxio在公有云/混合云上的应用实践

在OPPO的公有云大数据体系中,特别是在新加坡地区,我们主要采用AWS作为基础架构。在早期阶段,我们使用了AWS提供的弹性计算服务(EMR)。然而,近年来,行业整体经济形势不太乐观,许多企业都在追求降低成本和提高效率。面对这一趋势,我们在海外公有云领域提出了自研的解决方案,利用云上的弹性资源搭建一套新的架构。这一创新方案的核心是依赖于Alluxio+Shuttle的组合,为我们的大数据体系提供了关键的支持。

Alluxio+Shuttle解决方案的显著优势在于,Alluxio集群并非被Shuttle独占,它可以为其他服务提供支持,包括数据缓存和元数据缓存。在公有云中,我们深知S3上的List操作在提交时非常耗时,通过结合Alluxio和开源的Magic commit、 Shuttle的方案,我们取得了显著的降本效果,大约降低了计算成本的80%。

在混合云环境中,我们为AI团队提供服务。由于数据湖底层有对象存储,我们在训练过程中利用了阿里云上的GPU卡,同时也结合了自建的GPU资源。由于专线带宽有限且成本较高,数据拷贝时需要一个有效的缓存层。最初,我们采用了存储团队提供的解决方案,但其扩展性和性能并不理想。引入Alluxio后,我们在多个场景中实现了数倍的IO加速,为数据处理提供了更高效的支持。

展望

OPPO的集群规模在国内已经达到上万台,形成了相当庞大的规模。我们计划在未来深入挖掘内存资源,以更充分地利用内部的存储空间。团队内部同时拥有实时计算框架Flink和离线处理框架Spark,这两者可以相互借鉴Alluxio的应用经验,实现Alluxio与数据湖的深度融合开发。

在大数据和机器学习结合的浪潮中,我们紧跟行业趋势。将数据架构从底层与人工智能(AI)深度结合,为AI提供优质的服务作为首要任务。这一融合不仅是技术上的进步,更是对未来发展的战略规划。

最后,我们将进一步挖掘Alluxio的优势,助力我们在公有云环境中降低成本。这不仅涉及技术上的优化,也包括对云计算资源的更有效管理,为公司的可持续发展提供坚实支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1539715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云2核4G服务器优惠价格30元、165元和199元1年,轻量和ECS

阿里云2核4G服务器租用优惠价格,轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图: 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

Flutter学习10 - Json解析与Model使用

对于网络请求返回的 Json 数据&#xff0c;一般会进行如下解析&#xff1a; 将 Json String 解析为 Map<String, dynamic>将 Json String 解析为 Dart Model 发起一个返回 Json String 的网络请求 import package:http/http.dart as http;void main() {_doGet(); }_do…

mysql无法看到3306端口监听

参考:https://blog.csdn.net/shumeigang/article/details/103902459 mysql> show global variables like ‘port’; 是0 原因是我的my.cnf有话&#xff1a; skip-network 或 注释掉&#xff0c;然后重新启动下数据库&#xff0c;运行netstat -an|grep 3306 就可以看到了

基于springboot+vue的教学改革项目管理系统(源码+论文)

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

PHP+MySQL开发组合:智慧同城便民信息小程序源码系统 带完整的安装代码包以及安装部署教程

当前&#xff0c;城市生活的节奏日益加快&#xff0c;人们对各类便民信息的需求也愈发迫切。无论是寻找家政服务、二手交易&#xff0c;还是发布租房、求职信息&#xff0c;一个高效、便捷的信息平台显得尤为重要。传统的信息发布方式往往存在信息更新不及时、查找困难等问题&a…

在存在代理的主机上,为docker容器配置代理

1、配置Firefox的代理 (只配置域名或者ip&#xff0c;前面不加http://) 2、为容器中的Git配置代理 git config --global http.proxy http://qingteng:8080 3、Git下载时忽略证书校验 env GIT_SSL_NO_VERIFYtrue git clone https://github.com/nginx/nginx.git 4、docker的…

【问题记录】自定义Prometheus exporter收集数据,Prometheus显示收集到数据,grafana未显示数据出来

问题背景&#xff1a; 使用golang编写Prometheus exporter&#xff0c;获取指定API Url返回值中的data值&#xff0c;把它做为自定义指标。 1、exporter 500ms自动更新一次data值 2、Prometheus的Graph界面输入自定义指标可以查询到值的变化 3、自定义指标最小时间是ms级别&…

【C语言进阶篇】动态内存管理

【C语言进阶篇】动态内存管理 &#x1f308;个人主页&#xff1a;开敲 &#x1f525;所属专栏&#xff1a;C语言 &#x1f33c;文章目录&#x1f33c; 1. 为什么要有动态内存分配 2.动态内存开辟和释放函数 2.1 动态内存释放函数 2.1.1 free函数 2.2 动态内存开辟函数 2.2.1 …

prettier + eslint 配置

vue-cli 新建项目选择 ESLint Prettier 会自动下载相关包 settings.json {"editor.formatOnSave": true, // 开启保存文件自动格式化代码"editor.defaultFormatter": "esbenp.prettier-vscode", // 默认的代码格式化工具// "prettier.r…

二.寄存器

1. 2. 例如&#xff1a;h即为high&#xff08;高位&#xff09;&#xff0c;l即为low&#xff08;低位&#xff09; 3.一个字是两个字节 4.在写一条汇编指令或一个寄存器的名称时不区分大小写。 5.al&#xff0c;ah&#xff0c;ax在接受汇编指令时&#xff0c;并不相等&…

混合云构建-使用 Azure ExpressRoute 建立从本地到 Azure 虚拟网络的专用连接

如果有大量业务数据需要在本地数据中心和azure私有网络进行传输&#xff0c;同时保证带宽和时延的情况需要使用 ExpressRoute 设置从本地网络到 Azure 中的虚拟网络的专用连接。以下是实操步骤供参考&#xff1a; 一、创建和预配 ExpressRoute 线路 登录 Azure 门户。 在页面…

React系列 之 React进阶 含源码解读 (一)事件合成、state原理

资料来源&#xff1a;掘金课程 https://juejin.cn/book/6945998773818490884?enter_fromcourse_center&utm_sourcecourse_center 记录一些笔记 事件合成 React的事件其实是React重新实现的一套事件系统。目标是统一管理事件&#xff0c;提供一种跨浏览器一致性的事件处…

3、Jenkins持续集成-Jenkins安装和插件管理

文章目录 一、Jenkins安装1. 安装JDK2. 获取jenkins安装包3. 安装包上传到服务器&#xff0c;进行安装4. 修改Jenkins配置&#xff08;1&#xff09;低版本Jenkins的rpm包&#xff08;2&#xff09;高版本Jenkins的rpm包 5. 启动Jenkins6. 打开浏览器访问7. 获取并输入admin账户…

Linux文件 profile、bashrc、bash_profile区别

Linux系统中&#xff0c;有三种文件 出现的非常频繁&#xff0c;那就是 profile、bash_profile、bashrc 文件。 1、profile 作用 profile&#xff0c;路径&#xff1a;/etc/profile&#xff0c;用于设置系统级的环境变量和启动程序&#xff0c;在这个文件下配置会对所有用户…

pytest运行结果解析及其改造

简介&#xff1a;场景假设 - 当运行pytest完成后&#xff0c;需要针对运行的结果进行即时的反馈&#xff0c;打印 PASS 或者 FAIL&#xff0c;及其运行失败的原因&#xff0c;最后将结果推送给消息机器人。 历史攻略&#xff1a; pytestallure安装和使用 pytest&#xff1a;…

AcWing 1250. 格子游戏 (并查集,坐标变换)

记录此题的目的&#xff1a; 明确二维的坐标可以映射到一维&#xff1a;在x和y都是从0开始的前提下&#xff0c;假如图形列数为n&#xff0c;(x,y)映射到一维可以写成x * n y。并查集并不好存储二维数据&#xff0c;如果遇到二维数据可以将其映射到一维。 Alice和Bob玩了一个…

git 上传文件夹至远端仓库的方法

上传的远端git可以是gitlab、github、gitee、gitblit或者gitCode等等 以下以GitHub为例说明&#xff1a; 1、登录GitHub网站&#xff08;账户/密码&#xff09; 2、创建一个新的空白项目&#xff08;或者已有的项目&#xff09;hello-world 分支是master &#xff0c;这里默认即…

el-tab 如何点击不同标签触发不同函数

介绍 el-tab本身的功能是点击之后切换不同页&#xff0c;但是我希望点击不同标签就触发不同页 代码实现 <template><el-tabsv-model"activeName"type"card"class"demo-tabs"tab-click"handleClick"><el-tab-pane lab…

PTA L2-028 秀恩爱分得快

古人云&#xff1a;秀恩爱&#xff0c;分得快。 互联网上每天都有大量人发布大量照片&#xff0c;我们通过分析这些照片&#xff0c;可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人&#xff0c;这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张…

dash 初体验(拔草)

Dash简介 Dash 是一个高效简洁的 Python 框架&#xff0c;建立在 Flask、Poltly.js 以及 React.js 的基础上&#xff0c;设计之初是为了帮助前端知识匮乏的数据分析人员&#xff0c;以纯 Python 编程的方式快速开发出交互式的数据可视化 web 应用。 搭建环境 在学习 Dash 的…