来点八股文(四) 数据检索ESOLAPCK和Calcite

news2024/11/15 5:46:53


如何解决深度分页问题?

  1. scoll 游标分页 使用的是快照,没法保证实时
  2. from+size 最差的实现,内存占用和时间都很差
  3. search_after 搜索上下文 通过记录自增id来查询,减少了内存占用

lucene如何实现倒排索引的?
FST + skiplist

  1. key/term dict的实现

两个前缀树.tip和.tim
.tip用于快速过滤和找到tim在的block
image.png

  1. postlist分成三个文件

.doc后缀文件:记录 Postings 的 docId 信息和 Term 的词频
.pay后缀文件:记录 Payload 信息和偏移量信息
.pos后缀文件:记录位置信息
文件结构都是下面这种表示,termFreqs中存储的是文档id和词频(压缩二元组),skipdata用于加速文档id的查找
image.png

ES集群的结构是怎样的?
image.png
image.png
index拆分shard和kafka的topic拆分partition一样的

ES的选主流程是什么样的?
bully算法
(1)参选人数需要过半,达到 quorum(多数)后就选出了临时的主。
(2)得票数需过半。某节点被选为主节点,必须判断加入它的节点数过半,才确认Master身份。解决第一个问题。
(3)当探测到节点离开事件时,必须判断当前节点数是否过半。如果达不到quorum,则放弃Master身份,重新加入集群。

Master节点的作用?
管理索引(创建索引、删除索引)、分配分片
维护元数据
管理集群节点状态
不负责数据写入和查询,比较轻量级

ES的写流程是怎么样的?image.png
上层写原理
发给随机协调节点 – 转发主分片 – 并行转发副分片
(1)客户端向NODE1(协调节点)发送写请求。
(2)NODE1使用文档ID来确定文档属于分片0,通过集群状态中的内容路由表信息获知分片0的主分片位于NODE3,因此请求被转发到NODE3上。
(3)NODE3上的主分片执行写操作。如果写入成功,则它将请求并行转发到NODE1和NODE2的副分片上,等待返回结果。当所有的副分片都报告成功,NODE3将向协调节点报告成功,协调节点再向客户端报告成功。
写一致性的默认策略是quorum(仲裁一致),即多数的分片(其中分片副本可以是主分片或副分片)在写入操作时处于可用状态。
translog的写入同步还是异步可以被控制。
image.png
底层写原理
预写日志 – 内存buffer缓冲区
写入的底层原理是什么?
(1)数据先写入 memory buffer,然后定时(默认每隔1s)将 memory buffer 中的数据写入一个新的 segment 文件中,并进入 Filesystem cache(同时清空 memory buffer),这个过程就叫做 refresh;ES 的近实时性:数据存在 memory buffer 时是搜索不到的,只有数据被 refresh 到 Filesystem cache 之后才能被搜索到(分两步猜测是为了减轻pdflush压力),而 refresh 是每秒一次, 所以称 es 是近实时的,可以通过手动调用 es 的 api 触发一次 refresh 操作,让数据马上可以被搜索到;
(2)由于 memory Buffer 和 Filesystem Cache 都是基于内存,假设服务器宕机,那么数据就会丢失,所以 ES 通过 translog 日志文件来保证数据的可靠性,在数据写入 memory buffer 的同时,将数据写入 translog 日志文件中,在机器宕机重启时,es 会自动读取 translog 日志文件中的数据,恢复到 memory buffer 和 Filesystem cache 中去;
(3)flush 操作:不断重复上面的步骤,translog 会变得越来越大,当 translog 文件默认每30分钟或者阈值超过 512M 时,就会触发 commit 操作,即 flush操作。

读流程 【读取是知道在哪个文档】
image.png
(1)客户端向NODE1发送读请求。
(2)NODE1使用文档ID来确定文档属于分片0,通过集群状态中的内容路由表信息获知分片0有三个副本数据,位于所有的三个节点中,此时它可以将请求发送到任意节点,这里它将请求转发到NODE2。
(3)NODE2将文档返回给 NODE1,NODE1将文档返回给客户端。NODE1作为协调节点,会将客户端请求轮询发送到集群的所有副本来实现负载均衡。

