湖仓一体 - Apache Arrow的那些事

湖仓一体 - Apache Arrow的那些事

Arrow是高性能列式内存格式标准。它的优势:高效计算:所有列存的通用优势,CPU缓存友好、SIMD向量化计算友好等;零序列化/反序列化:arrow的任何数据结构都是一段连续的内存,在跨进程/跨及其传输数据时直接发送/接收整段内存即可,不需要序列化和反序列化;完善的数据类型和生态;支持跨语言跨系统互操作。

Arrow代码库分为3个层次:core层,提供数据类型表示,这一层非常稳定,新版本完全兼容之前版本;Compute层,提供计算算子,相对稳定,但有bug,使用一些比较高级指令集如AVX512时,会有一些内存对齐问题;Acero层,是最新执行引擎,不够稳定更适合开发测试。

本文关注arrow执行器式如何实现高性能。重点关注两方面的功能:Gandiva表达式JIT;Acero流式执行引擎:基于push的引擎

1、Gandiva

传统数据库执行器基于火山模型,一次仅处理一条数据,存在大量虚函数调用,会造成非确定性跳转指令,CPU无法做分支预测,打断CPU流水线;计算中无法确定类型,算子中存在很多动态类型判断,执行过程中,需要频繁对类型进行识别;递归函数调用打断计算过程。所以使用LLVM代码生成技术进行动态即时编译以及SIMD向量化,提升数据处理性能。首先表达式编译器将抽象语法树转换为中间字节码;然后执行时JIT编译器将其进一步转换成最终的机器码。

Gandiva采用C++实现,同时也提供了Python和java的绑定接口。有评论说该项目差不多已经死了。

5e87e90f837d1e418571be02ad3b5580.png

应用程序将一个表达式树提交给Gandiva编译器,可以在运行时进行编译。从而控制Gandiva执行内核,处理Arrow buffers中的batches。

表达式库支持的操作比如:目前它的表达式库除了基本的算数运算符以外,还拥有超过100个内置函数及布尔运算符,主要用于投影和过滤。

795f820b557688c2cf145be1cd6d61ec.png

支持表达式、投影和过滤。利用TreeExprBuilder构建表达式树,包括函数节点、if-else逻辑和布尔表达式的创建。然后,利用Projector或者Filter执行内核高效处理这些表达式。

对于混有NULL值的批量处理方式:将NULL的标记从数据中分离,使用bitmap来表示,减少CPU的分支预测代价。数据可以使用SIMD进行批量处理,bitmap也单独进行计算,两者结合起来就是最终计算结果。

f5428711778c48c6b37db8fa54076fb2.png

下面是一个简单的SIMD加法例子:使用AVX-128,一次操作可以处理8个两字节的值。

09703e432c4e7ab179f58d9be7b9f73e.png

附炎凰数据在DataFun上分享演讲回答的几个问题:

Q1:Gandiva 生成的 LLVM 是标量值,有用到向量值,就是 SIMD(单指令多数据流)或者 AVX(高级向量扩展)等技术吗?

A1:这是一个非常好的问题,有些人可能会对采用 Gandiva 协助生成 LLVM IR 的代码存在一定担忧,是否能达到预期的性能要求。因为在常规执行过程中,人们通常期望拥有准确、高效的向量化支持。针对这个问题,Gandiva 已经做出了妥善的处理,生成的 LLVM-IR 中间形式均具备向量化支持,以确保所需的功能得以保留。

这些技术使得处理器能够同时处理多个数据,从而大大提高了程序的执行效率。在 Gandiva 中,LLVM IR(中间表示)被转换为可执行代码的序列,这些代码可以由 SIMD 指令集执行。因此,Gandiva 生成的 LLVM IR 序列可以在支持 SIMD 指令集的处理器上高效运行。

Q2:Gandiva 一生成出来就是 LLVM 的形式?就是向量化的执行代码?

A2:是的。它是经过优化的,实际执行的和我刚刚给大家展示的 Arrow code 是不一样的,后者代表了初始的呈现方式,然而在实际执行过程中都是有向量化支持的。

