Offsets 获取该行的起始索引 start=offsets (x)

news2025/3/2 4:19:59

获取数据列的第 x 行,通过 Offsets 获取该行的起始索引 start=offsets (x) 和下一行的起始索引 end=offsets (x+1),然后使用这两个索引通过 Bytes 获取具体数据对应的字节流 bytes.slice (start,end),最后按照字段类型做相应的转换即可。

注:为方便表述,上面例子做了一定的简化,对于 Nullable 数据列,实际上还有 FixedLengthColumn<uint8_t> 的数据结构,对应一段连续的 Bool 数据,用来表示对应行号的列数据取值是否为 Null,用来加速 Nullable 列的计算效率,减少数据列的存储空间。

内存分配和管理设计

由于 BE 端是通过 Memory Tracker 进行内存管理的,我们在实现 JNI Reader 时,由 Memory Tracker 统一进行内存的分配和销毁,避免直接使用 JVM Unsafe 分配 Native Memory,来保证内存统计的准确性,并防止出现错误的内存使用导致的各类问题。

编程框架设计

在编程框架上,我们完整定义了 JNI Connector 的 Java 接口,让开发者不需要进行复杂的 JNI 编程以及相关的内存管理,只需要继承 ConnectorScanner 抽象类,实现 open (), getNext (), close () 这三个抽象方法,然后在 BE 侧给出具体实现类的名称,便可以完整使用我们的 JNI Connector, 读取各类 Java 数据源的数据。

混合使用 Native Reader 和 JNI Reader 设计

在 Hudi Reader 的实现里,我们有一个优化方案。上文提到,我们在 Scan range 里添加了 useJNIReader 的字段。这个字段具体取值在 FE 端通过下面逻辑控制:

判断当前表的数据类型:如果是 MOR 表,查询类型为 Snapshot,且该 File Slice 包含一个或一个以上的 Delta log,useJNIReader 便置为 True,其他情况都为 False。

这样带来的效果是,对于同一个 MOR 表的 Snapshot 读取,BE 端实际上会同时混合使用两种不同的 Reader 去拿数据,使用 Native reader 读取不包含 Delta Logs 的 File Slice,使用 JNI Reader 读取包含 Delta Logs 的 File Slice,不同的 Reader 混合使用可以进一步提升读取效率,且这些加速对于用户都是透明无感知的。

6、使用案例

1. 创建 hudi catalog

CREATE EXTERNAL CATALOG "hudi_catalog"
PROPERTIES (
"type" = "hudi",
"hive.metastore.uris"= "thrift://xxx:9083"  -- hive metastore地址
);

2. 执行查询

select * from hudi_catalog.<db_name>.<table_name>;
+------+------+---------------------+------------------------+--------------------+-----------------------+------------------------------------------------------------------------+
| id | age | _hoodie_commit_time | _hoodie_partition_path | _hoodie_record_key | _hoodie_commit_seqno | _hoodie_file_name |
+------+------+---------------------+------------------------+--------------------+-----------------------+------------------------------------------------------------------------+
| 3 | 33 | 20220422111823231 | age=33 | id:3 | 20220422111823231_0_3 | 29d8d367-93f9-4bd3-aae4-47852e443e36-0_0-128-114_20220422111823231.orc |
+------+------+---------------------+------------------------+--------------------+-----------------------+------------------------------------------------------------------------+

7、性能测试

测试环境:

阿里云 EMR Presto 集群,阿里云 EMR StarRocks 集群

硬件配置:

Master: ecs.g7.4xlarge 16 vCPU 64 GiB

Worker: ecs.g7.4xlarge 16 vCPU 64 GiB * 5

软件配置:

StarRocks 版本:master 分支(Hudi MOR 读取特性会在 2.5.0 正式发布)

StarRocks 软件配置:默认配置

Presto 版本:0.277

Presto 软件配置:

query.max-memory-per-node=40GB
query.max-memory=200GB

COW 表 Snapshot 查询 TPCH-100 测试结果

对于 COW 表 Snapshot 查询,使用 StarRocks 相对 Presto 大约会带来 5 倍的性能提升。

MOR 表 Snapshot 查询 TPCH-100 测试结果