**ES检索的过程是怎样的? 【检索是不知道在哪个文档】1. Query 在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。
每个分片返回各自
优先队列中所有文档的 ID 和排序值 给协调节点,它合并这些值到自己的优先队列中来产生一个全局排序**后的结果列表。
2. Fetch 接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。

在高并发场景下,ES如何保证读写一致的?
(1)对于更新操作:可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖
每个文档都有一个_version 版本号,这个版本号在文档被改变时加一。Elasticsearch使用这个 _version 保证所有修改都被正确排序。当一个旧版本出现在新版本之后,它会被简单的忽略。
利用_version的这一优点确保数据不会因为修改冲突而丢失。比如指定文档的version来做更改。如果那个版本号不是现在的,我们的请求就失败了。
(2)对于写操作,一致性级别支持 quorum/one/all,默认为 quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。

  • one:要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行
  • all:要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作
  • quorum:默认的值,要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作

(3)对于读操作,可以设置 replication 为 sync(默认),这使得操作在主分片和副本分片都完成后才会返回;如果设置replication 为 async 时,也可以通过设置搜索请求参数_preference 为 primary 来查询主分片,确保文档是最新版本。
可以看到,ES采用了和Cassandra以及Dynamo一样的仲裁一致读写方案,参考DDIA,这种方案能够保证线性一致的读写,但是不能保证比较和更新的线性一致性。

倒排索引的结构?如何优化posting list?
倒排索引由key和posting list构成,posting list可以用很多结构实现,比如红黑树、跳表、链表等。
优化归并过程
posting list往往会用于归并过程(join),这里我们很容易想到spark的join策略:嵌套循环、排序归并和哈希归并。他们的复杂度分别是m*n,m+n和n(较大)。
因为posting list天生有序,所以这里主要的策略在于加速排序归并和哈希归并过程。
排序归并可以用跳表和红黑树,双指针相互二分查找将每次搜索的复杂度降低到logk。
Lucene和Elasticsearch就采用了这种方法。
同样,posting list也可以使用哈希表和位图来实现。
Roaring Bitmap
普通的哈希表和位图很简单,不再赘述。更广泛使用的是Roaring Bitmap(压缩位图)。
Roaring Bitmap简单来说,就是用高16位哈希到桶的编号,低16位再哈希到bitmap,这样如果元素稀疏的话,就能节省没有bitmap的桶的空间。
低16位桶的数量如果少于4096,那么bitmap就使用数组容器来节省空间,否则使用位图容器。
Roaring Bitmap的三种实现空间占用和数据大小的关系:RunContainer的编码是运行长度编码(RLE)
07b406ddbbb4614b8b86b566adcdb5eb.png

压缩

说一说常用的压缩方法

  1. 游程编码(RLC, Run Length Coding)
  2. 字典压缩 如哈夫曼编码
  3. 位图编码 (也可以当作字典压缩的一种,适用于基数较小的情况)
  4. 增量编码 (记录相邻行之间的差异)
  5. 比特打包 (缩短位数)

存储&索引

比较一下行存和列存的优缺点?
行存: 适合元组信息,适合复杂的业务型数据库(涉及多个字段);不适合对于部分列的扫描,不适合压缩
列存:减少io量,适合分析型数据库,压缩比更高

你做过spark,应该了解parquet和orc吧,说一下parquet和orc的存储方式?
parquet

  1. 按照大小切分成group,group按照列切分成chunk,chunk按照page切分(先水平,再垂直)

目的是为了并行计算

  1. 元信息包括: min/max,编码字典
  2. 使用层级编码嵌套结构

image.png
ORC
和parquet一样,分为file、stripe、row group三个级别,分别有自己的元信息
支持布隆过滤器,并且对索引和压缩做了优化。支持事务,不支持复杂嵌套

元信息为什么一般写在尾部而不是头部?

  1. 减少修改数据时的io,如果追加写需要修改元数据,那么就会造成更高的成本
  2. 减少读取数据时的io

说一说ck的存储方式?
主键索引
image.png
普通索引
image.png
分区键索引
image.png

codegen

你了解codegen吗?怎么做的?
一般gen的都是weld IR/LLVM IR/当前语言。spark使用janino
手写代码的生成过程分为两个步骤:

  1. 从父节点到子节点,递归调用 doProduce,生成框架
  2. 从子节点到父节点,递归调用 doConsume,向框架填充每一个操作符的运算逻辑

