当前位置: 首页 > news >正文

记 doris 加载压缩文件(lzo、snappy)pr

做了一个case,是doris支持加载lzo压缩文件。[improvement](load) Enable lzo & Remove dependency on Markus F.X.J. Oberhumer's lzo library by HowardQin · Pull Request #30573 · apache/doris (github.com)

其实doris里已经支持了 lzo,这个case源自一个issue,[Enhancement] broke load enhanced · Issue #29406 · apache/doris (github.com) 

issue中说不支持lzo和snappy,我猜是加载lzo压缩的hive表文件,报错不支持,snappy他应该没试过,我试过了,已经支持了snappy。

对于这些压缩格式和压缩文件,我也是第一次接触,网上了一些介绍,lzo 是一种压缩算法,它的开源库使用很简单,就是一个函数:

压缩时,接受一个数据块的内存地址和长度,压缩以后的数据块,放在另一个内存地址,压缩以后的大小,作为参数返回,这些内存的分配要事先分配好。

解压时,接受一个已压缩的数据块,解压以后的数据块,放在另一个内存地址,解压后的大小,作为参数返回。

这里要分清两个概念:lzo是压缩算法,它只管把一块大的数据压缩成一块小的数据,但是要把一个文件分成几个数据块来压缩,压缩以后怎么保存到磁盘,以便于解压缩,这些lzo是不管的,也不会做规定,于是就有了lzop,它是一个把普通文件做lzo压缩和解压的工具(可执行程序),它定义了保存lzo压缩文件的格式,可以理解lzop是保存用lzo压缩算法压缩以后的数据的一个容器(包装盒),而这个lzop也是有格式的。

一般来说,要把一个大文件,做lzo压缩并保存,要把这个大文件分成一个个小块,然后对这些小块调用压缩函数进行压缩,然后保存,而不是压缩整个文件。

这就有个问题,压缩以后的数据块,保存时不能简单的,紧挨着写到文件,而是在写入每个压缩后的数据块时,数据块的大小也要写到文件里,这样解压时先读取大小,再读入所指示的数据块,再传给解压函数才能正确解压。

上面只是一种最简单的格式,实际格式要稍微复杂一点,这种在压缩文件中,能被完整解压的一块数据和相关信息,有一个专业术语,称为帧格式(frame format),lzop定义了lzo压缩文件的帧格式,还定义了文件头,是这样的:

1、lzo压缩文件的开头的是9个字节的magic字符串,值是固定的,估计是作为lzop压缩文件的标识。

2、接下来是2个字节的version,这个指是lzop这种封装格式的版本。

3、接下来是2个字节的lib_version,这是指lzo压缩算法库的版本,要注意与前一个version的区别。

4、接下来是2个字节的version_needed,我搞不明白这个是做什么用的,但是这个值好像应该与2中的version一样。

5、接下来是1个字节的method,lzop压缩的文件是文件头+一个一个的帧,每个帧封装着一块压缩后的数据,其实这个压缩的算法并不一定要用lzo,这种封装压缩文件的格式有一定的通用性,也可以用于封装其它压缩算法压缩的数据,于是这个method就是用于指示帧中的压缩数据所使用的压缩算法,1~3都属于lzo算法。

6、接下来是1个字节的level,应该是lzo的压缩率 1~9,越小表示压缩的更快但牺牲压缩率,越大表示压缩的更慢但压缩率高,不过我看doris的代码里直接忽略了level的值估计解压函数能自动处理。

7、然后是4个字节的flag,里面以位图的形式,存储了文件头的checksum的类型,每个数据帧中数据块压缩和解压以后的checksum的类型,还有一些其它信息。

8、然后是12个字节的 mode 和 mtime,我也不知道是做啥用的,看doris代码是直接略过的,注意doris代码只有解压lzop文件。

9、然后是1个字节的文件名长度,“文件名”就是要解压的这个lzop文件名本身,文件名长度后面,紧跟着就是文件名字符串,注意,这个字符串不是以'\0'结尾的,而且通过长度控制不越界,读到内存中要加'\0',或std::string(ptr, len)转为string。

11、然后是4个字节的文件头数据的checksum,这个checksum是从文件头开始,到这4个字节以前的所有数据的校验和,“文件头数据”不包括文件头的checksum本身。

12、然后就是一帧一帧的压缩数据了。

每一帧的格式如下:

1、4个字节的解压以后的数据块长度

2、4个字节的压缩以后的数据块长度

3、4个字节的解压以后的数据块的checksum

4、4个字节的压缩以后的数据块的checksum

5、压缩以后的数据块,长度是在2中记录的

其它的压缩算法和它们的压缩文件封装格式,也存在相似的模式,也存在一个文件头和帧格式问题。

哦,还有,这些压缩算法都是无损压缩算法,还有所谓的“流式”其实就是一个数据帧一个数据帧的解压,然后把解压后的数据存储起来或发送出去。

相关文章:

记 doris 加载压缩文件(lzo、snappy)pr

