从一到无穷大 #34 从Columnar Storage Formats评估到时序存储格式的设计权衡

news2024/9/22 5:23:50

在这里插入图片描述本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。

文章目录

  • 引言
  • Parquet / ORC
    • 功能与结构对比
    • 差异
    • Indexes and Filters
    • 压缩影响
  • TsFile
  • 总结

引言

随着 Parquet,ORC,TsFile等开源存储格式的发展,各家时序厂商的压缩比不再是核心竞争力,虽然仍旧有部分数据库厂商仍旧选择自定义存储格式,比如阿里云Lindorm,腾讯云CTSDBi,Tdengine等,其旨在在部分场景达到优于开源存储格式的压缩比和性能,但是不得承认在大多数领域开源存储格式的能力已经足够强大,足以替代自研存储格式。

本篇文章从[3],[11]入手,分析Parquet,ORC,TsFile的数据格式和索引格式,并通过论文的实验来观察其更适合哪些场景,最后从时序数据库场景入手,推断在设计权衡下现有的存储格式是否可以满足多样化的时序场景(Metric,logging,traceing),是否需要更多的额外索引,是否需要使用开源格式本身提供的辅助结构与功能。

Parquet / ORC

功能与结构对比

在这里插入图片描述
在这里插入图片描述

  1. 在格式效率方面,Parquet 和 ORC 没有明显的优胜者。Parquet 因其积极的字典编码而在文件大小上略胜一筹。此外,Parquet 的整数编码算法更简单,因此列解码速度更快,而 ORC 由于其 zone maps 的粒度更细,因此在选择剪枝方面更有效。
  2. 现实世界数据集中的大多数列NDV(number of distinct values)值较低,非常适合字典编码。因此,整数编码算法(即压缩字典编码)的效率对文件的大小和解码速度至关重要。
  3. 存储设备的速度越来越快,成本越来越低,这意味着使用更快的解码方案来降低计算成本,比追求更积极的压缩来节省 I/O 带宽要好。不应默认使用 general-purpose block compression,因为节省带宽并不能证明解压缩开销的合理性。
  4. Parquet 和 ORC 为辅助数据结构(如zone maps、Bloom 过滤器)提供了简单的支持。随着瓶颈从存储转移到计算,有机会将更复杂的结构和预计算结果嵌入格式中,以更少的计算量换取更便宜的空间。

差异

这一节论文描述的很清楚,我从中提取出我比较感兴趣的几点:

  1. Format Layout:均为行列混存,并存在多个row group用于并行读取,不过将逻辑块映射到物理块的逻辑不通,Parquet使用行数,默认1024*1024。而ORC使用固定的存储大小,默认64MB。
  2. Block Compression:块压缩至少在2024.8最新版本的Arrow CPP实现中不是默认开启的,论文描述有点小问题;块压缩在Parquet中允许用户自己指定,ORC则没有;块压缩对于查询性能存在较大影响,只有在确定访问频率极低的情况下才有较好的综合收益。

Indexes and Filters

Parquet和ORC均包含zone mapsBloom Filters

  1. zone maps:Parquet和ORC均包含文件级别和Row Group级别的zone maps,且文件级别的zone maps(Parquet叫Page index)存储在Footer前,可以用最小的IO知道文件是否应该被跳过。
  2. Bloom Filters are useful only for point queries。Parquet中使用了SBBF,其拥有更好的缓存性能和SIMD支持[10]

文中还给出了其他索引的相关研究,随着存储不再是瓶颈,使用更多的索引结构可以带来更优秀的查询性能,这些引用还没来得及看,后续补上

  1. column indexes: [4][5][6]
  2. range filters: [7][8]

压缩影响

文中认为 NDV Ratio,Null Ratio,Value Range,Sortedness,Skew Pattern是影响压缩比的最重要因素,但是事实上不同的角度有不同的研究结论。

