Catalyst揭秘 Day1 Catalyst本地解析
Catalyst揭秘 Day1
Catalyst本地解析
今天开始讲下Catalyst,这是我们必须精通的内容之一:
- 在Spark2.x中,主要会以Dataframe和DataSet为api,无论是Dataframe和DataSet,底层都依赖Catalyst和Tungsten。
- 根据官方的披露,后续所有的框架都会依赖Catalyst和Tungsten。
从定位上看,catalyst是在SparkSql上先做实验,后面是机器学习,现在要推到各个子框架。
基本概念
catalyst是一种解析器引擎,而不仅是sql解析引擎。如果研究下catalyst,可以在当中非常方便的添加你想做的任意新的优化技术,在优化技巧方面可以随意的扩展。也很少有解析器像catalyst这样可以方便的增加新的数据类型。
catalyst的数据结构是棵树状结构,并有一系列的rules的解析规则。我们以前在很多语言开发的时候,都会解析成一颗语法树,catalyst是把sql和dataframe的内容用tree来存储。第二个层面,Catalyst中有一套解析规则,怎么对树进行解析和优化。
从jvm对内存的管理来说,内存中的所有object也是树状结构的,那catalyst用一棵树在存储的话,每个节点都是类的实例,都有0个或多个子节点,并且节点是不可变,只能把一棵树从一种状态transform到另一种状态。
Tree结构解析
Catalyst主要包含两点:
- Tree数据结构;
- Rules解析规则;
- 优化方式;
如何理解Tree数据结构:
比如表达式 x + (5 + 10),当中包含:
Literal:5 10
Attribute:x
Action:Add
可以用下图表示:

Catalyst中使用一系列的Rules来解析和优化Tree数据结构,对于上述的树状数据结构,优化过程可以如下,把常量合并在一起。由于表达式是一个对象,对象有类型,所以可以使用模式匹配,对于不认识的类型可以忽略,并且添加新的类型会很容易,导致了我们的扩展和操作非常的方便,只要不断执行匹配规则就行。当我们写优化规则的时候,只需要考虑不同的算子,根本就不用这棵树有多大。因为catalyst会循环运用我们的规则,只到这棵树不可以被解析和优化,这让我们会很方便改变规则,也会很方便优化引擎。
tree.tranform{
case Add(Literal(x),Literal(y)) => Literal(x+y)
case
...
}
执行过程
一般来说分为六步:

- SQL、Dataframe、DataSet都会变成Unrecognized Logic Plan未识别的逻辑计划,这是一棵抽象语法树,数据表和列名等都还未被识别。
- 用catalog来识别表和列名等东西,并且会对值进行一些简单的计算,建立Logic Plan。
- 运用rules对上一阶段成果进行优化,比如谓词下推,形成Optimized Logic Plan优化后的逻辑计划。
- 根据基于成本的考量,比如将小表进行broadcast,形成pyshical plan物理计划。 在做sparksql时,其实做不了啥太多的优化。物理计划已经是基于rdd角度的考虑了。