优化器

说说你都在calcite做了什么

  1. 常量折叠、算子消除
  2. 谓词下推、列裁剪、投影下推
  3. 关联子查询优化
  4. IKKBZ算法做RBO

向量化

单独复习
说说向量化有哪些方法
遮罩 重排 选择性加载 压缩 扩散

说说向量化是什么
基本的并行手段主要有三种:
(1) instruction-level parallelism (ILP) 指令并行 如超标量、流水线(在GPU中叫做流水线并行)
(2) thread-level parallelism (TLP) 多核并行 如openmp 和 pthread (在GPU中叫数据并行或者SIMT)
(3) vector-level parallelism 张量并行 如SIMD(在GPU中叫张量并行)

说说你看过的CK向量化代码

  1. memcpy 预取 对齐 循环展开(8次) 内存直写避免污染缓存
  2. pargma 使用omp/simd/vector自动向量化
  3. restrict 显式告诉编译器参数是内存中的不同位置

#pragma omp parallel

说说你在项目中怎么用的向量化

  1. 将8个字节压缩到1个字节中,使用shuffle将1个字节扩展到8个字节
  2. 计算两个地址之间有多少个0

怎么处理对齐?
先处理128位或者512位不对齐的部分,再处理剩下的部分

矩阵乘法怎么优化?

  1. 列主序
  2. 向量化

两个相同大小的矩阵,a[i][j] = a[i][j]怎么优化?

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

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

相关文章

GDAL——地理空间数据抽象库在VS2022下的编译

上图是GDAL在github上的首页截图,GDAL库本身是没法运行的(一开始想运行它看看,但后知后觉一个库单独怎么能运行呢哈哈哈哈哈哈)。编译成功后,会生成几个文件夹,里面有一些文件,把这些文件配置到合适的位置后&#xff0…

css-grid布局之美

一,grid布局概述 网格布局(Grid)是最强大的 CSS 布局方案。 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置…

游戏加速器推荐 网游加速器排行榜

游戏加速器推荐,玩游戏用什么加速器!我得给你推荐一款我常用的。首先呢,就是深度加速器,它针对目前手游网游的游戏加速效果特别棒,而且界面也很友好。 另外,还有深度加速器,这款加速器不仅支持国…

使用模版完成不同数据类型的数组的选择排序

目录 6.模版(167-263) 6.1函数模板 6.1.1函数模版注意事项 6.1.2函数模版案例--选择排序 1. 比较排序的基本概念 2. 决策树 3. 决策树的深度 4. 结论 5.选择排序示例: 6.模版(167-263) (项目先跳过) 模板不能直接使用,它只是一个框架. 模板不是万能的. 6.1函数模板…

HCIE还是CCIE?高级认证到底要怎么选?

HCIE与CCIE,作为网络技术领域的两大旗舰认证,一直是IT专业人士追求的目标。 它们不仅代表了个人技术能力的权威认可,更是职业生涯中的重要里程碑。 然而,面对这两个同为高级认证的金字招牌,许多人不禁要问:…

基于FPGA的数字信号处理(21)--超前进位加法器

目录 1、什么是超前进位加法器 2、CLA加法器的关键路径 3、CLA加法器的Verilog实现 4、CLA加法器的时序性能 5、总结 文章总目录点这里:《基于FPGA的数字信号处理》专栏的导航与说明 1、什么是超前进位加法器 在之前的文章,我们介绍了行波进位加法器…

安装linux系统的时候没有允许root用户远程登录,怎么修改?

1、进入/etc/ssh/sshd_config vim /etc/ssh/sshd_config /etc/ssh/sshd_config通常是 SSH 服务(Secure Shell)的配置文件。 SSH 是一种用于安全远程登录和执行命令的网络协议。在这个配置文件中,您可以设置诸如端口号、允许或拒绝的登录用户…

数据结构(5.4_1)——树的存储结构

树的逻辑结构 双亲表示法(顺序存储) 每个结点中保存指向双亲的“指针” #define MAX_TREE_SIZE 100//树中最多结点typedef struct {//树的结点定义int data;//数据元素int parent;//双亲位置域 }PTNode; typedef struct {//树的类型定义PTNode nodes[MAX_TREE_SIZE];//双亲表…

