论文解读:基于 OpenMLDB 的流式特征计算优化

news2024/11/24 1:53:17

近期,数据库领域的顶级学术会议 ICDE 2023 在迪斯尼主题公园的故乡 - 美国的安纳海姆(Anaheim)举办。由 OpenMLDB 开源社区和新加坡科技设计大学(Singapore University of Technology and Design)联合完成的研究工作在 ICDE 2023 上作为工业界的常规论文发表。该项研究工作增强了 OpenMLDB 的流式特征计算能力,对其中的关键操作 Interval Join 进行了深度优化,取得了比目前工业界普遍使用的算法高达数量级的吞吐和延迟优化。基于该优化算法,克服了流式计算在实时机器学习领域所遇到的性能瓶颈,可以支持在金融、风控、推荐等领域的毫秒级实时流式特征计算的需求。其论文预印版可在此链接阅读:Scalable Online Interval Join on Modern Multicore Processors in OpenMLDB

file
file
在这里插入图片描述

OpenMLDB 作为一个线上线下一致的实时特征计算平台,被广泛应用于如反欺诈、风控、实时推荐等场景。在本次的研究工作中,双方合作对基于 OpenMLDB 进行流式特征的计算能力进行了深度优化。特别的,我们关注其中的性能瓶颈,即 Interval Join 操作。下图为 Interval Join 的示意图。其基于数据流 S,定义一个往前两秒的时间窗口,对数据流 R 上在对应时间窗口内的数据进行 JOIN 或者聚合操作,完成需要的特征计算逻辑。该操作在 Flink 中即为 Interval Join,在 OpenMLDB 中是通过 WINDOW UNION 语法进行副表多行聚合特征的开发,或者也被称为 point-in-time join/aggregation。

file

Interval Join 在现有的工业界流式处理系统中,一般使用 key-partitioned based join 算法,简称为 Key-OIJ。比如在工业界中普遍使用的流式计算框架 Flink,即使用了 Key-OIJ 的算法实现 Interval Join 的计算任务。此种算法对于一个 buffer 内的 R 和 S 做 partition,然后对于在相同 partition 内的数据再进行 join 或者聚合操作。在此次研究工作中,我们发现 Key-OIJ 在很多真实世界的工作负载中存在严重的性能问题。主要总结为:

  • 工作负载不平衡和数据倾斜。当 key 的数目较少时(甚至如 key 的数量小于线程数量),非常容易出现数据倾斜的问题,从而导致整体系统的效率大幅下降。
  • 当存在时间上的重叠窗口时,该算法会带来大量的重复计算,导致大窗口下整体计算效率低下。
  • 由于数据无序,导致了整个计算过程的大量数据扫描;并且需要缓存更多的数据以保证结果的正确性。

在实时机器学习领域,实时特征计算一般对性能的需求在毫秒级别。使用 Key-OIJ 算法进行线上实时计算,很可能会因为高延迟而无法满足业务需求。因此,我们需要对该算法进行进一步的优化,以满足实时机器学习的需求。
为了克服以上 Key-OIJ 算法存在的问题,优化 Interval Join 的性能,我们在 OpenMLDB 的现有算法基础上,提出了一个全新的算法,称为 Scalable Online Interval Join(Scale-OIJ)。该算法针对此类工作负载优化,基于 OpenMLDB 的核心数据结构 - 双层跳表,设计了一个支持高效率单写多读(Single-Writer-Multiple-Reader index,即 SWMR)优化的索引。如下图显示了该核心数据结构和 SWMR 机制。第一次跳表维护键值到第二次跳表的映射关系;第二次跳表维护时间戳到数据行的映射关系,通过双层跳表的数据结构,可以以 log(N) 的时间复杂度,定位到需要的窗口数据,避免了如 Key-OIJ 算法中的大量数据扫描。通过支持单写多读的无锁并行数据结构,可以更加轻量的在多线程间共享数据。

在这里插入图片描述

file

