Catalyst揭秘 Day2

Catalyst源码初探

这节课从源码角度来讲catalyst。

首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高。因为除了指令执行性能以外,更重要的是架构层次,里面的核心是数据和代码的本地性问题。如果是能在内存中或者多线程运行,很多时候Java会比C语言性能高很多。

一般对rdd的操作都没有dataframe的快,主要就是catalyst这个执行优化器的作用。

SqlContext处理流程

写SparkSql的程序,有一个非常核心的东西,就是SQLContext。

SQLContext是基于SparkContext来构建的SQL和dataframe数据处理的上下文,会做一部分解析和驱动工作之后,还是会把执行以rdd的方式交给SparkContext来执行。

从源码的注释看,SQLContext是处理结构化数据的入口,允许我们创建dataframe,并可以基于dataframe进行sql查询。

首先,通过catalog,我们可以对plan进行初步处理,比如确定表名和表中的列名,生成Logical plan。

其内部核心是一个Hashmap,key是表名,value是LogicalPlan,主要提供了对表管理的一系列方法。

sqlParser负责对SQL语法进行分词,构建并返回一个语法树。

其中ParserDialect是核心,parse方法会负责具体的分词处理。

analyzer是真正的语法分析器,进行最原始的语法解析,变成logic plan。

Optimizer里面有一系列的优化规则,里面都是模式匹配,可以随意加规则,而且也不需要知道所有的东西。

SparkPlanner 优化物理执行计划,包含了一系列的优化策略,来优化我们物理执行的过程。

QueryExecution,是SQL执行执行上下文,负责生成结果。

QueryExecution中,会生成RDD。

至此,我们完整走了一遍流程,可以看到sql经过一系列处理后,生成了RDD,这个印证了昨天说的整个流程过程。

结果展现

那么这个生成的RDD后续会如何使用,我们简单的看一句SQL的结果展现:

从show方法开始:

show中会调用take方法,进而调用head方法。

head方法主要调用了collect方法。这里主要是对语句进行执行。

之后会执行SparkPlan中的execute方法生成RDD。

而其最终,会调用到RDD的collect方法,生成Job,进行运行。

欲知后事如何,且听下回分解!

DT大数据每天晚上20:00YY频道现场授课频道68917580

Catalyst揭秘 Day2 Catalyst源码初探的更多相关文章

  1. Catalyst揭秘 Day1 Catalyst本地解析

    Catalyst揭秘 Day1 Catalyst本地解析 今天开始讲下Catalyst,这是我们必须精通的内容之一: 在Spark2.x中,主要会以Dataframe和DataSet为api,无论是D ...

  2. Kakfa揭秘 Day9 KafkaReceiver源码解析

    Kakfa揭秘 Day9 KafkaReceiver源码解析 上一节课中,谈了Direct的方式来访问kafka的Broker,今天主要来谈一下,另一种方式,也就是KafkaReceiver. 初始化 ...

  3. Kakfa揭秘 Day7 Producer源码解密

    Kakfa揭秘 Day7 Producer源码解密 今天我们来研究下Producer.Producer的主要作用就是向Kafka的brokers发送数据.从思考角度,为了简化思考过程,可以简化为一个单 ...

  4. Kakfa揭秘 Day6 Consumer源码解密

    Kakfa揭秘 Day6 Consumer源码解密 今天主要分析下Consumer是怎么来工作的,今天主要是例子出发,对整个过程进行刨析. 简单例子 Example中Consumer.java是一个简 ...

  5. Kakfa揭秘 Day3 Kafka源码概述

    Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...

  6. Spark Streaming揭秘 Day26 JobGenerator源码图解

    Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在Sp ...

  7. Spark Streaming揭秘 Day22 架构源码图解

    Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...

  8. Servlet源码初探

    年底,公司的事情告一段落,就来捣鼓一下这个Servlet源码,为下一步的spingmvc源码初探做准备 1.Servlet接口 public interface Servlet { void init ...

  9. Spring Boot 揭秘与实战 源码分析 - 工作原理剖析

    文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...

随机推荐

  1. Debian下MySQL配置

    1 安装 $ apt-get install mysql-server $ apt-get install mysql-client 2 修改MySQL的口令 一般上一步会让你输入root密码,如果没 ...

  2. C. Guess Your Way Out!

    C. Guess Your Way Out!                                                               time limit per ...

  3. DOM+Javascript一些实例

    1.内容+遮罩层+悬浮对话框 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  4. 微软数学库XNAMATH(DirectXMath)

    这篇文章只是对着MSDN文档的一些吐槽和总结记录,个人笔记之类的 运行库与头文件 老实说,这个数学库微软还是更像蛮频繁的,我这里有的最早版本是伴随DX9的,在这个头文件里面 最近在使用DXUT,顺便也 ...

  5. Redis' High Availability

    Redis Sentinel is a system designed to help managing Redis instances. It performs the following thre ...

  6. 网络编程(发送get和post请求到服务器端,并获取响应)

    一:B/S结构,浏览器端到服务器端通信依赖http协议 交互过程: 1:在浏览器地址栏输入http://ip:port/应用/资源路径 2:浏览器根据ip和服务器建立连接,port确定和那个应用进行交 ...

  7. [改善Java代码]建议40:匿名类的构造函数很特殊

    建议40: 匿名类的构造函数很特殊 在上一个建议中我们讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全一样呢?我们来看一个例子,设计一个计算器,进行 ...

  8. Commons JXPath - DOM/JDOM Document Access

    除了 JavaBean,JXPath 也可以访问 DOM/JDOM. 示例 XML: <?xml version="1.0" encoding="utf-8&quo ...

  9. Spring(3.2.3) - Beans(2): 属性注入 & 构造注入

    依赖注入是指程序运行过程中们如果需要另外的对象协作(访问它的属性或调用它的方法)时,无须在代码中创建被调用者,而是依赖于外部容器的注入. 属性注入(Setter Injection) 属性注入是指 I ...

  10. Linux 命令 - curl: transfer a URL

    命令格式 curl [options] [URL...] 命令参数 -0, --http1.0 强制使用 HTTP/1.0 发送请求 -A, --user-agent 指定用户代理 -b/--cook ...