Spark优化篇:RBO/CBO

2023-05-16

​​​​​​     在Spark1.0中所有的Catalyst Optimizer都是基于规则 (rule) 优化的。为了产生比较好的查询规 则,优化器需要理解数据的特性,于是在Spark2.0中引入了基于代价的优化器 (cost-based optimizer),也就是所谓的CBO。然而,CBO也无法解决很多问题,比如

  •  数据统计信息普遍缺失,统计信息的收集代价较高;
  • 储存计算分离的架构使得收集到的统计信息可能不再准确;
  • Spark部署在某一单一的硬件架构上,cost很难被估计;
  • Spark的UDF(User-defined Function)简单易用,种类繁多,但是对于CBO来说是个黑 盒子,无法估计其cost;

总而言之,由于种种限制,Spark的优化器无法产生最好的Plan。

也许你会想:Spark为什么不解决这个问题呢?这里有很多挑战,比如: 

  • 统计信息的缺失,统计信息的不准确,那么就是默认依据文件大小来预估表的大小,但是文件 往往是压缩的,尤其是列存储格式,比如parquet 和 ORC,而Spark是基于行处理,如果数据连续重复,file size可能和真实的行存储的真实大小,差别非常之大。这也是为何提高 autoBroadcastJoinThreshold,即使不是太大也可能会导致out of memory; 
  • Filter复杂、UDFs的使用都会使Spark无法准确估计Join输入数据量的大小。当你的queryplan异常大和复杂的时候,这点尤其明显;
  • 其中,Spark3.0中基于运行期的统计信息,将Sort Merge Join 转换为Broadcast Hash Join。

基于RBO优化:

left join case

 var appSql: String =
      """
        |select
        |   *
        |from
        |   tab_spark_test as t1
        |left join tab_spark_test_2 as t2
        |on t1.id = t2.id
        |and t1.id > 5+5
        """.stripMargin
 
sparkSession.sql("use default;")

sparkSession.sql(appSql).explain(mode = "extended")

基于CBO优化:

CBO 优化主要在物理计划层面,原理是计算所有可能的物理计划的代价,并挑选出代价最小的物理执行计划。充分考虑了数据本身的特点(如大小、分布)以及操作算子的特点(中间结果集的分布及大小)及代价,从而更好的选择执行代价最小的物理执行计划。

而每个执行节点的代价,分为两个部分: 

1、该执行节点对数据集的影响,即该节点输出数据集的大小与分布;

2、该执行节点操作算子的代价。

每个操作算子的代价相对固定,可用规则来描述。而执行节点输出数据集的大小与分布,分为两个部分:

1、初始数据集,也即原始表,其数据集的大小与分布可直接通过统计得到;

2、中间节点输出数据集的大小与分布可由其输入数据集的信息与操作本身的特点推算。

需要先执行特定的 SQL 语句来收集所需的表和列的统计信息。 

--表级别统计信息
ANALYZE TABLE 表名 COMPUTE STATISTICS
--生成列级别统计信息
ANALYZE TABLE 表名 COMPUTE STATISTICS FOR COLUMNS 列 1,列 2,列 3

--显示统计信息
DESC FORMATTED 表名
--显示列统计信息
DESC FORMATTED 表名 列名

没有执行 ANALYZE状态 

执行 ANALYZE后,发现多了很多spark.sql.statistics信息

 

 使用 CBO

通过 "spark.sql.cbo.enabled" 来开启,默认是 false。配置开启 CBO 后,CBO 优化器可以基于表和列的统计信息,进行一系列的估算,最终选择出最优的查询计划。比如:Build 侧选择、优化 Join 类型、优化多表 Join 顺序等。

参数

描述       默认值

spark.sql.cbo.enabled

true 表示打开,false 表示关闭。

要使用该功能,需确保相关表和列的统计信息已经生成。

false

spark.sql.cbo.joinReorder.enabled 

使用 CBO 来自动调整连续的 inner join 的顺序。

true:表示打开,false:表示关闭

要使用该功能,需确保相关表和列的统计信息已经生成,且