除了基于双层跳表的核心数据结构,我们还引入了更多的优化技术。

  • 动态调度:通过分析实时数据流的分布情况,动态调整 partition 的策略,使得数据可以更均匀地分布到所有线程上,避免了工作负载不平衡和数据倾斜。基于单写多读的数据结构,不同线程之间可以共享数据,协同对同一个 key 进行处理,即使当 key 的数目较少时,所有线程仍然可以保持较高的稳定的 CPU 利用率。
  • 增量聚合:真实数据集中,会出现大量的窗口重叠的情况,很大地浪费了计算资源。通过利用之前计算的结果,增量地更新当前计算,从而避免了重复的数据扫描和计算。当窗口很大的情况下,极大地减少了整体的数据访问和计算。

基于以上的优化,我们对 Scale-OIJ 算法进行了系统性的评估。我们使用了三个具备不同特性的真实世界数据集进行测试,测试数据集和实验结果显示如下。可以看到,在三个不同的数据集下,我们设计的 Scale-OIJ 算法比现有的 Key-OIJ 算法均有大幅的提升:在吞吐方面,有多达 24 倍的提升;在延迟方面,最多缩短了 99% 的延迟。

file
在这里插入图片描述

目前,该 paper 提出的 Scale-OIJ 算法已经和 OpenMLDB 进行了部分整合。未来,我们将完成最终的工程化整合,为流式特征在 OpenMLDB 的实时处理提供进一步的性能优化。我们也欢迎社区内的开发者和我们进行前沿的学术合作,共同打造 OpenMLDB 在技术上的领先性。

扫描以下二维码加入我们的社区技术讨论群

file

参考资料

  • ICDE 论文原文:https://intellistream.github.io/downloads/papers/Zhang-2023-OIJ-OpenMLDB_CR.pdf
  • OpenMLDB 的核心数据结构:实时引擎核心数据结构和优化解析
  • OpenMLDB 内基于 WINDOW UNION 语法构造副表多行聚合特征:https://openmldb.ai/docs/zh/main/tutorial/tutorial_sql_2.html#id3
  • OpenMLDB 产品文档:https://openmldb.ai/docs/zh/main/
  • OpenMLDB GitHub: https://github.com/4paradigm/OpenMLDB

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

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

相关文章

Vue2-黑马(三)

目录: (1)vue2-axios (2)axios-发送请求 (3)vue2-axios-请求体格式 (4)vue2-axios-默认配置 (1)vue2-axios 已经配置了代理,可以…

项目部署---shell脚本自动部署项目

