spark2.+ sql 性能调优
1、在内存中缓存数据
性能调优主要是将数据放入内存中操作,spark缓存注册表的方法
版本 | 缓存 | 释放缓存 |
spark2.+ | spark.catalog.cacheTable("tableName")缓存表 | spark.catalog.uncacheTable("tableName")解除缓存 |
spark1.+ | sqlContext.cacheTable("tableName")缓存 | sqlContext.uncacheTable("tableName") 解除缓存 |
Demo案例:
(1)从Oracle数据库中读取数据,生成DataFrame
val oracleDF = spark.read.format("jdbc")
.option("url","jdbc:oracle:thin:@192.168.88.101:1521/orcl.example.com")
.option("dbtable","scott.emp")
.option("user","scott")
.option("password","tiger").load
(2)将DataFrame注册成表:
oracleDF.registerTempTable("emp")
(3)执行查询,并通过Web Console监控执行的时间
spark.sql("select * from emp").show
(4)将表进行缓存,并查询两次,并通过Web Console监控执行的时间
spark.catalog.cacheTable("emp")
(5)清空缓存:
spark.catalog.uncacheTable("emp")
2、性能优化相关参数
Sparksql仅仅会缓存必要的列,并且自动调整压缩算法来减少内存和GC压力。
属性 | 默认值 | 描述 |
spark.sql.inMemoryColumnarStorage.compressed | true | Spark SQL 将会基于统计信息自动地为每一列选择一种压缩编码方式。 |
spark.sql.inMemoryColumnarStorage.batchSize | 10000 | 缓存批处理大小。缓存数据时, 较大的批处理大小可以提高内存利用率和压缩率,但同时也会带来 OOM(Out Of Memory)的风险。 |
spark.sql.files.maxPartitionBytes | 128 MB | 读取文件时单个分区可容纳的最大字节数(不过不推荐手动修改,可能在后续版本自动的自适应修改) |
spark.sql.files.openCostInBytes | 4M | 打开文件的估算成本, 按照同一时间能够扫描的字节数来测量。当往一个分区写入多个文件的时候会使用。高估更好, 这样的话小文件分区将比大文件分区更快 (先被调度)。 |
3. 广播
在进行表join的时候,将小表广播可以提高性能,spark2.+中可以调整以下参数、
属性 | 默认值 | 描述 |
spark.sql.broadcastTimeout | 300 | 广播等待超时时间,单位秒 |
spark.sql.autoBroadcastJoinThreshold | 10M | 用于配置一个表在执行 join 操作时能够广播给所有 worker 节点的最大字节大小。通过将这个值设置为 -1 可以禁用广播。注意,当前数据统计仅支持已经运行了 ANALYZE TABLE <tableName> COMPUTE STATISTICS noscan 命令的 Hive Metastore 表。 |
注:在任务超多,广播变量在跨stage使用数据的时候才能凸显其真正作用。
4. 分区数据的调控
spark任务并行度的设置中,spark有两个参数可以设置
属性 | 默认值 | 描述 |
spark.sql.shuffle.partitions | 200 | 用于配置 join 或aggregate混洗(shuffle)数据时使用的分区数。 |
spark.default.parallelism |
对于分布式shuffle操作像reduceByKey和join,父RDD中分区的最大数目。 对于无父RDD的并行化等操作,它取决于群集管理器: -本地模式:本地计算机上的核心数 -Mesos fine grained mode:8 -其他:所有执行节点上的核心总数或2,以较大者为准 |
分布式shuffle操作的分区数 |
看起来它们的定义似乎也很相似,但在实际测试中,
- spark.default.parallelism只有在处理RDD时才会起作用,对Spark SQL的无效。
- spark.sql.shuffle.partitions则是对sparks SQL专用的设置
5. 文件与分区
这个总共有两个参数可以调整:
- 读取文件的时候一个分区接受多少数据;
- 文件打开的开销,通俗理解就是小文件合并的阈值。
文件打开是有开销的,开销的衡量,Spark 采用了一个比较好的方式就是打开文件的开销用,相同时间能扫描的数据的字节数来衡量。
参数介绍如下:
属性 | 默认值 | 描述 |
spark.sql.files.maxPartitionBytes | 134217728 (128 MB) | 打包传入一个分区的最大字节,在读取文件的时候 |
spark.sql.files.openCostInBytes | 4194304 (4 MB) | 用相同时间内可以扫描的数据的大小来衡量打开一个文件的开销。当将多个文件写入同一个分区的时候该参数有用。该值设置大一点有好处,有小文件的分区会比大文件分区处理速度更快(优先调度) |
spark.sql.files.maxPartitionBytes该值的调整要结合你想要的并发度及内存的大小来进行。
spark.sql.files.openCostInBytes说直白一些这个参数就是合并小文件的阈值,小于这个阈值的文件将会合并
6.文件格式
建议使用parquet或者orc。
parquet已经可以达到很大的性能了
spark2.+ sql 性能调优的更多相关文章
- SQL性能调优基础教材
一.数据库体系结构 1. Oracle数据库和实例 数据库:物理操作系统文件或磁盘的集合. 实例:一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程 ...
- mysql之sql性能调优
sql调优大致分为两步:1 如何定位慢查询 2 如何优化sql语句. 一:定位慢查询 -- 显示到mysql数据库的连接数 -- show status like 'connections'; - ...
- OCP读书笔记(15) - 管理SQL性能调优
SQL Tuning Advisor(STA): 使用oracle提供的程序包进行sql优化 SQL> conn scott/tiger SQL), name )); SQL> inser ...
- SQL 性能调优日常积累
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE 的解析器按照从右到左 ...
- SQL 性能调优日常积累【转】
阅读目录 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用 ‘ * ‘ (4)减少访问数据库的次数 (5)在SQL*Plu ...
- DB2 SQL性能调优秘笈
SQL优化技巧 1.去除在谓词列上编写的任何标量函数 2.去除在谓词列上编写的任何数学运算 3.SQL语句的Select部分只写必要的列 4.尽可能不用Distinct 5.尽量将In子查询重写为Ex ...
- SQL优化二(Sql性能调优)
一·.前言:这篇博文内容非原创,是我们公司的架构师给我们做技术培训的时候讲的内容,我稍微整理了下,借花献佛.这篇博文只是做一个大概的科普介绍,毕竟SQL优化的知识太大了,几乎可以用一本书来介绍.另外, ...
- SQL性能调优
部分转自:http://www.cnblogs.com/luckybird/archive/2012/06/11/2544753.html 及http://www.cnblogs.com/kissdo ...
- 【翻译】Flink Table Api & SQL — 性能调优 — 流式聚合
本文翻译自官网:Streaming Aggregation https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table ...
随机推荐
- TFS——更改计算机名称,影响TFS使用
今天把自己电脑的计算机名称改了,打开VS的时候,就提示以下的错误: 报错情况 显示错误:工作区 DADI--20141015Q;SD-SERVER\Administrator 未驻留在此计算机上.如果 ...
- CSS:CSS 导航栏
ylbtech-CSS:CSS 导航栏 1.返回顶部 1. CSS 导航栏 导航栏 熟练使用导航栏,对于任何网站都非常重要. 使用CSS你可以转换成好看的导航栏而不是枯燥的HTML菜单. 导航栏=链接 ...
- 戏说 .NET GDI+系列学习教程(三、Graphics类的应用_打印收银小票)
#region 打印 /// <summary> /// 打印字符串内容 /// </summary> /// <returns></returns> ...
- Day 20: 面向对象【多态,封装,反射】字符串模块导入/内置attr /包装 /授权
面向对象,多态: 有时一个对象会有多种表现形式,比如网站页面有个按钮, 这个按钮的设计可以不一样(单选框.多选框.圆角的点击按钮.直角的点击按钮等),尽管长的不一样,但它们都有一个共同调用方式,就是o ...
- Bootstrap入门及其常用内置实现
BootStrap是一个专门做页面的 1.BS是基于HTML CSS JS 的一个前端框架(半成品) 2.预定义了一套CSS样式与JQurey实现 3.BS和Validation类似,都是JQ的插件, ...
- 【非官方方式】获取Disconf动态更新的配置文件的值
disconf可以配置reload,当更改配置时自动刷新classpath下的配置文件.然而获取最新的值官方说明是加@DisconfFileItem注解放在属性的方法上,底层通过拦截器获取的. 但是每 ...
- Summary 报告
1.需要在添加一个名为summary report的监听器,跑完之后查看 Label:取样器/监听器名称 Samples :事务数量 Average:平均一个完成一个事务消耗的时间(平均响应时间) M ...
- SQLite 小调研
一. 概况: SQLite 是 D. Richard Hipp 于 2000 年采用 C 语言编写的一个轻量级.跨平台的关系型数据库,支持大部分 SQL92 标准(比如视图.事务.触发器.blob 数 ...
- Linux 中 sqlite3 基本操作
https://www.runoob.com/sqlite/sqlite-commands.html 一 .linux 下安装数据库和创建一个数据库 1. Linux 下安装sqlite3 需要两个命 ...
- 开启SSH 使用SSH登录工具连接虚拟机
修改sshd_config文件,命令为:vi /etc/ssh/sshd_config将#PermitRootLogin without-password注释去掉修改为PermitRootLogin ...