山大软工实践hive(12)-逻辑优化过程中的六种基础接口的作用与关系的梳理

《Hive、Spark、Presto SQL 输入输出表解析》 Hive SQL 解析 通过阅读Hive源码,Hive 通过 ParseDriver.parse() 将 SQL 解析成 AST 树 AST 树描述了 SQL 的各种操作,解析 AST 树就可以获得输入输出表信息 NodeProcessor 接口提供了一个 process 方法,在该方法中,对 AST树 进行深度优先遍历。通过 ASTNode 的 Token 判断当前节点类型,当遇到输入表节点和输出表节点时,解析对应的 ASTNode 获取表名 以下是一些与输入输出表相关的 Token,以及对应的 SQL 阅读详情

2021SC@SDUSC

山大软工实践hive(12)-逻辑优化过程中的六种基础接口的作用与关系的梳理

目的

这一次梳理一下各大接口之间的关系,正好它们都在 package org.apache.hadoop.hive.ql.lib;
在这里插入图片描述
共六种,当然实际结构的交互不止这些接口

Node

在这里插入图片描述
它是DAG算子结构的基础,关系是算子继承Operator,Operator实现Node
它要求实现两个方法以达到:能够遍历出DAG的结构,以及识别每个Node是什么种类
它是数据结构的骨架

它的注释上,更倾向于描述它在逻辑优化上的用处:它需要实现的方法让Dispatcher和Walker调用

另外,在了解过程中,有一个不像算子的东西继承了Node,它是ExprNodeDesc,在优化器里表现为predicate的类型,可以认为是一种储存语句信息的类型
在这里插入图片描述
关于它在类机构上的位置,比如FIL算子类上,FilterDesc里就会储存ExprNodeDesc类型的变量
在这里插入图片描述
另外这些Desc有统一的接口
在这里插入图片描述
所以这一部分可以认为是,不同的算子实现不同的Operator,Operator的不同之处体现于它的泛型,这些Desc会储存ExprNodeDesc的变量,它关于着算子对应的语句(比如where id=3)

Rule

在这里插入图片描述
它被用于dispatch过程
它必须要实现两个方法,cost用于计算开销,getName没什么用,或许能被用于Debug

实现这接口的类很少
在这里插入图片描述
而我接触过的优化器用的都是RuleRegExp
在这里插入图片描述
而RuleRegExp是优化器transform方法里很早就会用到的类型,它的规则明显地区分了各优化器
关于它的规则长啥样:

  1. 输入Name如R1对应它的名字,也是getName()返回的东西
  2. 输入正则表达式一样的规则如“FIL%”,“TS%.*RS%”来匹配不同的算子结构,只有DAG,准确的说是,dispatch时传入的栈中有能匹配上的结构,其中%只是每个算子后必加的符号,除了分割算子没有其他意义
  3. cost方法算的是匹配的字符串长度,而不是算子链长度,所以怀疑算子名字的长度本身带有开销的意味

下面是找到的带有正则的规则
在这里插入图片描述

GraphWalker

在这里插入图片描述
添加完规则后,会先声明Dispatcher,但下一步运行的是Walker的方法
接口方法只有startWalking:用于启动对DAG的walk

但是实际上,所有Walker都继承DefaultGraphWalker,更多的实现在这个类里
在这里插入图片描述
它有默认的一系列方法:

  1. 初始化:传入的参数有Dispatcher,它需要保存这个,才能在walk到一个正确的点后进行dispatch;然后初始化自己的栈和队列,栈是储存walk过程中的路径,并且传入Dispatcher,队列记录了被dispatch节点的先后顺序。另外还有retMap,用于储存各个节点的dispatch后的信息
  2. startWalking:启动walk,从传入的头节点集合一个一个拿出来启动walk。。。
  3. walk:怎样对DAG上的节点dispatch,默认的方法是所有子节点先被dispatch,栈存的是从头结点到这个字节点的一条路径;其他的Walker可能会有不同的策略如优先父节点,并且栈存的节点的次序也可能不同。这个方法是最有可能改动的
  4. dispatch与dispatchAndReturn:总之就是开始调用dispatcher的方法了
  5. 其他:略

Dispatcher

在这里插入图片描述
需要实现dispatch方法:它用于判断一个算子能不能被优化,如何被优化

用DefaultRuleDispatcher举例
在这里插入图片描述
它的流程是:
对一个算子,找到它匹配的所有规则(Rule)里的cost最小规则,如果不存在,则用默认的NodeProcessor(优化器输入),反之则用规则对应的优化器(储存在一个map里),对node进行process