- 会根据评估模型,在很多个物理计划的选项中,选中最快的物理计划。由于有这个环节,dataframe一般情况下比直接写rdd运行快。
- 借助scala语言的高级特性quasiquotes,将物理计划,直接变成jvm的字节码。基于rdd进行编程。
从整个过程,我们可以看到在框架抽象的时候,并不是越底层越高效,因为如果能加入优化层次,会对开发者有很大的助力。
欲知后事如何,且听下回分解!
DT大数据每天晚上20:00YY频道现场授课频道68917580
Catalyst揭秘 Day1 Catalyst本地解析的更多相关文章
- Catalyst揭秘 Day6 Physical plan解析
Catalyst揭秘 Day6 Physical plan解析 物理计划是Spark和Sparksql相对比而言的,因为SparkSql是在Spark core上的一个抽象,物理化就是变成RDD,是S ...
- Catalyst揭秘 Day2 Catalyst源码初探
Catalyst揭秘 Day2 Catalyst源码初探 这节课从源码角度来讲catalyst. 首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高.因为除了指令执行性能以外,更重要的是架构 ...
- Catalyst揭秘 Day5 optimizer解析
Catalyst揭秘 Day5 optimizer解析 Optimizer是目前为止中catalyst中最重要的部分.主要作用是把analyzed logicalPlan变成optimized Log ...
- Catalyst揭秘 Day4 analyzer解析
Catalyst揭秘 Day4 analyzer解析 今天继续解析catalyst,主要讲一下analyzer,在sql语句的处理流程中,analyzer是在sqlparse的基础上,把unresol ...
- Catalyst揭秘 Day3 sqlParser解析
Catalyst揭秘 Day3 sqlParser解析 今天我们会进入catalyst引擎的第一个模块sqlparser,它是catalyst的前置模块. 树形结构 从昨天的介绍我们可以看到sqlPa ...
- Catalyst揭秘 Day8 Final 外部数据源和缓存系统
Catalyst揭秘 Day8 Final 外部数据源和缓存系统 今天是Catalyst部分的收官,主要讲一些杂项内容. 外部数据源处理 什么叫外部数据源,是SparkSql自己支持的一些文件格式,以 ...
- Catalyst揭秘 Day7 SQL转为RDD的具体实现
Catalyst揭秘 Day7 SQL转为RDD的具体实现 从技术角度,越底层和硬件偶尔越高,可动弹的空间越小,而越高层,可动用的智慧是更多.Catalyst就是个高层的智慧. Catalyst已经逐 ...
- Spark Tungsten揭秘 Day1 jvm下的性能优化
Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...
- Kakfa揭秘 Day8 DirectKafkaStream代码解析
Kakfa揭秘 Day8 DirectKafkaStream代码解析 今天让我们进入SparkStreaming,看一下其中重要的Kafka模块DirectStream的具体实现. 构造Stream ...
随机推荐
- Android(java)学习笔记115:Android InputMethodManager输入法简介
正文 一.结构 public final class InputMethodManager extends Object Java.lang.Object android.view.inputmeth ...
- mysql颠覆实战笔记(六)--商品系统设计(三):商品属性设计之固定属性
今天我们来讲一下商品属性 我们知道,不同类别的商品属性是不同的. 我们先建一个表prod_class_attr:
- MYSQL基础笔记(四)-数据基本操作
数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...
- Java操作zip压缩和解压缩文件工具类
需要用到ant.jar(这里使用的是ant-1.6.5.jar) import java.io.File; import java.io.FileInputStream; import java.io ...
- hdu 3401 单调队列优化动态规划
思路: 动态方程很容易想到dp[i][j]=max(dp[i][j],dp[i-w-1][j-k]-k*ap[i],dp[i-w-1][j+k]+k*bp[i]): dp[i][j]表示第i天拥有j个 ...
- spark集成hive遭遇mysql check失败的问题
问题: spark集成hive,启动spark-shell或者spark-sql的时候,报错: INFO MetaStoreDirectSql: MySQL check failed, assumin ...
- asp.net中用回车代替按钮事件
第一步,先编写简单的页面代码,这里我们只需要一个按钮就足够了.当然,还有按钮事件. <html> <head> <title>测试绑定enter</title ...
- 解决MS Office下载网站数据失败的问题
最近遇到在MS Excel中建立的Web Query在创建完成后过了一段时间(或关闭文件后再次打开文件并刷新数据)出现无法刷新的问题,点击刷新时报错如下: 无法下载您要求的信息. 这是一个很不友好的报 ...
- CSS之颜色英文代码全集
ColorHex在线颜色查询 <head> <title>CSS之颜色英文代码全集</title> <style type="text/css&qu ...
- 三道题(关于虚表指针位置/合成64位ID/利用栈实现四则运算)
第一题 C++标准中,虚表指针在类的内存结构位置没有规定,不同编译器的实现可能是不一样的.请实现一段代码,判断当前编译器把虚表指针放在类的内存结构的最前面还是最后面. 第二题 在游戏中所有物品的实例 ...