Gandiva 生成的是 LLVM 的形式,并且可以生成向量化的执行代码。Gandiva 是一个开源项目,旨在为 Apache Arrow 提供高效的数据处理功能。它使用 LLVM 作为后端,通过 LLVM 编译器将源代码编译为高效的机器码,并利用 SIMD 指令集实现向量化的执行代码,从而提高数据处理性能。因此,Gandiva 生成的代码可以在支持 SIMD 指令集的处理器上高效运行,实现高性能的数据处理。

Q3:Arrow 社区提供了 compute API 以及各种语言的高性能实现以供基于 Arrow 格式进行数据操作的向量化复用,跟 Gandiva 生成的 LLVM 的形式的向量化有什么区别和联系?

A3:这也是一个很好的问题,Arrow 有自己的一套执行框架,叫做 Arrow Acero,它对向量化的支持是非常友好的。

Arrow 社区提供的 compute API 以及各种语言的高性能实现,是基于 Arrow 格式进行数据操作的开发人员可以直接复用的工具。这些工具可以帮助开发人员更高效地处理数据,并提高程序的执行效率。

而 Gandiva 生成的 LLVM 形式,是利用 LLVM 编译器将源代码编译为高效的机器码,并利用 SIMD 指令集实现向量化的执行代码。这种生成方式可以使得 Gandiva 生成的代码在支持 SIMD 指令集的处理器上高效运行,从而提高数据处理性能。

两者的主要区别在于,Arrow 社区提供的工具主要是提供API和各种语言的高性能实现,而 Gandiva 生成的 LLVM 形式则是通过编译源代码来实现高效的数据处理。另外,Gandiva 生成的 LLVM 形式是向量化的执行代码,可以充分利用处理器的 SIMD 指令集,而 Arrow 社区提供的工具则不一定是向量化的。

所以我们的整个执行引擎在经过了很多次迭代之后完全切到了一个新式的、对流式计算有一个更好的支持的引擎,这个引擎也是基于 Arrow compute 构建的。

2、Acero执行引擎

Push-based向量化执行引擎,是一个C++库。目前支持的算子:Source、Sink、HashJoin、Project、Filter、Sort、 Agg、pivot_longer、asofjoin、union。不提供分布式执行,并且是一个开发版本,并不稳定。他将计算表示为“execution plan”即ExecPlan,接收零个或多个输入数据,输出一个数据流。Plan描述了数据在通过这个节点时,是怎么转换的,也就是计算的。比如下面的例子:使用一个公共列合并两个数据流;以现有列为基础通过表达式计算产生一个额外列;以分区布局形式将数据流写入磁盘。Substrait是一个构建查询计划的项目,Acero作为它的消费者,执行它产生的执行计划并产生数据。

10b6bdb6ca9ffc92eac08786bcf99af7.png

Acero中最基本的概念是ExecNode:如果有0个输入,就称为source;若无输出就称为sink。有多种其他的节点,每个节点以不同方式将输出进行转换,例如:

1)Scan节点就是一个从文件中读数据的source节点;

2)Aggregate节点进行聚合计算

3)Filter节点根据过滤表达式进行过滤计算

4)Table Sink节点累积数据到一个表

一批数据使用ExecBatch类进行表示。一个ExecBatch是一个二维结构,和RecordBatch类似。可以有零个或者多列,并且每列必须有相同长度。RecordBatch和ExecBatch的几个关键区别:

2eeb301719acdb1ee305c026a0a457ee.png

1)ExecBatch没有schema。假设他是一个batch流的一部分,并且流假设是由一个持久的schema。因此该schema通常存储在ExecNode中

2)ExecBatch中的列要么是一个Array,要么是标量。若是标量,意味着该列的一个batch种仅一行值。它还有一个长度属性,描述batch中的行数。

3)ExecBatch还有额外信息以供执行器使用。例如一个index和用来描述有序流中一个batch的位置。还可以包含比如selection vector。