另外,翻了一些其他的Dispatcher,他们的dispatch方法很不相同

NodeProcessor

在这里插入图片描述
process:用于执行的算子的逻辑优化,也是逻辑优化过程中对语句产生真正的修改的地方
关于怎么使用,会在开始时记录一个 map<Rule,Processor>,每种Rule对应一种Processor,并且在后面初始化dispatcher时还会传入一个默认的Processor

这个类的实现很多,各种内部类,各种单独的子方法,甚至有的会在方法里又进行一次walk,再起进行一遍优化流程
目前我看的两个优化器里,相同的地方是:都会从算子拿出旧的predicate,然后对其修改(也可能不改),然后新的predicate放回去,并记录在retMap里

下面是一个processor的实现,它是PointLookUpOptimizer的内部类,可以看见它对predicate的修改
在这里插入图片描述
这个processor的子方法,它又walk了,并且规则对应另一个processor
在这里插入图片描述
另一个processor,也是这个类的内部类,很长,是真正对语句修改的地方
在这里插入图片描述

NodeProcessorCtx

在这里插入图片描述
这个是在找lib包时才发现的,之前对这个没有印象,甚至可能完全没见过
另外,这上面有一大堆注释,不过是和什么许可证有关
感觉也是个存各种信息、变量的地方,之前看优化器有查到过一个相关的类,注释是处理常量传播时的上下文在这里插入图片描述

但凡包含Context(ctx)的类,我认为是存的与某流程相关的环境:各种变量,boolean,阈值,等等

总结

这一次梳理了各个接口的关系,也变相地梳理了优化器的流程

Ragflow技术栈分析及二次开发指南 Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发 阅读详情

相关推荐

ray.tune调参学习笔记0:调参基本流程

本篇总结python中使用tune调参的整体流程

Mr_111000的专栏 2623

[一起学Hive]之十九-使用Hive API分析HQL的执行计划、Job数量和表的血缘关系

关键字:Hive HQL Job数量、Hive执行计划、Hive LineageInfo 本文介绍使用Hive的API获取一条HQL的最终执行计划,从而获取这条HQL的Job数量,另外,介绍使用API分析一条HQL中所包含的输入表和输出表。这些信息在做元数据管理和Hive表的血缘分析时候很有用。 Hive在执行一条HQL的时候,会经过以下步骤: 语法解析:Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象 语法树AST Tree; 语义解析:遍历AST Tree,抽象...

u011250186的博客 1527

MATLAB实战:四桥臂逆变器3D-SVPWM调制算法仿真全流程(附代码)

本文提供了一份完整的MATLAB/Simulink实战指南,详细解析了四桥臂逆变器的3D-SVPWM调制算法仿真全流程。文章从工程实践出发,手把手指导如何搭建模型,涵盖从abc静止坐标系变换、三维空间矢量区域判定、作用时间计算到PWM信号生成与调试等核心环节,并附有代码示例和常见问题解决方案,旨在帮助工程师快速掌握这一应对不平衡负载的高效调制技术。

qsc90123456的博客 234

Hive ExprNodeDesc 及子类分析

ExprNodeDesc ExprNodeDesc可以保持一个 Node 的类型。 public ExprNodeDesc(TypeInfo typeInfo) { this.typeInfo = typeInfo; if (typeInfo == null) { throw new RuntimeException("typeInfo cannot be null!"); } } 子类有: ExprNodeNullDesc 用于表示 null Node。 Exp

houzhizhen的专栏 938

UNITY2022 Cardboard环境搭建

必须安装 Git,并且 git 可执行文件必须位于 PATH 环境变量中。考文档:https://developers.google.cn/cardboard/develop/unity/quickstart?转到 Assets/Samples/Google Cardboard//Hello Cardboard/Scenes/HelloCardboard 场景中。粘贴https://github.com/googlevr/cardboard-xr-plugin.git到文本输入字段中。

weixin_39510925的博客 1211

双脉冲测试中IGBT驱动电阻和驱动电容的研究

  在LTspice中没有双脉冲波形发生器,要做一个双脉冲的波形只能用电压源来进行特殊设置,不是很方便,为此我写了一个双脉冲波形发生器,有需要的可以下载。双脉冲波形发生器。   如下,该元器件可以自定义延迟时间Td,第一个脉冲宽度T1,第二个脉冲宽度T3,两个脉冲间隔T2,脉冲循环个数Ncycle以及高低电平Vhigh,Vlow。       IGBT开通时Rg的影响: 如果增大Rg: ①开通延...

