大模型、实时需求推动湖仓平台走向开放

news/2024/4/19 17:08:37/

大模型、实时需求高涨

AGI 时代,以 ChatGPT、Midjourney 等为代表的大模型迅速应用加速了 AI 普及,越来越多的企业选择搭建自己的 AI 基础设施,训练行业大模型。

另一方面,企业为了在瞬息万变的市场环境中更快的做出商业决策,正在将数据平台从离线转向实时数据平台。“双十一 ”和春晚直播实时大屏、银行和证券交易行为实时监控、电商和短视频的实时个性化推荐等只是全行业在线化的冰山一角。


AI + 实时,俨然成为了企业数据平台无法避免的技术焦点。那么,如何让企业数据平台拥抱AI+实时的双重能力?
为什么难实现?

对于现阶段的大数据平台和传统数据仓库等企业数据平台,姑且不论同时整合 AI + 实时,单独的 AI 平台或者实时数据平台都不得不通过复杂架构,耗费大量资源和人力来实现。我们不妨先来分别看看现在的 AI 和实时架构是如何实现的。

AI 与数据平台

机器学习和人工智能的模型训练采用结构化数据和非结构化数据。结构化数据价值非常高,数据质量也非常好,因此有些 AI 问题主要基于结构化的数据建模。一个很典型的例子就是银行基于结构化数据,面向个人客户开发的信用评分卡,既有可解释性,又能满足实时的信用评估。

那么,传统数仓的大量结构化数据该如何被用于训练 AI 模型呢?常见的方式是,当机器学习平台需要访问数据集时,需要先通过 JDBC 或者外部表的形式把数据从数据仓库导出到分布式存储中,然后再并行处理这些数据,用以进行模型训练和分析。在大规模数据处理场景中,这种不断导出数据的方式显然是不现实的,因为导出 TB 或者 PB 级别的数据通常得花好几个小时甚至几天的时间,既费力又费时。

在过去几年中,在业界产生广泛影响力的机器学习和 AI 模型几乎都是从非结构化数据中获取的。尽管在传统数据仓库中,可以将非结构化数据视为简单的文本或二进制类型 (TEXT、VARCHAR、BLOB),然而通过这种方式训练AI模型效率低下,同样需要从数据仓库中导出数据后再做建模。

因此,企业逐渐选择数据湖这种更加开放的形态来训练 AI 模型。结构化数据和非结构化数据(文本和图像等)直接进入数据湖,以数据湖开放的存储格式存储,如 ORC 和 Parquet,使用开源工具去直接操作数据。传统数据湖平台通常由 Hadoop 实现,因为 Hadoop 的局限性,比如缺乏事务支持,缺乏很好的数据治理方法等等,数据湖都难免形成数据沼泽。

实时数据平台

传统数据平台不仅在 AI 模型的支持上出现了诸多问题,在实时数据处理方面也面临着极大挑战。

传统数据平台的数据处理流程一般是这样的。首先,从业务系统 CRM、ERP 或者其他数据源把这些业务数据收集过来,然后经过离线数据 ETL 对数据进行数据清洗、数据加工。在这个过程中会涉及数据建模和分层,最终会把加工后的数据提供给 BI 工具,或者写到数据库并推到一个在线服务系统,供用户进行访问,这些用户包括用户、运营人员或管理团队等等。

我们可以发现,即便在没有做实时数据处理的情况下,这样的数据处理链路就已经很冗长了。然而,当我们不解决既有离线问题的情况下就向实时转型,问题将更加复杂。

实时数据是如何处理的?

目前主要采用传统 Lambda 和 Kappa 架构。以 Lambda 架构的实现方法为例,Lambda 以传统的离线数仓为主,然后引入了实时数据的处理链路。T+1 数据仍然是走传统离线数仓链路,然后再加上一个实时的数据链路,再把这些实时数据和离线数据汇总到一起,然后再通过一个服务层提供数据服务,对外提供的服务可能是点查询,也可能是做复杂分析。