对于 MOR 表 Snapshot 查询,如上文描述,混合使用了 Native Reader 和 JNI Reader,因此,我们在 StarRocks 上测试读取不同比例更新数据(带有 Delta Logs 的 File Slice)的执行时间,来得到不同更新比例场景下的查询效率数据。从测试结果可以看出,更新数据比例越小,StarRocks 实际执行时使用 Native Reader 的比例也就越高,执行效率也越好。

根据社区的经验,最常见的库表更新场景里,在 Hudi 表做 Compaction 操作前,带有 Delta Logs 的 File Slice 占整个表的比例大约在 20% 左右,在这种条件下,使用 StarRocks 相对 Presto 大约会带来 2-3 倍的性能提升。

对于 MOR 表 Read Optimized 查询,StarRocks 内部执行原理和流程与 COW 表相同,性能提升数据也一致。

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

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

相关文章

QGC二次开发基础

文章目录 前言一、添加文件到QGC工程二、添加界面三、QML和C++交互四、信号与槽五、测试前言 QGC 4.2.4 一、添加文件到QGC工程 在qgroundcontrol/src目录下创建SimpleTest文件夹 在文件夹中创建SimpleTest.cpp、SimpleTest.h和SimpleTest.qml三个文件 在qgroundcontrol.p…

锁竞争导致的慢sql分析

线上在同步用户时&#xff0c;经常出现简单sql的慢日志。根据方法找到代码&#xff0c;发现方法内使用redisson进行锁操作&#xff0c;waiTime和leaseTime都为3秒,数据库操作比较简单&#xff0c;只是一个简单的用户更新操作。代码简化后如下 Override Transactional(rollback…

客流分析统计摄像头可定制算法程序自动判断识别提醒

客流分析统计摄像头是一个专门为商业零售业企业开发的智能客流量统计分析系统。客流统计分析系统能实时、动态、准确、连续地记录着经营场地的客流的数据信息&#xff0c;既有当前客流又有历史客流&#xff0c;既有不同时段的&#xff0c;又有不同区域客流数据。 客流分析统计摄…

【论文】Poly-yolo: 改进anchor分配问题

文章目录Poly-yolo: higher speed,more precise detection and instance segmentation for yolov31 修改了骨干网络增加CE模块2 重写标签3、修改了输出层3.1 修改细节3.2 修改目的&#xff1a;改进anchor分配问题4 检测多边形 Instance segmentation with Poly-YOLO4.1 The pri…

【Pytorch with fastai】第 9 章 :表格建模深入探讨

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

95后工程师上班哼小曲?那些愉快上班的打工人,到底怎么做到的?

特别羡慕我们公司一个画PCB板子的刘工&#xff0c;95后&#xff0c;来公司也3年多了&#xff0c;他不是我们部门赚得最多的&#xff0c;也不是人际关系处得最好的&#xff0c;却是活得最开心的。 具体表现在哪呢&#xff1f; ——他居然能每天哼着小曲上班。 怎么会有人上班…

《Linux下的进程创建》

【一】fork函数初识 在Linux中fork函数是非常重要的&#xff0c;他从已存在的进程中创建一个新进程&#xff0c;进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a;fork函数的返回值是非常有意思的&#xff0c;他是有两个返回值的&#xff0c;对于父进程来说&…

QRegExp(正则表达式)

QRegExp 头文件&#xff1a;#include<QRegExp> 构造函数&#xff1a; 常用函数&#xff1a; indexIn()判断是否符合规则matchedLength()返回最后一个匹配字符串的长度&#xff0c;没有的话返回-1setPattern()将模式字符串设置为模式。区分大小写、通配符和最小匹配选项不…

openpnp软件的使用 - 引入坐标文件

文章目录openpnp软件的使用 - 引入坐标文件前言笔记生成符合openpnp要求的坐标文件板子在openpnp设备上摆放的规则确定openpnp设备的x,y方向确定自己板子的原点坐标和xy方向在openpnp设备平台上摆放板子在openpnp中引入坐标文件新建任务新建板子引入板子的坐标文件设置mark点Pa…

Starday影响者视频能给你提升80%的流量?