CBO 总开关打开。

false

spark.sql.cbo.joinReorder.dp.threshold 

使用 CBO 来自动调整连续 inner join 的表的个数阈值。

如果超出该阈值,则不会调整 join 顺序。

10

​​​​​​​

 def main(args: Array[String]): Unit = {
    val sparkConf: SparkConf = new SparkConf().setAppName("CBO")
      .set("spark.sql.cbo.enabled", "true")
      .set("spark.sql.cbo.joinReorder.enabled", "true")
      .setMaster("local[*]")
    val sparkSession: SparkSession = Util.SparkSession2hive(sparkConf)

    var appSql: String =
      """
        |select
        |   t1.name,count(1)
        |from
        |   tab_spark_test as t1
        |left join tab_spark_test_2 as t2
        |on t1.id = t2.id
        |group by t1.name
        """.stripMargin

    sparkSession.sql("use default;")
    sparkSession.sql(appSql).show()

    while (true) {}

  }

123

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark优化篇:RBO/CBO 的相关文章

  • Spark广播变量与累加器

    在之前的文章中 我介绍了flink广播状态 从而了解了flink广播状态实际上就是将一个流广播到下游所有算子之中 在本文中我将介绍spark中类似的概念 为了方便理解 先放张spark应用程序架构图 1 普通spark变量 实际上 如果我们
  • 【Spark NLP】第 3 章:Apache Spark 上的 NLP

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • spark-shell 加载本地文件报错 java.io.FileNotFoundException

    学习spark shell 时候发现一个问题 从本地文件加载数据生成RDD 报错 文件找不到 原因 spark shell 如果启动了集群模式 真正负责计算的executor会在 该executor所在的 worker节点上读取文件 并不是
  • 学习大数据spark——心得体会

    总结与体会 1 项目总结 本次项目实现了Spark 单机模式Python版的安装 介绍了与Spark编程有关的一些基本概念 特别对RDD的创建 转换和行动操作做了比较详细的说明 对从RDD 到DataFrame的实现进 行了案例训练 包括
  • java中使用spark如何将column多列合为一列

    接下来介绍几种使用spark将DataFrame中一行的多列合并到一列中 并且该列以不同的类型展示保存 1 建立dataset 自己需要连接的mongo库 private static String datasource 自己需要连接的mo
  • Hadoop完全分布式集群——Hadoop 配置

    前面已完成VMware虚拟机安装与配置 参考前一篇Hadoop完全分布式集群 VMware虚拟机安装与配置 夏雨和阳阳的博客 CSDN博客 下面将进行Hadoop 配置 一 slave1 slave2节点配置修改 slave1 slave2
  • 大数据相关常用软件下载地址集锦

    文章目录 每日一句正能量 前言 一 软件下载地址如下 二 文档地址如下 结语 每日一句正能量 生命中有一些人与我们擦肩了 却来不及遇见 遇见了 却来不及相识 相识了 却来不及熟悉 熟悉了 却还是要说再见 前言 由于大数据开发中经常需要用到Z
  • 深入理解 SQL 中的 Grouping Sets 语句

    前言 SQL 中 Group By 语句大家都很熟悉 根据指定的规则对数据进行分组 常常和聚合函数一起使用 比如 考虑有表 dealer 表中数据如下 id Int city String car model String quantity
  • 【Apache Spark 】第 1 章Apache Spark 简介:统一分析引擎

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • spark算子执行位置研究,driver端?executor端?

    参考资料 https cloud tencent com developer article 1545723 前言 spark算子的执行位置 driver端 还是executor端 这些之前其实没有注意过 最近在学流处理 发现这个还是很重要
  • spark报Got an error when resolving hostNames. Falling back to /default-rack for all

    一 报错代码如下 21 06 01 20 13 36 INFO yarn SparkRackResolver Got an error when resolving hostNames Falling back to default rac
  • Spark 从入门到放弃(一)Spark基础概念

    一 Spark基础概念 1 Application Spark应用程序 application 应用 其实就是用spark submit提交的程序 一个application通常包含三部分 从数据源 比方说HDFS 取数据形成RDD 通过R
  • 使用Flink1.16.0的SQLGateway迁移Hive SQL任务

    使用Flink的SQL Gateway迁移Hive SQL任务 前言 我们有数万个离线任务 主要还是默认的DataPhin调度CDP集群的Hive On Tez这种低成本任务 当然也有PySpark 打Jar包的Spark和打Jar包的Fl
  • 数据中台-让数据用起来-6

    文章目录 第六章 数据开发 数据价值提炼工厂 6 1 数据计算能力的4种类型 6 1 1 批计算 6 1 2 流计算 6 1 3 在线查询 6 1 4 即席分析 6 2 离线开发 1 作业调度 2 基线控制 3 异构存储 4 代码校验 5
  • 11.Linux下Spark的安装配置以及spark-shell的启动和 Spark集群环境搭建

    本案例软件包 链接 https pan baidu com s 1zABhjj2umontXe2CYBW DQ 提取码 1123 若链接失效在下面评论 我会及时更新 目录 1 安装Spark 1 先用xftp将安装包传到home hadoo
  • sparkstreamming 消费kafka(2)

    spark streaming提供了两种获取方式 一种是同storm一样 实时读取缓存到内存中 另一种是定时批量读取 这两种方式分别是 Receiver base Direct 一 Receiver base Spark官方最先提供了基于R
  • spark hadoop环境及运行

    hadoop配置 在Ubuntu20 04里安装Hadoop详细步骤 图文 亲测成功 ubuntu20 04安装hadoop 菜鸡的学习之路的博客 CSDN博客 启动hadoop root ubuntu usr local hadoop s
  • spark SQL基础教程

    1 sparkSQL入门 sparksql专门用于处理结构化的数据 而RDD还可以处理非结构化的数据 sparksql的优点之一是sparkfsql使用统一的api读取不同的数据 第二个优点是可以在语言中使用其他语言 例如python 另外
  • Spark Sql之dropDuplicates去重

    文章目录 算子介绍 示例 问题 解决 dropDuplicates和distinct 参考 算子介绍 dropDuplicates去重原则 按数据行的顺序保留每行数据出现的第一条 dropDuplicates 在Spark源码里面提供了以下
  • Spark 中 BroadCast 导致的内存溢出(SparkFatalException)

    背景 本文基于 Spark 3 1 1 open jdk 1 8 0 352 目前在排查 Spark 任务的时候 遇到了一个很奇怪的问题 在此记录一下 现象描述 一个 Spark Application Driver端的内存为 5GB 一直

