热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SparkSQL常见问题

1.SparkSQL运行架构SqlParser将SQL语句转换为未解析的逻辑查询计划;Analyzer对逻辑查询计划进行属性和关系关联检验;Optimizer通过逻辑查询优化将逻辑

1. Spark SQL 运行架构

《Spark SQL 常见问题》
《Spark SQL 常见问题》

  1. SqlParser 将 SQL 语句转换为未解析的逻辑查询计划;
  2. Analyzer 对逻辑查询计划进行属性和关系关联检验;
  3. Optimizer 通过逻辑查询优化将逻辑查询计划转换为优化的逻辑查询计划;
  4. QueryPlanner 将优化的逻辑查询计划转换为物理查询计划,再根据过去的性能统计数据,选择最佳的物理执行计划 CostModel,得到 SparkPlan;
  5. 生成 RDD 相关代码,并执行。

2. Spark SQL 中Optimizer 的常见优化策略有哪些?

基于规则的优化(RBO)

  • 列裁剪:利用列式存储,减少网络、内存消耗
  • 谓词下推:提前过滤,减少计算数据量
  • 常量折叠:减少常量操作,如从 1+1 优化为 2 避免每一条 record 都需要执行一次 1+1 的操作
  • 操作合并:合并多个连续的 Filter、limit 等算子,加快计算

基于 Cost 的优化(CBO)

Join 方案的选择

3. Join 的几种实现方式?

Broadcast Hash Join 和 Shuffle Hash Join 都是基于 Hash Join 的变体,所以先介绍下 Hash Join:

取一张表作为 Build Table,对其按照 Join Key 构建 Hash Table,另外一张表作为 Probe Table,扫描 Probe Table,对其参与的 Join Key Hash 映射 Hash Table 中的记录,检查 join key 值是否匹配,匹配即 Join 上了。这便是单机版 Hash Join 的基本思想。

Broadcast Hash Join

  1. Broadcast 阶段:将小表广播分发到大表所在的所有主机。广播算法可以有很多,最简单的是先发给 Driver,Driver 再统一分发给所有 Executor;要不就是基于 bittorrete 的 p2p 思路;
  2. Hash Join 阶段:在每个 Executor上执行单机版 Hash Join,小表映射,大表试探。

Spark SQL 规定 Broadcast Hash Join 执行的基本条件为被广播小表必须小于参数 spark.sql.autoBroadcastJoinThreshold,默认为 10M 。

Shuffle Hash Join

显然 Broadcast Hash Join 只适合对小表进行广播,如果是大表呢?此时可以按照 Join Key 进行分区,根据 Key 相同必然分区相同的原理,就可以将大表 Join 分而治之,划分为很多小表的 Join,充分利用集群资源并行化。

  1. Shuffle 阶段:分别将两个表按照 Join Key 进行分区,将相同 Join Key 的记录重分布到同一分区,这样两张表的数据会被重分布到集群中所有节点,这个过程称为 shuffle;
  2. Hash Join 阶段:每个分区节点上的数据单独执行单机 Hash Join 算法。

Sort Merge Join

如果两张表都是大表的话,Shuffle Hash Join 在 Hash Join 阶段仍然可能比较吃力,Sort Merge Join 就是针对这一阶段的优化:

  1. Shuffle 阶段:同 Shuffle Hash Join 一样分别将两个表根据 Join Key 进行分区;
  2. Sort 阶段:对单个分区节点的两个表的数据,分别进行排序;
  3. Merge 阶段:对排好序的两张分区表数据执行 Join 操作。Join操作很简单,分别遍历两个有序序列,碰到相同 Join key 就 Merge 输出。

简单来说 Sort Merge Join 就是通过排序加快了 Hash Join。

参考文章

  1. BigData-‘基于代价优化’究竟是怎么一回事?

本文首发于公众号“数据Man”,欢迎关注!

《Spark SQL 常见问题》
数据Man


推荐阅读
  • 外层|条件下_MySQL还能这样玩第五篇之视图应该这样玩
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL还能这样玩---第五篇之视图应该这样玩相关的知识,希望对你有一定的参考价值。 ... [详细]
  • mysql join 算法_【MySQL】之join算法详解
    在阿里巴巴的java开发手册有这么一条强制规定:超过三个表禁止join,须要join的字段,数据类型保持绝对一致,多表关联查 ... [详细]
  • 【JVM技术专题】深入分析CG管理和原理查缺补漏「番外篇」
    前提概要本文主要针对HotspotVM中“CMSParNew”组合的一些使用场景进行总结。自Sun发布Java语言以来,开始使用GC技术来进行内存自动管理࿰ ... [详细]
  • 从分布式数据库选型的第一件事谈起
    本文很长,谨慎阅读现在在我们的面前摆着太多的分布式数据库可以让我们选择,那么如果我想先让 ... [详细]
  • MySQL的SQL语句写法,除了那些基本的之外,还有一些也算比较常用的,这里记录下来,以便以后查找。好记性不如烂笔头& ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 最近想用js做一个简单的计算器,不过网上的例子好像大部分都是直接从左到右挨个计算,就好像1+2*5,就会先计算1+2,再计算3*5,并没有实现运算符的优先级,这里找到了一种方法实现,来总结一下。不过这 ... [详细]
  • 是不是zlib是这些库的压缩算法的实现库,而这么多库它们只是在打包的时候使用了zlib进行压缩而已.而具体的打包格式就有ZIP,BZIP2,GZ之分?但是在我们在用gz压缩时候通常之前 ... [详细]
  • iic协议
    IIC简介IIC,Inter-IntegratedCircuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于”字节型”设备。I2C总线物理拓扑结构IIC通信原理: 通过对S ... [详细]
  • 图像处理(7) : 边缘检测
    边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域 ... [详细]
  • 最近学习了数据挖掘常用的两种算法:FP-Growth和K-Means。现在把我的学习结果分享给大家。以下是本文的目录,大家可以根据需要跳过一些章节:1.FP-Grow ... [详细]
  • Lodash中文文档(v3.10.1)–“Collection”要领TranslatedbyPeckZegOriginalDocs:Lodashv3.10.1Docs乞助翻译文档的 ... [详细]
  • DimcnAsNewADODB.ConnectionDimcmdAsNewADODB.CommandDimrstAsNewADODB.Recordsetcn.Mod ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
author-avatar
mobiledu2502918997
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有