Presto(OpenLookeng)之BloomFilter索引优化代码走读

news2025/1/10 21:15:09

一. 前言

        本文计划通过走读代码来理解Presto(其实是OpenLookeng)中BloomFilter索引的建立以及Presto中利用BloomFilter索引对查询进行优化的执行流程。OpenLookeng BloomFilter索引的基本资料可以参考官网介绍:openLooKeng documentation。

二. BloomFilterIndex

       BloomFilter原理相关的资料网上很多,本章不重复叙述。本章主要简述Presto中BloomFilter的几个重要接口,因为BloomFilter的几个接口是Presto中整个BloomFilter索引优化的核心所在。理解BloomFilter对于理解三、四章节有较大的帮助。

         BloomFilter最只要的接口主要有2个,一个是add接口,一个是test接口。add接口用于往BloomFilter的二进制池中添加数据,test接口用于测试数据是否存在。

      Presto中创建BloomFilter索引就是利用对索引列的所有数据调用一遍add接口构建BloomFilter BitSet,然后在BloomFilter序列化发hdfs上。在查询的时候先发序列化成BloomFilter,然后使用Bloom索引test接口对Split中是否有匹配数据进行测试,如果split中没有匹配数据,则将整个split裁剪掉。

三. 创建BloomFilter索引代码走读

        创建 BloomFilter索引是在CreateIndexOperator的算子中实现的。其数据入口为addInput方法,执行流程为

addInput
    values.computeIfAbsent   // 将tableScan的数据保存起来
        // 一个tale的文件将产生一个索引文件
        levelWriter.computeIfAbsent(filePath, getIndexWriter)
             levelWriter.get(filePath).addData(values)
                 // indexPages的key值为stripe偏移,value为一个HashMap,
                 // HashMap的key值为索引列名称,value为索引列的所有的数据
                 indexPages.get(stripeOffset)...add(values.getValue())  
                      // stripe的所有数据都已经收到
                      if (pageCountExpected.get(stripeOffset).get() == 0) {
                          persistStripe
                              index.addValues
                                  BloomIndex.addValues
                                      getFilter().add     //调用了第二章节的add接口
                                          // 将BloomFilter bitsets数据序列化后保存
                                          // 到临时文件中  
                                          LOCAL_FS_CLIENT.newOutputStream 
                                              index.serialize(os) 
                               
                        }

    当所有page都处理完毕时候,会调用到finish接口将本地文件物化到hdfs上:

finish
    entry.getValue().persist   // getValue()的值为FileIndexWriter
       // 将索引数据从本地文件搬迁到hdfs
       IndexServiceUtils.writeToHdfs(LOCAL_FS_CLIENT, fs, tmpPath, tarPath)

四. 利用BloomFilter索引进行查询优化

       要想使用BloomFilter进行优化,首先需要将第三章节序列化物化到hdfs上的索引文件反序列化成BloomFilter,其代码执行流程如下所示,入口为IndexCache中的executor.scheduleAtFixedRate定时器:

cache.get(filterKey)
   IndexCacheLoader.loadSplitIndex
      indexClient.readSplitIndex
         readIndexMap
            index.deserialize(new CloseShieldInputStream(i))  // 反序列化章节三中序列化后的索引文件

         构造出BloomFilter后,便可以利用where 条件 + BloomFilter进行split过滤。比如where id = 1,Presto会利用每个split所对应的BloomFilter测试一下该split中id中是否包含数值1,如果不包含,则将整个split裁剪掉,如下为其执行流程:

filterUsingForwardIndex
   inputSplits.parallelStream().filter
       indexCache.getIndices   // 获取到反序列化的索引
           indexerManager.getIndexFilter(allIndices).matches(expression)
               HeuristicIndexFilter.matches
                  indexMetadata.getIndex().matches
                      BloomIndex.matches
                         getFilter().test   // 最终调用章节二所示的test接口进行split过滤

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

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

相关文章

MacOS安装PyAudio

brew install portaudio pip install pyaudio docs:https://people.csail.mit.edu/hubert/pyaudio/docs/ pyaudio对象的open()方法: rate:取样频率channels:声道数format:取样值的量化格式 (paFloat32, paInt32, pa…

Node.js Event Loop 的三大常见理解误区和正确概念辨析

Node.js Event loop 监控器。高的 frequency 和低的持续时间是最理想的 event loop 状态。 上图显示三点半到五点半之间,event loop 的 frequency 骤降,然后 duration 居高不下。 Node.js 是一个基于事件的平台。 这意味着在 Node 中发生的一切都是对…

Windows无法读取驱动器中的光盘

一. 问题 在网上搜索了很多方法来解决下图的问题,一直失败。浪费了很多时间。后来发现,网上的方案可能恰恰是相反的思路。所以,留下个笔记吧。 二. 方法 1.打开本地服务管理器。按键盘的”WinR"组合键 打开“运行”窗口。输入“Serv…

