Spark SQL原理和运行机制

本文深入探讨Spark SQL的整体架构,重点讲解Catalyst执行优化器的工作原理,包括分析、逻辑优化、物理计划和代码生成四个阶段。Catalyst利用规则对SQL语句进行解析、优化,生成高性能的Java字节码,确保Spark SQL的高效执行。
摘要由CSDN通过智能技术生成

一.Spark SQL整体架构

Spark SQL同时支持DataFrame编程API,以及SQL执行和JDBC/ODBC接口,整体结构如下:
在这里插入图片描述
Spark SQL是Spark Core之上的一个模块,所有SQL操作最终都通过Catalyst翻译成类似普通Spark程序一样的代码,被Spark Core调度执行,其过程也有Job、Stage、Task的概念。

二.Catalyst执行优化器

Catalyst是Spark SQL执行优化器的代号,所有Spark SQL语句最终都通过它来解析、优化、最终生成可以执行的Java字节码。因此,Catalyst是Spark SQL最核心的部分。而且不同于Shark使用Hive执行优化器的做法,Catalyst是专为Spark设计的,并结合了Scala语言本身的优势,使得性能甚至超过手工编写的Scala代码。
除了性能上的优势之外,Catalyst的扩展性也非常好,它不但可以很方便地添加新的优化技术和新的特性,而且还可以很方便地扩展优化器,比如添加新的数据类型或针对特定数据源的优化规则。
Catalyst最主要的数据结构是树,所有SQL语句都会用树结构来存储,树中的每个节点有一个类,以及0或多个子节点。Scala中定义的新的节点类型都是TreeNode这个类的子类。这些对象都是不可变的。
这里以表达式x+(1+2)为例介绍一下,其中每个元素都对应一个类型。这个表达式总共有3个类型,具体如下:

  1. Literal(value : Int):一个整数常量类型,1和2都是这个类型。
  2. Attribute(name : String):表示一个列属性,比如x。
  3. Add(left : TreeNode, right : TreeNode):表达式类型,用于求和。
    所以,表达式最终在Scala中的定义是:Add(Attribute(x),Add(Literal(1),Literal(2)))
    这对应一颗树,如下:
    在这里插入图片描述
    Catalyst的另一个重要的概念是规则。基本上所有优化都是基于规则的。可以用规则对树进行操作,树中的节点是只读的,所以树也是只读的。规则中定义的函数可能实现从一棵树转换成一颗新树。
    比如,可以定义这样一个规则,将常量相加的子树合并成一个节点:
    tree.transform{
    case Add(Literal(c1), Literal(c2)) ** => ** Literal(c1 + c2)
    }
    将这个规则应用到前面的示例x+(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值