还记得两年前的文章[2],在无损压缩的前提下,总结了影响时间序列数据压缩比,编码性能的因素,评估了各种压缩算法在不同因素下定性分析。在Benchmark上使用多组真实世界中有明显特征的数据和自动生成的基于不同的影响因素的数字和文本数据组成数据集,对比了各种压缩算法在不同场景下压缩比,insert time,select time上的差异。

在文章中IoTDB最终选择了TS_2DIFF作为实际的压缩算法,这种算法下, 值的方差以及值之间增量方差(delta variance)越小,或者增量差值平均数(delta mean values)越大的情况下表现优异。

请添加图片描述
以本文的角度看,在不同的数据特征下基本上差别不是非常大,而且Parquet允许列级别修改编码算法,所以其实这些差距都是可以拉平的。

TsFile

请添加图片描述
请添加图片描述
在这里插入图片描述

在这里插入图片描述
一图胜千言。

TsFile和Parquet/ORC的设计有着本质的区别。TsFile存在时间线概念

虽然我一直认为时间线膨胀问题本身是一个伪命题,因为这个事情是站在时间线的角度讨论的,本质原因在于上一代时序存储的场景并不极端(设备,实例较少),为了查询的高效会在时间线级别建立索引,然而随着时代的发展,时间线逐渐膨胀,此时要做的事情是去除时间线概念,让多个时间线数据存储在一个Page中,去除膨胀的索引(倒排索引,存储文件中的索引)。

而TsFile是在用上一个时代的思路解决问题。不考虑TsFile引入的自研压缩算法,原则上TsFile和Influxdb的压缩级别是在一个量级(排除TSI和Series File模块)。

不可否认这种存储格式在时间线较少的情况下却是会存在优势,但是优势的原因是同一时间线的数据存储在一起,利用数据的各种相似性压缩比较高,问题是Parquet中相同时间线的数据也可以存储在一起,虽然Parquet的编码/压缩算法很难增加特化算法,但是现有的基础算法以及足够优秀。

我们通过一个访问路径来更加了解TsFile:
请添加图片描述

  1. Series Index:分两层树,第一层从数据模型中的root到device node,称为密集索引;第二层从传感器索引到TSM
  2. Chunk index:包含两部分,第一部分称为TSM,包含相应序列的名称和数据类型,以及整个文件中有关时间序列的综合统计信息;第二部分由一个或多个chunk meta组成,记录每个Chunk元数据存储统计信息和偏移量
  3. Chunk Group:由TSM定位到数据块Chunk,并通过Page Header可以过滤部分页。

请添加图片描述
来看下TsFile在其擅长的领域和Parquet的对比。

其实看到这里就可以下结论TsFile肯定是不适合普适性的时序数据库的,没有IotDB的关系老老实实用Parquet就好了

因为IotDB基本无法用在Metric,Logging,Traceing领域,其所有的设计都是针对于Iot领域的。其实肯定也是不适合高时间线。举个简单的例子,假设业务一分钟上报一次,时间线爆炸,memtable的写入基本在200ms就要下刷,这个时候tsfile每个时间线只有一条数据,可预期的压缩比会非常非常差。

在这里插入图片描述
基本可以认为influxdb和Tsfile的压缩比在一个级别,用同样的数据集对比Parquet和Influxdb,涉及保密,详细的列无法展示,只能给出压缩比的对比,如上所示,大部分场景下Parquet还是存在优势的。

当然这是在influxdb全索引,Parquet:

  1. 未开启页面压缩
  2. 未开启Page index / Offset index
  3. 未开启 Split Block Bloom filters (SBBF)
  4. 未调整压缩级别
  5. 未调整列级别自定义编码(默认RLE_DICTIONARY)

总结

基本上以目前的实践看,高时间线行列混存,低时间线纯列存,并建立全量倒排索引是最佳实践。双引擎,甚至多引擎是必不可少的。

这是引擎不同的查询方式在不同的数据排列下查询性能有倍级别的差异,这可以会出现未来大量不同的细分场景都可以有不同的引擎数据排列格式,这其实也是我们现在的发展路线。

当然以场景的不同,比如时间间隔的不同是否选择共享时间戳,稀疏索引,时间索引,物化视图,降采样,Router Key,各级缓存等等其他的优化都是另外一码事了。