汽车美容店会员管理系统开发步骤_分享会员系统小程序的优势

洗车店/汽车维修保养带店如何打开线上市场,获得更多目标用户呢? 除了服务的内容足够专业、优质以外,引入会员系统小程序就是关键一步。 汽修店为什么要做会员系统小程序?来看看行业现状: 1.竞争激烈:到处都…

Spring Boot与Web开发

Spring Boot与Web开发 SpringMVC快速使用 1.基于restful http接口 的CURD 2.调用rest http接口 通过RestTemplate调用 3.通过postman调用 通过MockMvc测试 4.通过swagger调用 添加依赖 添加swagger配置类 注意:访问的地址是:http://localhost:80…

【Java基础篇】基础知识易错集锦

在学习的路上,我们只记得学习新的知识,却忽略了一切新知识都是在旧知识的基础上;努力奔跑的过程中,也要记得常回头看看; 题目展示: 解析: abstract是抽象的意思,在java中&#xff0…

Python爬虫实战,requests+pyecharts模块,Python实现新冠疫情数据可视化(附源码)

前言 今天给大家介绍的是Python爬取新冠疫情数据并实现数据可视化,在这里给需要的小伙伴们代码,并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本数据爬取的…

牛客网Mysql题目-SQL进阶篇 SQL 126-155

前言 这篇是进阶sql题目的记录,由于上一篇文章已经写将近一万字,有点长,就把剩下的再开一篇,免得总是重新发布 SQL126 平均活跃天数和月活人数 本题目要求统计,并且是多行,就需要使用group by查询 首先需…

kafka可靠性保证

1、概念 创建Topic的时候可以指定--replication-factor 3 ,表示分区的副本数,不要超过broker的数量。Leader是负责读写的节点,而其他副本则是Follower。Producer只把消息发送到Leader,Follower定期地到Leader上Pull数据。ISR是Le…

基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

[附源码]计算机毕业设计的家政服务平台Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Linux系统(Centos7)了解DNS服务

配置与管理DNS服务器 项目导入 某高校组建了校园网,为了使校园网中的计算机简单快捷地访问本地网络及Intemet上的资源,需要在校园网中架设 DNS 务器,用来实现将域名转换成IP地址的功能。在完成该项目之前,首先应当确定网络中D…

基于多目标优化算法的电力系统分析(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🎉作者研究:🏅🏅🏅主要研究方向是电力系统和智能算法、机器学…

Volatile关键字的作用

专栏链接:多线程相关知识详解 编译器有优化功能,会对写好的代码进行优化,在多线程里面可能就会对代码的执行逻辑进行修改,就可能会产生bug 例如下面这个代码: import java.util.Scanner;class Counter{public static int count 0; }public class Demo {public static void …

RK3568平台开发系列讲解(系统优化篇)系统卡顿了怎么办

🚀返回专栏总目录 文章目录 一、卡顿问题分析指标二、Android 卡顿排查工具沉淀、分享、成长,让自己和他人都能有所收获!😄 📢对用户来说,内存占用高、耗费电量、耗费流量可能不容易被发现,但是用户对卡顿特别敏感,很容易直观感受到。另一方面,对于开发者来说,卡顿…

windows vs2019 编译glib2

1、安装meson pip install meson 确认是否安装成功,命令行输入: meson --version 0.60.0 2,安装ninja 先下载ninja:Releases ninja-build/ninja GitHub 加压后,把ninja.exe所在目录加入环境变量 确认是否安装成功&#xf…

英文外链怎么做效果好?

google英文外链怎么做效果好? 答案是:建设GPB外链 正确的外链建设行为追求的是高质量的外链。 对于高质量外链的定义:优质的外链是来自搜索引擎和搜索者都信任的权威网站,网站越值得信赖、越权威,链接质量就越好 网…

【ElementUI】树形控件 el-tree

目录 公共参数 基础用法 最后一层不可选择 思路一:第三层设置disable 思路二:利用样式隐藏掉第三层的选框 最后一层展示复选框 转载请注明:宾果的救星的博客_CSDN博客 公共参数 treeContent:[{name: 1,id: 1,level: 1,children: [{na…

HPPH偶联金属/小分子抑制剂/上转换纳米颗粒/点击化学/核壳磁性纳米粒子的方法

小编这里分享了科研内容HPPH偶联金属/小分子抑制剂/上转换纳米颗粒/点击化学/核壳磁性纳米粒子的方法,来看! 点击输入图片描述(最多30字) 制备光敏剂HPPH的方法: (1) 叶绿素-a的提取;(2)脱镁叶绿酸-a甲酯的制备;(3)焦…

ADI Blackfin DSP处理器-BF533的开发详解20:4.3寸LCD液晶屏的设计与应用(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP-EDU-BF53x 开发板上的液晶屏为 480*272 尺寸真彩 TFT 液晶屏,其型号为 WXCAT43-TG3#001R。 WXCAT43-TG3#001R 为 24B…