红外热成像手持终端:从建筑检测到野外搜救的全方位应用

红外热成像手持终端,凭借其独特的红外探测与夜视功能,广泛应用于多个关键领域。无论是军事侦察、消防救援中的夜间作业,还是电力巡检、野生动物观察等多样场景,其精准的红外热成像技术均能提供至关重要的实时数据,助力…

TrainingArguments 的ignore_data_skip解释

文章目录 0. 背景1. 官方解释2. 查看源码3. 验证4. 总结 0. 背景 在采用 HuggingFace 提供的 Transformers 库来训练模型时,如果出现模型训练中断的情况,此时我们希望断点接训,TraningArguments 有一个参数:resume_from_checkpoi…

都从哪里下载量产工具,我给大家推荐一下吧

就推荐量产部落!因为从事固态硬盘维修这行,而且我自己也喜欢DIY,所以我比较关注量产工具下载。 要说量产工具,就得从U盘和固态硬盘的兴衰开始说起,从2016年开始,U盘就在走下坡路了,U盘量产工具…

英特尔裁员、暂停分红和市场挑战

英特尔(INTC)近日宣布了一系列战略调整,以应对其面临的严峻挑战。这家总部位于加利福尼亚州圣克拉拉的芯片制造商计划裁员超过15%,并从第四季度起暂停派息,以重振其盈利能力。 股价暴跌与市值蒸发 英特尔的这一决定导…

找不到的软件资源,试试这个网站

0daydown是一个提供多种资源下载的网站,包括软件、电影、音乐和游戏等。该网站通常会转载其他0day站点或PT站点的内容,并以其丰富的资源和便捷的下载方式而闻名。此外,0daydown还收录了稀缺的0day软件,并提供百度网盘下载链接。 …

双 Token 三验证解决方案

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 问题分析 以往的项目大部分解决方案为单 token: 用户登录后,服务端颁发 jwt 令牌作为 token 返回每次请求,前端携带 token 访问,服务端解析 token 进行校验和…

serial---- vulnhub打靶

1.新建虚拟机,虚拟硬盘使用vulnhub下载提供的虚拟硬盘文件 2.打开虚拟机,扫描网段,确定IP(或者arp -a) 3.发现没有robots.txt,以及一些常见admin,www.zip目录文件,尝试扫目录 拿另一个工具扫一下看看多了一个 4.发现备…

凸优化学习之旅

目录标题 专业名词MM算法CCP算法:代码说明 SCA算法:连续松弛梯度投影算法 分支定界搜索法凸问题辨别OA算法λ-representationADMM算法代码说明 BCD算法BCD(Block Coordinate Descent)代码示例与ADMM的区别总结 2024年5月6日15:15:…

2024 年 5 款顶级的免费和付费 PDF 编辑器个人评测

PDF 为企业、学校或一般用途提供了一种共享各种信息的便捷方式。您可以在笔记本电脑和智能手机上轻松查看 PDF 文档。但大多数图片查看器和 PDF 阅读器不允许您编辑 PDF。因此,当您想要修改 PDF 文件中的图像或文本时,您需要一个PDF 编辑器。 似乎没有太…

springboot高校勤工俭学平台-计算机毕业设计源码66824

摘 要 本研究基于Spring Boot企业框架,设计并实现了一款高校勤工俭学平台,包括首页、通知公告、新闻通知和岗位信息等功能模块。该平台旨在为高校学生提供便捷的勤工俭学信息发布与查询服务,促进校园内部劳动力资源的充分利用和高效管理。在研…

MSTR:智慧无处不在,可信任 AI 的崛起

|| 前言 商业智能(BI)的力量在于利用数据得出可行的洞察,从而做出更明智的数据驱动决策。从提升内部产品质量、运营和资源利用,到简化公共服务,BI应用非常多样化又具有影响力。 引入人工智能(AI&#xff…

Vue+SpringBoot+SpringSecurity项目对于跨域的深度理解

随记(可跳过):CodeMan在熬夜肝一周SpringSecurity学习的时候,总是报错,于是冥思苦想,选择了询问Ai,但是不论怎么设置权限,接口仍然无法按所设想的权限被调用,于是在今天的…