做了一个case,是doris支持加载lzo压缩文件。[improvement](load) Enable lzo & Remove dependency on Markus F.X.J. Oberhumers lzo library by HowardQin Pull Request #30573 apache/doris (github.com) 其实doris里已经支持了 lzo,这个case源…...

【Leetcode】2670. 找出不同元素数目差数组

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的数组 nums ,数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示,其中 diff[i] 等于前缀 nums[0, …, i] 中不同元素的数目 减去 后缀 nums[i 1, …, …...

༺༽༾ཊ—Unity之-01-工厂方法模式—ཏ༿༼༻

首先创建一个项目, 在这个初始界面我们需要做一些准备工作, 建基础通用文件夹, 创建一个Plane 重置后 缩放100倍 加一个颜色, 任务:使用工厂方法模式 创建 飞船模型, 首先资源商店下载飞船模型&#xff0c…...

QT仪表盘小工具

头文件: /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE…...

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初,学习状态回顾 开稿时间:2024-1-23 归家百里去,飘雪送客迟。 搁笔日又久,一顾迷惘时。 我们饱含着过去的习惯,缺乏自我意识是毒药,反思和回顾是解药。 文章目录 2024年初,学习状态回顾一…...

计算机网络——网络层(3)

计算机网络——网络层(3) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)1 网络层——控制平面因特网中自治系统内部的路由选择总括考虑因素总结 ISP之间的路由选择:BGP考虑因素总结 SDN控制层面重要组件和功能总结 ICMP主要功能和特点…...

ROS2 学习笔记12:使用 colcon 构建软件包

ROS2 学习笔记12:使用 colcon 构建软件包 Background 背景Prerequisites 前提1 Install colcon2 Install ROS 2 Basics 基础1 Create a workspace2 Add some sources3 Source an underlay4 Build the workspace5 Run tests6 Source the environment7 Try a demo Cre…...

基于JAVA+SpringBoot+Vue的前后端分离的医院管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着计算机科学的迅猛…...

npm淘宝镜像过期解决办法

npm淘宝镜像过期解决办法 因为npm 官方镜像(registry.npmjs.org)在国内访问很慢,我们基本上都会选择切换到国内的一些 npm 镜像(淘宝镜像、腾讯云镜像等)。由于淘宝原来的镜像(registry.npm.taobao.org&am…...

Arduino 官网上下载和使用开发板

在 Arduino 官网上下载和使用开发板可以按照以下步骤进行: 打开浏览器,访问 Arduino 官网(https://www.arduino.cc/)。在官网首页,可以看到各种型号的 Arduino 开发板和相关产品。根据自己的需求选 择合适的开发板型号…...

k8s学习-DaemonSet和Job

1.1DaemonSet是什么 Deployment部署的副本Pod会分布在各个Node上,每个Node都可能运行好几个副本。DaemonSet的不同之处在于:每个Node上最多只能运行⼀个副本。DaemonSet的典型应用场景有: (1)在集群的每个节点上运⾏存…...

【开源】SpringBoot框架开发海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…...

Windows10更新失败 错误 0x80070643、KB5034441的解决方法之二

Windows10更新失败 错误 0x80070643、KB5034441 在知乎Windows10更新失败 错误 0x80070643、KB5034441的原因分析和几个解决方法 - 知乎 参考文章进行操作,更详细信息自己看上面链接。 我电脑的硬盘是mbr格式,而且没有划分恢复分区。 Microsoft Windo…...

SQL中LIMIT的简单用法

在SQL的世界里,有一位神秘而强大的限制者,它就是 LIMIT。今天,我们将深入探讨这个神秘的SQL关键字,揭开它的神秘面纱,让你能够更好地使用它来操控你的数据。 背景 首先,让我们了解一下为什么我们需要 LIM…...

canvas自定义扩展方法:文字自动换行

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…...

【2024全网最详细】Google 搜索命令终极指南

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 你是否尝试过使用 Google 搜索作为免费的 SEO …...

R-kknn包-类别插值可视化绘制

前面的推文我们介绍了使用scikit-learn结合分类散点数据,构建机器学习分类模型并将模型结果可视化展示,具体链接如下: 机器学习和可视化还能一起这样用?Python教你全搞定。今天这篇推文,我们就使用R语言的kknn包进行类…...

探究HMAC算法:消息认证与数据完整性的完美结合

Hash-based Message Authentication Code(基于哈希的消息认证码,简称HMAC)算法作为一种广泛应用的消息认证码(MAC)算法,在现代信息安全领域起着至关重要的作用。本文将从算法原理、优缺点、实际应用等方面&…...

10s 内得到一个干净、开箱即用的 Linux 系统

安装 使用官方脚本安装我的服务器不行 官方脚本 mkdir instantbox && cd $_ bash <(curl -sSL https://raw.githubusercontent.com/instantbox/instantbox/master/init.sh) 下面是我的完整安装过程 mkdir /opt/instantbox cd /opt/instantbox 1.脚本文件 (这个没…...

轮转数组[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个整数数组nums&#xff0c;将数组中的元素向右轮转k个位置&#xff0c;其中k是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...