gaoyong_wang的博客 8355

山大软工实践hive(8)-DefaultWalker的starkWalking方法以及ForwardWalker的walk方法

2021SC@SDUSC 山大软工实践hive(8)-DefaultWalker的starkWalking方法以及ForwardWalker的walk方法 文章目录山大软工实践hive(8)-DefaultWalker的starkWalking方法以及ForwardWalker的walk方法接着上一次starkWalking总的顺序是:ForwardWalker的walk两种walk的区别找寻opstack的踪迹(结果是没被dispatcher改动)接下来 接着上一次starkWalking 看startw

meloneatingguy的博客 974

STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写。 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘。只能利用业余时间慢慢更新,也不知道能不能坚持下去。 我会把从零开始开发一个程序需要经历的过程一一的记录下来。做成一个奶妈级的单片机开发笔记。 一、硬件简介 1.SD卡和MicroSD卡(TF卡)的区别 由下图可以很容易的看出TF卡只是比SD卡少了一个3脚Vss脚,其它的管脚顺序

KyleKuang的博客 8335

hive代码研究--设计模式(1)- 图(树)遍历

在hive的代码中核心是一个算子树,在算子树优化以及查询计划(MR序列)的生成过程中,多次使用算子树遍历设计模式,这里从总体上对这个设计模式进行介绍。 图遍历过程中包含两个模块的工作:分别是遍历器和调度器 1、遍历器(GraphWalker):对一颗算子树(或者任务树)进行遍历,遍历是扫描树中的每一个节点的过程,每次经过一个节点的时候,这里包含两个信息,当前节点以及当前状态(这个状态包括这个节

zhifeidie的专栏 1505

Swift Package Manager (SPM) 创建并集成本地库

Swift Package Manager (SPM) 在macOS 项目中创建并集成的完整步骤

征战无悔人生 1425

制作一款精美的 Qt IFW 安装程序

对于 Qt IFW 来说,默认的安装界面并不吸引人。倘若要制作一款精美的安装程序,这显然是不够的,需要在此基础上进行一系列定制。

青春不老,奋斗不止! 5261

山大软工实践hive(9)-dispatch关于minCost的计算

2021SC@SDUSC 山大软工实践hive(9)-dispatch关于minCost的计算 文章目录山大软工实践hive(9)-dispatch关于minCost的计算从DefaultRuleDispatcher开始以上内容的总结接下来 上一节说到要去看dispatcher,并已经梳理了大致步骤,现在要去理解。 从初始化看是DefaultRuleDispatcher 从DefaultRuleDispatcher开始 追踪dispatcher.dispatch(nd, ndStack, nodeOutp

meloneatingguy的博客 790

PT:pt write_change to innovus 脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1526

计算机毕业设计Python+Hadoop+Spark知网文献推荐系统 知网可视化 大数据毕业设计(源码+论文+讲解视频+PPT)

本文介绍了一个基于Python+Hadoop+Spark的知网文献推荐系统,针对学术信息过载问题提出分布式解决方案。系统采用五层架构实现数据采集、存储、处理、推荐和交互功能,融合协同过滤、内容过滤和知识图谱嵌入等算法,通过动态权重机制优化推荐结果。重点分析了混合推荐模型、冷启动解决方案等关键技术,并指出数据稀疏性、计算效率等现存挑战。未来趋势包括Transformer架构引入、联邦学习应用等方向。该系统为学术研究提供了高效的信息筛选工具,有助于推动"数据驱动"的研究范式发展。

全网计算机/大数据辅导(自媒体)道祖第一人、全网粉丝100W+,专注于大学生项目实战开发,讲解,毕业答疑辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。同时招收学生代理、校园代理。 445

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

graphWalker使用

graphWalker使用 官网:http://graphwalker.github.io/yed_model_syntax/ 是基于模型测试的工具,以有向图形式表示 节点:代表我们想要执行的期望状态。 顶点表示我们要检查的预期状态。 在任何实现代码/测试中,您都可以在其中找到断言或者oracles。 边:表示从一个顶点到另一个顶点的过渡。无论为了达到下一个状态,都需要采取任何状态。它可以选择一些...

nicezheng_1995 2798

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

hive原理与源码分析-UDxF、优化器及执行引擎(五)

什么是UDF? UDF的全称是User-Defined-Functions Hive中一共有三种UDF UDF(User-Defined Function):输入一行,输入一行,1->1 UDAF(User-Defined Aggregation Function):输入N行,输出一行,N->1 UDTF(User-Defined Table-generating Function

wzq6578702的专栏 3253

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Hive谓词解析过程分析

where col1 = 100 and abs(col2) > 0在Hive中的处理过程 where过滤条件称为谓词predicate。 以上where过滤条件在经过Hive的语法解析后,生成如下的语法树: TOK_WHERE AND ...

weixin_33966365的博客 726

HiveSQL的执行过程分析

首先,我们看一下hive的整个系统架构: 我们可以发现,hive主要由以下几部分组成: 客户端/ThriftServer/Driver/MetaStore四部分组成。 其中可用的客户端包括:CLI(命令行界面)/JDBC或者ODBC客户端/WEB接口界面,我们可以通过上面三种客户端向hive提交我们的命令。 ThriftServer:Jdbc或者Odbc通过

逸卿的专栏 3490

Hive表级血缘分析java demo

表级血缘分析 import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.Stack; import java.util.TreeSe...

争当鲲鹏飞万里 不做燕雀恋子巢 2544

安装Hive On Spark 遇见的问题

Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Iterable at org.apache.hadoop.hive.ql.optimizer.spark.SetSparkReducerParallelism.process(SetSparkReducerParallelism.java:11

吟啸徐行 4339

基于模型的自动化测试工具GraphWalker(二):使用介绍

5.工具使用介绍 5.1 GraphWalker用途 GraphWalker提供3种工作方式: 5.1.1作为第三方库,可被java测试程序直接调用 MBT中测试设计的目的是描述被测系统的预期行为。设计的结果看起来像一个具有许多边(也就是箭头,弧或过渡)和顶点(又称节点或状态)的模型,以及它们如何相互作用。 模型会提醒您流行的测试状态转换图或有限状态图。边表示与SUT的动作,顶点表示应该测试的SU...

KiroScarlet的博客 2845

hive血缘关系之输入表与目标表的解析

  接了一个新需求:需要做数据仓库的血缘关系。正所谓兵来将挡水来土掩,那咱就动手吧。   血缘关系是数据治理的一块,其实有专门的第三方数据治理框架,但考虑到目前的线上环境已经趋于稳定,引入新的框架无疑是劳民伤财,伤筋动骨,所以就想以最小的代价把这个事情给做了。目前我们考虑做的血缘关系呢只是做输入表和输出表,最后会形成一张表与表之间的链路图。这个东西的好处就是有助于仓库人员梳理业务,后面可能还会做字段之间的血缘关系等,后面做了再说,今天只是记录一下输入表和输出表的血缘关系。   我们线上的环境用来做...

u011250186的博客 1785

hive查询时抛出OOM

Hive的某个查询突然报OutOfMemoryError: hive> select upstream_addr from lb_log where     > domain_name='xxxxx' and host='xxxxxx' and dt=121117 and hour=20 limit 10; Exception in thread "main" java.lang.OutOf

道听途说 2872

java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalkerInfo.getConvertedNode

环境: Hadoop 2.6.0 Hive 1.1.1 JDK 1.7.0_60 操作系统:Red Hat Enterprise Linux Server release 6.0 (Santiago) 问题描述: 在Hive中执行创建表,导入数据,不带where语句的查询都没有问题。 但是带where语句时报错, 如下: hive (timezipper)> SELECT or

DataFlow范式 2923

[SDU软件工程实践]Blog1-hive基础安装与整体规划

2021SC@SDUSC 目录安装HadoopLinux虚拟机XShell和XftpJDKHadoop安装Hadoop配置Hive 到写这篇博客为止,我己经初步装好了hadoop和hive,hive已经可以运行了,且已经有了源码,但是没有截图,只能尽量配图了。 安装Hadoop hive要运行在hadoop上,那么使用hive的必要前提就是安装hadoop了。 Linux虚拟机 Linux选择了CentOS-7,有阿里云的镜像 我们设法搞一个VMware,用文件安装即可。过程中要设置root用户密码和个人用

Stardust_5322的博客 567
上一篇: 山大软工实践hive(11)-ConstantPropagate优化器的流程
下一篇: 山大软工实践hive(13)-查看逻辑优化在总体流程上的位置
meloneatingguy
博客等级 码龄7年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值