跨境电商行业随着互联网时代的推进&#xff0c;Starday跨境电商平台受到越来越多的人关注&#xff0c;许多商家受碍于疫情影响&#xff0c;为了个人商家和企业发展&#xff0c;将目光投于海外。如雨后春笋般出现的跨境电商平台&#xff0c;也为商家带来了许多困扰&#xff0c;该…

JS高级(一):类、原生tab栏切换、原型和原型链

JavaScript高级&#xff08;一&#xff09;一、类&#xff08;之前ES6学过&#xff09;1.类的用法2.类的继承2.1 extends关键字2.2 super关键字&#xff08;1&#xff09;子类属性和父类一致&#xff0c;constructor可以省略&#xff08;2&#xff09;子类要添加属性&#xff0…

axios 实现 POST/PUT接口入参是 query的形式而非JSON的形式——querystring的使用

先看下什么是query的形式入参&#xff1a; 1.常规的GET请求 一般是GET请求才会是query string parameters的形式入参 参数是query string parameters的展示&#xff0c;最终效果是拼接到url地址中&#xff0c;如下图所示&#xff1a; 2.常规的POST/PUT请求 一般是POST/PUT请…

云小课|使用SQL加密函数实现数据列的加解密

摘要&#xff1a;数据加密作为有效防止未授权访问和防护数据泄露的技术&#xff0c;在各种信息系统中广泛使用。作为信息系统的核心&#xff0c;GaussDB(DWS)数仓也提供数据加密功能&#xff0c;包括透明加密和使用SQL函数加密。本文分享自华为云社区《看GaussDB(DWS)如何使用S…

电感单位亨利H单位换算

1H 1e-18EH 1e-15PH 1e-12TH 1e-9GH 1e-6MH 0.001kH 1H 1,000mH 1,000,000uH 1,000,000,000nH 1,000,000,000,000pH 1,000,000,000,000,000fH 在线H亨利单位换算 (toolxq.com)http://www.toolxq.com/front/tools/trans/unit/H 亨利是电感的国际单位制导出单位&#xff0c;符…

2022年《微信小程序从基础到uni-app项目实战》

教程推荐&#xff1a;黑马程序员前端微信小程序开发教程&#xff0c;微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_ 一、起步 1 uni-app 简介 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。开发者编写一套代码&#xff0c;可发布到 iOS、And…

Word不计算封面、目录页数将正文页码修改为第几页共几页的格式

本文介绍在Word文档中&#xff0c;不考虑封面、目录、前言等的页数&#xff0c;为正文添加“第X页&#xff0c;共X页”样式页码的方法。 在Word中&#xff0c;我们可以双击页眉或页脚部分&#xff0c;选择“页码”选项并添加页码。 其中&#xff0c;可以添加如下图所示形式的页…

Nginx配置虚拟主机

虚拟主机指的是,在一台服务器中,我们使用Nginx,来配置多个网站。 如何区分不同的网站: 端口不同域名不同 1、通过端口区分不同的虚拟主机 1.1、Nginx配置文件 &#xff08;1&#xff09;Nginx配置文件的位置 cd /usr/local/nginx/conf nginx.conf 就是Nginx的配置文件 &a…

Docker学习

Docker学习 Docker概述 Docker安装 Docker命令 Docker镜像 Docker的数据卷 DockerFile Docker网络原理 IDEA整合Docker 集群-Docker Compose Docker Swarm CI\CD jenkins Docker概述 安装教程&#xff1a;(https://docs.docker.com/engine/install/centos/) 文档…

CSS初阶语法

CSS初阶语法 文章目录CSS初阶语法1.CSS介绍2.CSS引入方式3.CSS基础选择器3.1 标签选择器(标签名字)3.2 类选择器(class)3.3 id选择器(id)3.4 通配符选择器(*)4.文字基本样式4.1 字体样式(font-size、font-weight、font-style、font-family、font)4.2 文本样式(text-indent、tex…

SpringBoot SpringBoot 开发实用篇 2 配置高级 2.1 第三方bean 属性绑定

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇2 配置高级2.1 第三方bean 属性绑定2.1.1 ConfigurationProperties2.…