首页 > 其他分享 >lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此

lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此

时间:2023-05-31 12:07:16浏览次数:34  
标签:文件 doc chunk LZ4 fdt fdx Chunk

默认情况下,Elasticsearch 用 JSON 字符串来表示文档主体保存在 _source 字段中。像其他保存的字段一样,_source 字段也会在写入硬盘前压缩。The _source is stored as a binary blob (which is compressed by Lucene with deflate or LZ4) 其实就是多个_source合并到一个chunk里进行LZ4压缩!

 对于Solr来说:Solr4.8.0里面使用的fdt和fdx的格式是lucene4.1的。为了提升压缩比,StoredFieldsFormat以16KB为单位对文档进行压缩,使用的压缩算法是LZ4,由于它更着眼于速度而不是压缩比,所以它能快速压缩以及解压。

 

fdx/fdt文件的格式。

  具体参考Lucene41StoredFieldsFormat.html (见Lucene4.2.0的docs)

 

fdt文件结构:

 

 

lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此_缓存

 

上图理解起来也不难,<Header>和PackedIntsVersion略过,我们重点关注<Chunk>,Chunk的中文意思是”大块”,我们可以理解为数据的存储区域。在内存中表现为缓存。一个Chunk由5个部分组成:DocBase表示当前的Chunk块的起始DocId;ChunkDocs表示当前Chunk中的doc个数;DocFieldCounts是一个数组,表示每个doc中Field的个数;DocLengths也是一个数组,表示每个doc占用byte的个数,即doc的长度;<CompressedDocs>即doc的内容,用LZ4算法压缩存储。FieldNumAndType是把FieldNumber和FieldType合并到一个VLong字段里面,整个<CompressedDocs>就是FieldNumAndType和Value的交替序列。

   fdx文件结构:

 

lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此_elasticsearch_02

fdx文件重点关注的是<Block>,一个Block由三个部分组成:BlockChunks表示当前Block中Chunk的个数;<DocBases>表示当前Block中每个Chunk的doc个数,可以看作一个数组;<StartPointers>表示当前Block中每个Chunk在fdt文件中的起始位置,其结构与<DocBases>相同。

尽管fdx/fdt文件只是Lucene的正向文件,并不是Lucene的核心。但是还是有干货的。在Lucene4中引入了LZ4算法对fdt的doc进行了实时压缩/解压。而且用SPI(Service Provider Interface)技术对架构进行了重构。

1.3    fdx/fdt文件的写入。

fdx/fdt文件的写入操作非常清晰。逻辑上都在CompressingStoredFieldsWriter类中完成,而CompressingStoredFieldsIndexWriter则作为其成员变量。其写入的顺序与上面的格式一致,只是有些名字不一样。在写入docs的过程中,用GrowableByteArrayDataOutput作为缓存,直到缓存满了,才flush到硬盘上去。用LZ4算法压缩就是在flush时处理的。(关于LZ4算法会在另外的博文中描述)

fdt文件的写入:

       fdt文件的基本单位是Chunk,这一点需要牢记。一个Chunk写入到文件中的代码如下:

lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此_缓存_03

       通过观察flush函数,我们会发现fdt文件的写入非常简单,就两句代码:

 

lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此_字段_04

 

前面一句代码记录整个chunk中的docBase(最小docID),numBufferedDocs(doc数量),numStoredFields(每个doc的Field个数),lengths(每个doc的长度),一共四种信息.在记录numStoredFields和lengths时,用PackedInts及其它的方式对内容进行了压缩。后面一句代码记录整个chunk中的doc的完整内容(用LZ4算法进行压缩).

标签:文件,doc,chunk,LZ4,fdt,fdx,Chunk
From: https://blog.51cto.com/u_11908275/6385785

相关文章

  • docker evel=error msg="error reading the kernel parameter net.ipv4.vs.expire_nod
    我使用的是dockerswarm-#报错evel=errormsg="errorreadingthekernelparameternet.ipv4.vs.expire_nodest_conn"error="open/proc/sys/net/ipv4/vs/expire_nodest_conn:nosuchfileordirectory"-#查看是否开启ip_vslsmod|grepip_vs==============......
  • dockerfile镜像私有仓库需要https登录验证改成http
    ERROR:failedtodorequest:Head"https://192.168.16.185:8088/v2/jenkins/python_common_api/manifests/base":http:servergaveHTTPresponsetoHTTPSclientDockerfile:1--------------------1|>>>FROM192.168.16.185:8088/jenkins/p......
  • Docker基本安装
    1.docker2.虚拟机和容器的区别①:虚拟机是借助于物理机的硬件进行硬件模拟,实现系统级别的隔离,每一台虚拟机模拟出硬件之后需要安装独立操作系统,然后再在操作系统上安装应用程序,容器是进程级别的隔离,通过虚拟化引擎在同一个操作系统上隔离出多个独立的进程,然后在独立资源管......
  • docker容器踩过的坑:在idea可以运行,放到tomcat出现异常
    1.docker里边安装tomcat,tomcat会自带jdk版本,使用也是默认的版本,要注意tomcat与是否与想要jdk版本的一致,在创建容器时就需要挂载jdk版本指令:dockerrun-id--name=c_tomcat-p8080:8080-v$PWD:/usr/local/tomcat/webapps-v/opt/jdk1.8.0_152:/opt/java/openjdktomcat ......
  • 3.安装常用软件与Dockerfile
    5.安装常用软件总体步骤搜索镜像拉取镜像查看镜像启动镜像停止容器删除容器5.1.Tomcat安装5.1.1.搜索镜像dockersearchtomcat5.1.2.拉取镜像最新版,这个版本有点问题,目前不建议使用dockerpulltomcat8.0版本dockerpullbillygoo/tomcat8-jdk85.1.3.查......
  • Docker CLI docker container cp常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • 如何在Mac、Windows和Docker上本地电脑上搭建AI人工智能绘画工具Stable Diffusion
    微信公众号:运维开发故事,作者:double冬一、概述目前,有诸如Midjourney等人工智能绘画网站可供大家来免费使用,但是由于是免费资源肯定会在机器性能和使用次数方面有所限制,因此如果能将人工智能绘画工具部署在本地运行就会突破机器性能和使用次数等方面的限制。可能所有人类画师都得发......
  • parquet文件格式——本质上是将多个rows作为一个chunk,同一个chunk里每一个单独的colum
    Parquet是Twitter贡献给开源社区的一个列数据存储格式,采用和Dremel相同的文件存储算法,支持树形结构存储和基于列的访问。ClouderaImpala也将使用Parquet作为底层的存储格式。在很多大数据的应用场景下面,比如电信行业,具有一定规则的数据,字段很多,但是每次查询仅仅针对其中少数的几个......
  • docker和compose总结
    dockerdocker的特性轻量级的环境隔离统一的封包和运行方式方式dockerhub是docker的镜像仓库官网,里面可以方便的查找镜像和对应的tagdocker是容器服务,里面运行的容器化的服务,容器里面装着我们的程序,它提供隔离的环境,提供统一的部署运行方式。docker在隔离的前......
  • CentOS通过yum安装Docker
    安装前准备CentOS版本要安装DockerEngine,你需要以下CentOS版本中的一个维护版本:CentOS7CentOS8(stream)CentOS9(stream)centos-extras仓库必须被启用。这个仓库默认是启用的,但如果你已经禁用了它,你需要重新启用它。删除旧版本旧版本的Docker以docker或docker-eng......