01773eb21df1c642f3dd4fd1aeae22bd.png

Record batch到exec batch的转换是零拷贝,RecordBatch和ExecBatch都引用完全相同的arrays。

ExecPlan表示ExecNode的对象图。一个有效的ExecPlan至少有一个source,但从技术上将,它不需要有一个sink节点。ExecPlan包含有所有节点共享的资源,有公共函数控制节点的启动和停止执行。ExecPlan和ExecNode都和单个执行的生命周期相关联。

Declaration描述一个执行计划。

02a27e5f0b698c45d55ce859adfe81c4.png

Acero基本流程:

1)创建一组Declaration对象,描述该执行计划

2)调用DeclarationToXyz方法执行该Declaration

(1)根据Declarations创建一个新的ExecPlan。每个Delaration对应该计划中的一个ExecNode。同时依赖于使用哪种DeclarationToXyz方法,添加一个sink节点

(2)执行ExecPlan。通常这是DeclarationToXyz调用的一部分,在DeclarationToReader中,reader在计划执行完成之前返回。

(3)一旦执行完该计划,就进行销毁。

节点内部可以执行并行。比如Scan节点可以并行decode列。Hash join节点可以用于并行构建hash表,还可以并行排序。

参考

https://www.modb.pro/db/1765921255731073024

https://zhuanlan.zhihu.com/p/655305778?utm_id=0

https://github.com/apache/arrow

https://arrow.apache.org/docs/cpp/

https://www.dremio.com/blog/announcing-gandiva-initiative-for-apache-arrow/

https://zhuanlan.zhihu.com/p/678108750

https://cloud.tencent.com/developer/article/2322115

https://zhuanlan.zhihu.com/p/635751399

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入学习指针3

目录 前言 1.二级指针 2.指针数组 3.指针数组模拟二维数组 前言 Hello,小伙伴们我又来了,上期我们讲到了数组名的理解,指针与数组的关系等知识,那今天我们就继续深入到学习指针域数组的练联系,如果喜欢作者菌生产的内容还望不…

### 【数据结构】线性表--顺序表(二)

文章目录 1、什么是线性表2、线性表的基本操作3、顺序表3.1、顺序表的定义3.2、顺序表的实现方式:静态分配3.3、顺序表的实现方式:动态分配3.4、顺序表的特点3.5、顺序表的初始化与插入操作3.6、顺序表的删除与查询 1、什么是线性表 ​ 线性表是具有相同…

MyBatis——使用MyBatis完成CRUD

CRUD&#xff1a;Create Retrieve Update Delete 1、insert <insert id"insertCar">insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)values(null,1003,五菱宏光,30.0,2020-09-18,燃油车); </insert> 这样写显然是写死的&#…

AI办公自动化:用kimi批量新建Word文档

Excel文件中有43行内容&#xff0c;希望根据这些内容批量新建43个word文档。 在kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写批量新建Word文档Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开F盘的表格文件&#xff1a;工…

node.js学习笔记

读取命令行参数 安转minimist&#xff08;轻量级的命令行参数解析引擎&#xff09; npm install --save minimist js文件 const minimist require("minimist");const args minimist(process.argv.slice(2));console.log(args["id"]) package.json {…

2024年汉字小达人活动还有4个多月开赛:来做18道历年选择题备考吧

不出特殊情况的话&#xff0c;距离2024年第11届汉字小达人比赛还有4个多月的时间&#xff0c;如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷刷熟…

1689 ssm社区老人危机干预系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm社区老人危机干预系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

Reactor Netty UDP 客户器端-响应式编程-017

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

玩游戏专用远程控制软件

玩游戏专用远程控制软件&#xff1a;实现远程游戏的新体验 随着网络技术的不断发展和创新&#xff0c;远程控制软件已经逐渐渗透到我们生活的方方面面&#xff0c;尤其是在游戏领域。玩游戏专用远程控制软件&#xff0c;作为这一趋势下的产物&#xff0c;为玩家提供了全新的游…

CentOS 7安装配置docker