而且以我们的需求看,存储不是瓶颈,我们更需要高性能的查询,所以Parquet的Page index和布隆过滤器一定会开启的,而且会随着需求不同加入自研的索引结构。

influxdb和基于开源文件格式还有一点巨大的差异,即索引方式:

  1. influxdb因为shard是一个独立引擎,一般配置时间较长(1d),可以认为先试粗粒度时间过滤,然后才是索引过滤,这就需要大量的索引来增加数据定位能力,否则会存在很多的无效IO,因为索引过滤后还需要过滤时间。本质是索引粒度太大。
  2. 而使用开源存储格式一般索引是文件级别,而一个文件负责的时间范围很小,索引的粒度也很小。先是时间过滤,再是索引过滤。

参考:

  1. PAX:一个 Cache 友好高效的行列混存方案
  2. Time Series Data Encoding for Efficient Storage: A Comparative Analysis in Apache IoTDB vldb2022
  3. An Empirical Evaluation of Columnar Storage Formats vldb2023
  4. Column sketches: A scan accelerator for rapid and robust predicate evaluation
  5. Bitweaving: Fast scans for main memory data processing
  6. Column imprints: a secondary index structure
  7. SNARF: a learning-enhanced range filter
  8. Surf: Practical range query filtering with fast succinct tries.
  9. Parquet doc
  10. Querying Parquet with Millisecond Latency
  11. Apache TsFile: An IoT-native Time Series File Format vldb2024

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

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

相关文章

使用 Milvus Lite、Llama3 和 LlamaIndex 搭建 RAG 应用

大语言模型(LLM)已经展示出与人类交互并生成文本响应的卓越能力。这些模型可以执行各种自然语言任务,如翻译、概括、代码生成和信息检索等。 为完成这些任务,LLM 需要基于海量数据进行预训练。在这个过程中,LLM 基于给…

捷达千里江山首发亮相,捷达品牌2024成都车展继续宠粉不停

2024年8月30日,捷达品牌携新车捷达千里江山惊艳亮相2024成都国际车展,并在五周年之际,发布幸福包油计划等宠粉福利,号召用户打卡千里江山,奔赴美好。与此同时,全新捷达VS5/VS7五周年纪念版车型进一步降低了…

基于Java+SpringBoot+Vue的汽车销售网站

基于JavaSpringBootVue的汽车销售网站 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅 某信 gzh 搜索【智能编程小助手】获取项…

Kevin‘s notes about Qt---Episode 3 在界面中修改程序参数Demo

Demo 效果 实现一个加法器,在输入框中分别填入a和b的值,点击“calculate”按钮,在sum处显示a+b的结果。 整体结构 我自己先写了一个模板用于测试从文本框获取输入数据,整个工程的结构如下: 说明: func_myself.h和func_myself.cpp是我自己创建的头文件和源文件,用于定…

江协科技stm32————11-2 W25Q64简介

W25Q64简介 存储容量(24位地址)在分配地址时需要3个字节,最多16MByte 硬件电路 HOLD:相当于SPI进了一次中断,保持原来的数据 括号内的IO0、IO1……用于双重和四重SPI 框图 右上角首先将8Mb的存储空间以64kb的大小分为…

创新大赛决赛:如何让你的项目更上一层楼?

创新大赛决赛:如何让你的项目更上一层楼? 前言突出项目的核心价值指导老师的辅导作用制作优秀的PPT演讲和答辩的准备利用数据和案例增强说服力模拟答辩的重要性总结结语 前言 在当今这个快速变化的时代,创新不仅是推动社会进步的动力&#xf…

R语言 | 文件读取