随机推荐

  • 如何使用Python为Hadoop编写一个简单的MapReduce程序

    转载自 xff1a http asfr blogbus com logs 44208067 html 在这个实例中 xff0c 我将会向大家介绍如何使用Python 为 Hadoop编写一个简单的 MapReduce 程序 尽管 Hadoo
  • Android Gradle 7.x新版本的依赖结构变化

    版本的小蜜蜂 小海豚 电鳗版本的Android Studio新建工程的依赖结构和之前的发生了变化 xff0c 主要有 xff1a 原来在工程build gradle中的buildscript和allprojects xff0c 移动至set
  • C#:如何用VS开启人生中第一个Windows窗体应用程序(Winform)?

    摘要 xff1a Windows窗体应用程序 xff08 Winform xff0c 下文以此指代 xff09 既能有效 直观地设计Windows窗体界面 xff0c 又支持内部逻辑的编写 那么 xff0c 对于C 初学者来说 xff0c
  • BootLoader & Grub详解

    BootLoader amp Grub详解 xff08 补记 xff09 2008 8 2 星期日 凉爽 补记 xff1a 2010 xff0d 04 xff0d 21 时隔两年 xff0c 会过头来重新看了一下 xff0c 发现GRUB的
  • 签名问题:EXPKEYSIG F42ED6FBAB17C654 Open Robotics <info@osrfoundation.org>

    sudo apt key adv keyserver keyserver ubuntu com recv keys F42ED6FBAB17C654 代码如上 xff0c 更换签名
  • Python,gnuplot,libsvm配置详细步骤

    1 下载Python xff0c gnuplot以及libsvm 我的电脑是64位 xff0c Win7操作系统 1 1 python 2 7 6 64位 这里我用的Python是64位的Python2 7 6 下载地址 xff1a htt
  • C++中assert函数的用法介绍

    assert宏的原型定义在 lt assert h gt 中 xff0c 其作用是如果它的条件返回错误 xff0c 则终止程序执行 xff0c 原型定义 xff1a inclide lt assert h gt void assert in
  • C++中stdlib.h头文件介绍

    stdlib头文件即standard library标准库头文件 xff0c stdlib头文件里包含了C C 43 43 语言的最常用的系统函数 xff0c 该文件包含了C语言标准库函数的定义 xff0c stdlib h中定义了物种类型
  • 蛋白质性质和结构分析

    原文链接 第七章 蛋白质性质和结构分析 传统的生物学认为 xff0c 蛋白质的序列决定了它的三维结构 xff0c 也就决定了它的功能 由于用X光晶体衍射和NMR核磁共振技术测定蛋白质的三维结构 xff0c 以及用生化方法研究蛋白质的功能效率
  • Libsvm网格参数寻优教程

    原文 xff1a http endual iteye com blog 1262010 首先下载Libsvm Python和Gnuplot xff1a l libsvm的主页http www csie ntu edu tw cjlin li
  • 打井问题

    在偏远的山区 xff0c 水资源很稀缺 xff0c 因此 xff0c 我们问每个山区进行打井工程 xff0c 在不同的地方打了N口井 xff0c 现在我们要在这N口井之间修建管道 xff0c 要使得这些井都能连通 xff0c 同时所使用的管
  • C语言结构体的初始化

    C primer Plus第五版 第14章结构和其他数据形式 1 结构声明 结构声明 xff08 structure declaration xff09 是描述结构体如何组合的主要方法 xff0c 声明就像下面这样 xff1a struct
  • 【Unix编程】文件处理函数

    文件处理函数 xff1a http www iteedu com os linux linuxprgm linuxcfunctions file fcntl php 1 close xff08 关闭文件 xff09 相关函数 open xf
  • ubuntu安装vnc踩的坑

    较新版本的ubuntu 安装vnc 1 搜索setting 把里面的sharing的权限都打开 2 试一下sudo apt get install vnc4server 或者sudo apt y install vnc4server 3 如
  • ElasticSearch 7.6中遇到的一些坑

    一 限制单个index在单个节点上的总shard数 index routing allocation total shards per node 一般在冷热分离的场景种 xff0c 冷数据会设置副本 xff0c 热数据为了保证写入速度 xf
  • 大数据部门组织结构

    平台团队 运维团队 运维工程师最基本的职责都是负责服务的稳定性 xff0c 确保服务可以7 24H不间断地为用户提供服务 xff0c 负责维护并确保整个服务的高可用性 xff0c 同时不断优化系统架构提升部署效率 优化资源利用率 xff1b
  • Hadoop HDFS 副本机制

    Data Replication HDFS is designed to reliably store very large files across machines in a large cluster It stores each f
  • Apache Spark 3.0:全新功能知多少

    Spark3 0解决了超过3400个JIRAs xff0c 历时一年多 xff0c 是整个社区集体智慧的成果 Spark SQL和 Spark Cores是其中的核心模块 xff0c 其余模块如PySpark等模块均是建立在两者之上 Spa
  • Spark优化篇:动态内存管理

    Spark内存管理分为静态内存管理和统一内存管理 xff0c Spark1 6之前使用的是静态内存管理 xff0c Spark1 6之后的版本默认使用的是统一内存管理 动态内存机制图 xff1a 内存估算 xff1a Other Memor
  • Spark优化篇:RBO/CBO

    在Spark1 0中所有的Catalyst Optimizer都是基于规则 rule 优化的 为了产生比较好的查询规 则 xff0c 优化器需要理解数据的特性 xff0c 于是在Spark2 0中引入了基于代价的优化器 xff08 cost