Catalyst揭秘 Day1 Catalyst本地解析
2016-07-19 23:03
295 查看
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相关文章推荐
- 【贪心】闭区间问题
- Rhythm韵:自制音乐app(1f)
- 张宴的博客nginx+php+mysql搭建篇
- 虚拟机 可以多个wifi地址 登录【还得改hosts 与 ifcfg-eth0】
- 游标
- 使用ProgressBar实现进度条
- fork与vfork 的研究
- 一个java数学题,给定一个数组,除了一个数出现1次之外,其余数都出现3次,输出出现一次的那个数。
- 实现jQuery底层链式编程(二)
- 设计模式初探
- 参数数组和普通数组
- Git学习(一)
- 集合映射
- 记录输入三数排序,字符串操作
- Android studio启动到指定Activity
- 2016第30周二
- TOYS-POJ2318
- 注解 @RequestMapping
- 设计模式之策略模式
- Hadoop 2.x源码包编译