离线链路用 Hive/Spark,实时用 Flink。但在实际的落地中,如果需要引入实时查询,可能要再加上 ClickHouse/Drill/Presto;如果需要做数据的离线归档,还需要 Hive;为了满足一些高并发点查询需求,还要再引入了 HBase 和 MySQL。引入这么多产品组件,本质原因还是缺少一个在并发、性能和开放性兼顾的产品。

因此 Lambda 架构并没有从源头上解决传统离线数仓的问题,而是在传统离线数仓上加了一条链路,让整个系统变得更加复杂。数据可能会存两份或者存多份,实时链路和离线链路数据也不统一。除此之外,整个架构维护起来是非常复杂的,学习和开发成本比较高。


如何破局?

为了实现用更丰富的数据源训练 AI 模型,我们以极高的代价将数仓的数据导出后再并行处理;为了实现实时数据处理,我们不惜选择冗长的数据处理链路,造成多份数据和多个计算引擎烟囱林立。这些痛点都将我们引向对一个问题的思考:我们能不能只用一份数据,精简计算引擎?

答案是可以的

当下,存储和计算的数据无非是结构化、非结构化和流式数据。破局的第一步,就是在数据的存储方面采用开放格式的一份数据,如 Parquet、ORC、Hudi 等。各个计算引擎都使用开放的数据格式(如 ORC 或 Parquet 等),数据以开放文件格式被写入数据平台,之后就能被多个引擎多次直接读取和使用。

有了存储的开放性,在计算引擎方面,我们就可以尽量优化和减少计算引擎的数量,并针对结构化数据、非结构化数据和流式数据,选用各具优势的计算引擎:● 针对流数据的计算,采用常见的 Flink;● 针对非结构化数据机器学习,可以采用 Spark;● 针对结构化数据,需要兼容开放数据格式,兼顾实时查询、离线分析、高并发和高可用的分析引擎,比如偶数的 OushuDB。

至此,开放格式,一份数据,多个引擎的架构初步形成,这样的“一数多擎”架构形成了可以破局当前企业数据困境的方案——实时湖仓(Realtime Lakehouse)。

“一数多擎”是我们在多个行业的湖仓一体项目落地中不断迭代的最佳实践。企业在选择多个引擎时一定需要基于“化繁为简”和“扬长避短”原则,比如 OushuDB 可以完全实现Hive、Presto、ClickHouse、HBase 等引擎的功能,引入 OushuDB 后就不需要再依赖这些引擎,这样可以极大简化系统开发和运维的复杂度。Flink 擅长流处理,就使用 Flink 做流处理,而不是使用 Flink 来做 SQL 查询,Spark 擅长做机器学习,就使用 Spark 做机器学习,而不是使用 Spark 来做流处理和 SQL 查询。Hive 查询慢,就不必再保留 Hive,可以使用 OushuDB 取代。


开放的“一数多擎”
带来哪些价值?

●首先就是开放本身的价值,开放直接解决了当前数据平台在AI模型训练和实时数据处理过程中多份数据造成的数据冗余和数据不一致。同时,开放的格式让湖仓一体很容易获得最优的 SQL 引擎、ETL、流处理引擎和机器学习引擎的支持。●其次,一份数据整合了非结构化数据和结构化数据存储,图像、文本可以直接用于 AI 模型训练,结构化数据也无需被多次读取、复制和导出。●再次,“一数多擎”必然要求彻底的存算分离架构,让企业湖仓平台不受集群规模的限制,动态扩展集群规模。

● 另外,由于过往实时、离线数据处理链路极其冗长和复杂,造成数据建模、元数据管理、数据治理都难以高效的实施,“一数多擎”精简了不必要的引擎组件,整个架构变得简洁,既为数据建模、数据治理提供了平台基础,又让学习、开发和维护成本都大幅下降。


总结

IDC 调研显示,企业在数字化商业过程中更加关心利用数据和信息来创造自身竞争优势,因此实现底层统一的数据管理是进行上层资产管理和业务决策分析的关键。