CentOS 7、8安装、配置docker 这里宿主机的型号选择是centos7.9.2009的版本 1.宿主机关闭防火墙和selinux&#xff0c;配置ipv4 #设置SELinuxdisabled vim /etc/selinux/config SELinuxdisabled 查看防火墙状态&#xff1a;firewall-cmd --state 关闭防火墙&#xff1a;syst…

【智能算法】正切搜索算法(TSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2022年&#xff0c;A Layeb受到正切函数启发&#xff0c;提出了正切搜索算法&#xff08;Tangent Search Algorithm, TSA&#xff09;。 2.算法原理 2.1算法思想 TSAT基于正切函数的数学…

【YashanDB知识库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM

问题现象 问题的风险及影响 导致数据库无法托管监控 问题影响的版本 问题发生原因 安装数据库时修改了OM的监听ip为127.0.0.1 解决方法及规避方式 后台修改OM的ip为本机的ip或者0.0.0.0 问题分析和处理过程 1、修改env文件中的om IP地址&#xff0c;修改为0.0.0.0或本机…

Windows:管理用户账户,密码策略和安全配置

在Windows操作系统中&#xff0c;管理用户账户和密码策略是确保系统安全的关键步骤。本文将探讨如何通过PowerShell和其他Windows工具管理用户账户&#xff0c;包括查看和设置密码策略、检查用户状态&#xff0c;以及导出和导入安全策略。这些管理任务对于系统管理员尤其重要&a…

如何通过PHP语言实现远程控制空调

如何通过PHP语言实现远程控制空调呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制空调&#xff0c;通过不同规格的通断器&#xff0c;来控制不同功率的空调的电源。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称…

docker安装nginx支持ssl 实现https访问(完整版)

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 本文简介 2. docker安装nginx支持ssl2.0 准备ssl证书(例: 阿里云)2.0.1 配置域名解析2.0.2 找到数字证书管理服务并签发ssl证书2.0.3 选择默认证书 填写域名 创建2.0.4 提交审核, 签发成功2.0.5 解压并上传到宿主机ssl路径下 …

【算法与数据结构】数组

文章目录 前言数组数组的定义数组的基本操作增加元素删除元素修改元素查找元素 C STL 中的数组arrayvector Python3 中的列表访问更改元素值遍历列表检查列表中是否存在某元素增加元素删除元素拷贝列表总结 Python3 列表的常用操作 参考资料写在最后 前言 本系列专注更新基本数…

Acrobat Pro DC 2023 for Mac:PDF处理的终极解决方案

Acrobat Pro DC 2023 for Mac为Mac用户提供了PDF处理的终极解决方案。它具备强大的文档处理能力&#xff0c;无论是查看、编辑还是创建PDF文件&#xff0c;都能轻松胜任。在编辑功能方面&#xff0c;Acrobat Pro DC 2023支持对文本、图像进行精准的修改和调整&#xff0c;还能添…

2024-05-10 Ubuntu上面使用libyuv,用于转换、缩放、旋转和其他操作YUV图像数据,测试实例使用I420ToRGB24

一、简介&#xff1a;libyuv 最初是由Google开发的&#xff0c;主要是为了支持WebRTC项目中的视频处理需求。用于处理YUV格式图像数据的开源库。它提供了一系列的函数&#xff0c;用于转换、缩放、旋转和其他操作YUV图像数据。 二、执行下面的命令下载和安装libyuv。 git clo…

杰发科技AC7801——ADC之Bandgap和内部温度计算

0. 参考 电流模架构Bandgap设计与仿真 bandgap的理解&#xff08;内部带隙电压基准&#xff09; ​ ​ 虽然看不懂这些公式&#xff0c;但是比较重要的一句应该是这个&#xff1a;因为传统带隙基准的输出值为1.2V ​ 1. 使用 参考示例代码。 40002000是falsh控制器寄…

LeetCode 112. 路径总和 || LeetCode 113. 路径总和ii

LeetCode 112. 路径总和 1、题目 题目链接&#xff1a;112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true…