通过shell脚本自动部署项目 操作步骤: 在Linux中安装Git在Linux中安装maven编写shell脚本(拉取代码、编译、打包、启动)为用户授予执行shell脚本的权限执行shell脚本 执行过程:Linux服务器(编译、打包、启动&#x…

每天一道大厂SQL题【Day21】华泰证券真题实战(三)

每天一道大厂SQL题【Day21】华泰证券真题实战(三) 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…

爱智EdgerOS之深入解析爱智云原生产品ECSM

一、云原生简介 近些年来,云原生逐渐被业界认可和接受,在国内,包括政府、金融、通信、能源在内的众多领域的大型机构和企业都实现了不同程度的云化,那么什么是云原生呢?云原生计算基金会提供了官方的定义:…

参考|雨水情测报和大坝安全监测系统建设方案

解决方案 小型雨水情测报和大坝安全监测系统解决方案,系统主要由降雨量监测站、水库水位监测站、大坝安全监测中的渗流量、渗流压力和变形监测站及视频和图像监测站等站点组成,同时建立规范、统一的监测平台,集数据传输、信息共享、数据储存…

比较系统的学习 pandas (6)

pandas 数据类型转换 在开始数据分析前,有时需要为数据分配好合适的类型,这样才能 够高效地处理数据 # 对所有字段指定统一类型 data pd.DataFrame(data, dtypefloat32) # 对每个字段分别指定 data pd.read_excel(data.xlsx, dtype{name: string, sc…

CUDA和TensorRT入门

CUDA 官方教程:CUDA C Programming Guide (nvidia.com) 一、基础知识 首先看一下显卡、GPU、和CUDA的关系介绍: 显卡、GPU和CUDA简介_吴一奇的博客-CSDN博客 延迟:一条指令返回的时间间隔; 吞吐量:单位时间内处理…

libwebsockets交叉编译

libwebsockets官网:https://libwebsockets.org/ github:https://github.com/warmcat/libwebsockets 首先下载libwebsockets源码,源码既可以在其官网上下载,也可以到github上下载。这里以v4.1.6为例,https://github.co…

react项目中自定义一个markdown编辑器

Markdown 是一种轻量级标记语言。 Markdown是一种简单的格式化文本的方法,在任何设备上看起来都很棒。它不会做任何花哨的事情,比如改变字体大小、颜色或类型——只是基本的,使用你已经知道的键盘符号。 它还允许人们使用易读易写的纯文本格…

为什么众多大型国企都在升级企业数智化底座?

在数字经济大潮中,数字化转型已不是企业的“选修课”,而是关乎企业生存和长远发展的“必修课”。在企业数字化转型中,国有企业特别是中央企业普遍将数字化转型战略作为“十四五”时期业务规划的重要内容之一,数字化能力也成为衡量…

图文详解CAN Log文件 - ASC文件格式

目录 1 CAN Log文件 -- ASC文件格式 1.1 Header 1.2 版本编号 1.3 经典CAN网络中的描述 1.3.1 经典CAN Standard标准帧的描述 1.3.2 经典CAN Extended扩展帧的描述 1.3.3 CAN Remote远程帧的描述 1.3.4 CAN Error错误帧的描述 1.4 CANFD网络中的描述 1.4.1 经典CAN S…

图解并用 C 语言实现非比较排序(计数排序、桶排序和基数排序)

目录 一、计数排序 二、桶排序 三、基数排序 一、计数排序 算法步骤: 找出待排序数组 arr 中的最小值和最大值(分别用 min 和 max 表示)。 创建一个长度为 max - min 1、元素初始值全为 0 的计数器数组 count。 扫描一遍原始数组&…

Nacos客户端实例注册源码分析-篇一

Nacos客户端实例注册源码分析-篇一 版本 nacos 服务器端 nacos 2.0.3 实例客户端注册入口 注册案例 回到之前搭建的服务提供者项目 9002 ,在真实的生产环境下,如果需要让某一个服务注册到 Nacos 的服务当中,我们引入对应的 nacos 发现依赖&…

4月Google Play政策更新,游戏上架需要注意这几点

3月21日,据路透社报道,由于发现国内某知名电商应用存在恶意软件问题,谷歌已暂时将该APP从商店下架,并表示:将该APP下架是一种安全预防措施,已经下载的用户也会收到警告,提示他们进行卸载。 4月…

基于深度学习的动物识别系统(YOLOv5清新界面版,Python代码)

摘要:动物识别系统用于识别和统计常见动物数量,通过深度学习技术检测日常几种动物图像识别,支持图片、视频和摄像头画面等形式。在介绍算法原理的同时,给出Python的实现代码、训练数据集以及PyQt的UI界面。动物识别系统主要用于常…

c/c++:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换

c/c:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的…

【自定义表格穿梭框】自定义封装jqgrid表格穿梭框,支持分页复选全选(附完整源码及效果图)

【写在前面】其实之前业务中也有这个方面的需求,但是总觉得自己写的有点乱,此时也就借这个机会重新封装一个公共的函数去实现这个穿梭框的效果,支持分页勾选,页面展示已选中和未选择的数据,使得系统操作更友好。 涉及知…

数学建模(三):模拟退火算法(SA)

文章目录模拟退火算法(SA)一、 概述1、 算法简介2、 核心思想3、 数学原理4、 模拟退火的流程二、 实例分析1、 初始化参数2、 Metrospolis 准则3、 生成新的值4、 获取最优值5、 主程序6、 总代码模拟退火算法(SA) 一、 概述 1…

折叠屏市场起风,华为、OPPO“你追我赶”

配图来自Canva可画 现如今,智能手机已经成为了人们生活中不可或缺的重要工具,无论是出行,还是社交,亦或是支付,只需要一部智能手机就可以通通搞定。因此,在消费者多样化需求的助推下,智能手机行…

【Spring】—Spring中Bean的配置、作用域

一、Bean的配置 Spring用于生产和管理Spring容器中的Bean,需要开发者对Spring的配置文件进行配置。在实际开发中,最常采用XML格式的配置方式,即通过XML文件来注册并管理Bean之间的依赖关系。 在Spring中,XML配置文件的根元素是…