以往,由于技术水平的制约和方案的局限性,我们难以实现底层统一的数据管理。因此,为了能用更丰富的数据源训练AI模型,我们以极高的代价将数仓的数据导出;为了实现实时数据处理,我们不惜选择冗长的数据处理链路,造成多份数据和多个计算引擎烟囱林立。

于是才有了我们现在讨论的问题及对应总结出的方案:基于开放的数据格式,存储一份数据,避免数据冗余,有针对性的精选优势引擎组件,通过具备“一数多擎”架构的实时湖仓方案,我们可以同时解决 AI 和实时数据处理在过去所面临的困境,逐步形成完整的企业数智生态。


http://www.ppmy.cn/news/1170106.html

相关文章

Android之AMS原理分析

在学习android框架原理过程中,ams的原理非常重要,无论是在面试中还是在自己开发类库过程中都会接触到。 1 简述 ActivityManagerService是Android最核心的服务,负责管理四大组件的启动、切换、调度等工作。由于AMS的功能和重要性&#xff0c…

mybatis plus中json格式实战

1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0…

YZ系列工具之YZ12:VBA_4种方法设计下拉列表

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

Ansible的debug模块和魔法变量介绍,fact变量采集和缓存相关操作演示

目录 一.debug模块的使用方法 1.帮助文档给出的示例 2.主要用到的参数 &#xff08;1&#xff09;msg&#xff1a;主要用这个参数来指定要输出的信息 &#xff08;2&#xff09;var&#xff1a;打印指定的变量&#xff0c;一般是通过register注册了的变量 &#xff08;3&…

如何利用示波器解析I2C数据

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘校园大使&#xff0c;湖南区域的日常实习&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &am…

2.3.C++项目:网络版五子棋对战之实用工具类模块的设计

文章目录 一、实用工具类模块&#xff08;一&#xff09;功能 二、设计和封装&#xff08;一&#xff09;日志宏封装&#xff08;二&#xff09;mysql_util封装&#xff08;三&#xff09;Jsoncpp-API封装&#xff08;四&#xff09;file_util封装&#xff08;五&#xff09;st…

CUDA编程- __syncthreads()函数

基本概念 __syncthreads() 是CUDA编程中非常关键的一个同步原语。它的功能是确保在某个线程块中的所有线程在执行到这个函数之前都已完成它们之前的所有指令。一旦所有线程都到达这个同步点&#xff0c;它们才可以继续执行__syncthreads()之后的指令。这个函数只能在设备代码&…

Docker数据管理、端口映射、容器互联

目录 一、Docker 的数据管理&#xff1a; 1&#xff0e;数据卷&#xff1a; 1.1 宿主机目录/var/www/html 挂载到容器中的/data1&#xff1a; 1.2 测试&#xff1a; 2&#xff0e;数据卷容器&#xff1a; 2.1 创建一个容器作为数据卷容器&#xff1a; 2.2 挂载a1容器中的数据卷…

K8s:Pod 中 command、args 与 Dockerfile 中 CMD、 ENTRYPOINT 的对应关系

写在前面 前几天被问到&#xff0c;这里整理笔记之前也没怎么注意这个问题理解不足小伙伴帮忙指正 曾以为老去是很遥远的事&#xff0c;突然发现年轻是很久以前的事了。时光好不经用&#xff0c;抬眼已是半生&#xff0c;所谓的中年危机&#xff0c;真正让人焦虑的不是孤单、不…

Kotlin中的函数分类(顶层、成员、局部、递归等)

在 Kotlin 中&#xff0c;函数可以按照不同的方式进行分类。在本篇博客中&#xff0c;我们将介绍以下几种常见的函数分类&#xff0c;并提供示例代码进行演示。 顶层函数&#xff1a; 顶层函数是指定义在文件中的函数&#xff0c;不依赖于任何类或对象。它们可以在文件的任何…