一、文件读取 -scan()函数 scan(file “”, what double(), nmax -1, n -1, sep “ ”),file" " 的双引号里写文件地址,what写读入的数据类型,如果文件有好几种类型,可以啥也不写(what" "&…

数据结构与算法——Java实现 3.二分查找——Java版

放下不切实际的幻想,放下无法更改的过去,行云流水,任其行之 —— 24.8.31 一、二分查找——Java基础版 Java中的API——Arrays.binarySearch(数组,目标值) 返回的结果是插入点的位置 若在目标数组中找不到元素,则返…

折叠cell的学习

折叠cell 文章目录 折叠cell前言示例代码部分实现思路核心内容 前言 笔者在暑假的3GShare的项目中就写了有关折叠cell的内容,这里笔者重新讲一下相关内容。 示例 这里先给出效果图,这里是我们的折叠cell的最后的实现效果,下面来讲解一下相关代…

linux 云主机 pip 安装配置 letsencrypt certbot 为多个域名生成免费 https 证书实录

本文记录了我在华为云 EulerOS linux 云主机使用 python pip 方式安装配置 Let’s Encrypt certbot, 并为我的网站的多个域名生成免费 https 证书的整个过程, 包括 python 环境配置, 下载 certbot 及 certbot-nginx, 一次性生成多个域名的证书及注意事项, 以及最后配置 certbot…

k3s中使用GPU资源

前提是已经安装了nvidia驱动 一、安装nvidia-container-toolkit(推荐) #复制一份docker配置文件,以防被覆盖 cp /etc/docker/daemon.json /etc/docker/daemon.json.bak #安装NVIDIA Container Toolkitapt-get install nvidia-container-toolkit二、配置…

Python 数据分析笔记— Numpy 基本操作(上)

文章目录 学习内容:一、什么是数组、矩阵二、创建与访问数组三、矩阵基本操作 学习内容: 一、什么是数组、矩阵 数组(Array):是有序的元素序列,可以是一维、二维、多维。 array1 [1,2,3] 或[a, b, c, d…

如何通过住宅代理进行高效SSL检查

引言 什么是SSL检查?有哪些内容? 为什么要使用SSL检查? SSL检查是如何进行的? 总结 引言 在现代互联网环境中,SSL/TLS协议已成为确保网络通信安全的基石。随着网络攻击手段的不断演进,仅仅依赖于基础的…

[Leetcode 47][Medium]-全排列 II-回溯(全排列问题)

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 和上一道Leetcode46相比,有变化的地方是要排除重复组合的情况。那么在组合问题中去除重复组合的方法是先对数组进行排序,然后在回溯函数中判断当前元素与上一个元素是否相同,若相同…

Kotaemon:开源的RAG UI

检索增强生成 (RAG) 已成为一种改变游戏规则的方法,可增强大型语言模型的功能。Kotaemon 是由 Cinnamon 开发的开源项目,它站在这项创新的最前沿,提供了一个简洁、可定制且功能丰富的基于 RAG 的用户界面,用于与文档聊天。 Kotae…

【再回顾面向对象】,关键字Satic、final

再回顾面对对象 object:所有类的祖先,所有类的方法 GC:垃圾回收站 一般不会回收对象——Car c new Car(); toString() Hashchde要跟地址对应 尽量不要自己产生跟指针不一样,指针是直接指向地址像是数组的索引找的时候可能会有…

AcWing 902. 最短编辑距离

视频讲解&#xff1a; 【E07 线性DP 编辑距离】 两套代码的字符串存储数组都是从1开始存储的&#xff01;&#xff01;&#xff01;&#xff01; 硬套公式&#xff1a; #include<iostream> #include<algorithm> const int N 1010; using namespace std; int …

文心快码前端工程师观点分享:人机协同新模式的探索之路(一)

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站1…

mysql基础练习题 1082.销售分析1 (力扣)

1082.编写解决方案&#xff0c;找出总销售额最高的销售者&#xff0c;如果有并列的&#xff0c;就都展示出来。 题目链接&#xff1a; https://leetcode.cn/problems/sales-analysis-i/description/ 建表插入数据&#xff1a; Create table If Not Exists Product (product…

[数据集][目标检测]玉米病害检测数据集VOC+YOLO格式6000张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6000 标注数量(xml文件个数)&#xff1a;6000 标注数量(txt文件个数)&#xff1a;6000 标注…