分布式锁 - 理论篇

一、为什么需要分布式锁 二、分布式锁实现 1.分布式锁演进 - 基本原理 我们可以同时去一个地方“占坑”&#xff0c;如果占到&#xff0c;就执行逻辑。否则就必须等待&#xff0c;直到释放锁。“占坑”可以去redis&#xff0c;可以去数据库&#xff0c;可以去任何大家都能访…

YOLOv7-PTQ量化部署

目录 前言一、PTQ量化浅析二、YOLOv7模型训练1. 项目的克隆和必要的环境依赖1.1 项目的克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改模型配置文件3.2 修改数据配置文件3.3 训练模型3.4 mAP测试 三、…

LoadRunner录制脚本+编写脚本

LoadRunner安装* 为什么选择LoadRunner 1&#xff09;Jmeter没有录制功能 2&#xff09;可以设计非常非常丰富的测试场景 3&#xff09;LoadRunner能够产出非常丰富的测试报告 LoadRunner三大组件的关系 每个组件是干什么的 VUG&#xff1a;录制脚本&#xff0c;&#xff…

Matlab/C++源码实现RGB通道与HSV通道的转换(效果对比Halcon)

HSV通道的含义 HSV通道是指图像处理中的一种颜色模型&#xff0c;它由色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和明度&#xff08;Value&#xff09;三个通道组成。色调表示颜色的种类&#xff0c;饱和度表示颜色的纯度或鲜艳程度&#xf…

百度松果20231022作业

越狱 盒子与球 斯特林第二类数&#xff08;用dp求&#xff09;*盒子的阶乘 int dp[11][11]; //n>k int A(int x){int res1;fer(i,2,x1)res*i;return res; } signed main(){IOS;dp[2][1]dp[2][2]dp[1][1]1;fer(i,3,11){dp[i][1]1;fer(j,2,i){dp[i][j]j*dp[i-1][j]dp[i-1][j-…

python 均值滤波

网上公开的均值滤波方法不能较好地对两端进行滤波(有边际效应&#xff0c;或者序列长度缩短)&#xff0c;于是自己写了一个可以对两端也进行滤波的函数 def meanfilt(x, N):x_pad np.r_[np.zeros(N-1), x]denominator np.r_[np.arange(1, N1), np.ones(len(x)-N)*N]win_sum …

详解使用sklearn实现一元线性回归和多元线性回归

[Open In Colab] 文章目录 1. 线性回归简介2. 使用sklearn进行一元线性回归3. 线性回归的coef_参数和intercept_参数4. 使用sklearn实现多元线性回归4.1 利用PolynomialFeatures构造输入4.2 进行多元线性回归 5. 总结 import numpy as np import matplotlib.pyplot as plt1. 线…

Java基础(第一期):IDEA的下载和安装(步骤图) 项目结构的介绍 项目、模块、类的创建。第一个代码的实现

文章目录 IDEA1.1 IDEA概述1.2 IDEA的下载和安装1.2.1 下载1.2.2 安装 1.3 IDEA中层级结构介绍1.3.1 结构分类1.3.2 结构介绍project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09; …

靶机 DC-2

DC_2 信息搜集 存活检测 详细扫描 添加 host 后台网页扫描 网页信息搜集 主页面 找到 flag1&#xff0c;提示使用 cewl 密码生成工具 wp 登陆界面 使用 wpscan 扫描用户 wpscan --url http://dc-2/ --enumerate u 扫描出用户 tom、jerry、admin 将三个用户名写入文件中…

一文带你彻底弄懂ZGC

1 推荐的文章 1.1 必看 干掉1ms以内的Java垃圾收集器ZGC到底是个什么东西&#xff1f; 1.2 选看 ZGC有什么缺点? 2 疑问【皆来自上面两篇文章】 2.1 什么使得用户线程工作的同时&#xff0c;让垃圾收集器可以回收垃圾-读写屏障 ZGC (Z Garbage Collector) 和读写屏障: …