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 性能调优的更多相关文章

  1. SQL性能调优基础教材

    一.数据库体系结构 1.       Oracle数据库和实例 数据库:物理操作系统文件或磁盘的集合. 实例:一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程 ...

  2. mysql之sql性能调优

    sql调优大致分为两步:1 如何定位慢查询   2 如何优化sql语句. 一:定位慢查询 -- 显示到mysql数据库的连接数 -- show status like 'connections'; - ...

  3. OCP读书笔记(15) - 管理SQL性能调优

    SQL Tuning Advisor(STA): 使用oracle提供的程序包进行sql优化 SQL> conn scott/tiger SQL), name )); SQL> inser ...

  4. SQL 性能调优日常积累

    我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE 的解析器按照从右到左 ...

  5. SQL 性能调优日常积累【转】

    阅读目录 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用 ‘ * ‘ (4)减少访问数据库的次数 (5)在SQL*Plu ...

  6. DB2 SQL性能调优秘笈

    SQL优化技巧 1.去除在谓词列上编写的任何标量函数 2.去除在谓词列上编写的任何数学运算 3.SQL语句的Select部分只写必要的列 4.尽可能不用Distinct 5.尽量将In子查询重写为Ex ...

  7. SQL优化二(Sql性能调优)

    一·.前言:这篇博文内容非原创,是我们公司的架构师给我们做技术培训的时候讲的内容,我稍微整理了下,借花献佛.这篇博文只是做一个大概的科普介绍,毕竟SQL优化的知识太大了,几乎可以用一本书来介绍.另外, ...

  8. SQL性能调优

    部分转自:http://www.cnblogs.com/luckybird/archive/2012/06/11/2544753.html 及http://www.cnblogs.com/kissdo ...

  9. 【翻译】Flink Table Api & SQL — 性能调优 — 流式聚合

    本文翻译自官网:Streaming Aggregation  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table ...

随机推荐

  1. JXOI2017 加法

    题目描述: 可怜有一个长度为 \(n\) 的正整数序列 \(A\),但是她觉得 \(A\) 中的数字太小了,这让她很不开心. 于是她选择了 \(m\) 个区间 \([l_i, r_i]\) 和两个正整 ...

  2. MVC 中对返回的 data 进行压缩

    在webAPI 中返回数据,在数据量比较大的情况的下,返回的data 也可能比较大,有时候可能大于1兆,因此对数据进行压缩能极大的提高数据下载到客户端的时间,提高页面的加载速度. 思路: 在web a ...

  3. 关闭windows的DEP

    1.与开启dep时一样,按组合键win+r打开运行窗口,输入cmd并按回车,如图所示:    2.调出命令提示符窗口后,输入bcdedit.exe/set {current} nx AlwaysOff ...

  4. 2019 牛客多校第六场 D Move

    题目链接:https://ac.nowcoder.com/acm/contest/886/D 题解摘自官方题解 题目大意 有 K 个体积相同的箱子,有 N 个体积相同或相异的物品,现要按照如下策略装箱 ...

  5. shell 检查文件夹是否包含文件,或者只是空文件

    empty_dir_check(){ check_dir=$ if [ -d $check_dir ];then file_list=` -maxdepth -type f` if [ $file_l ...

  6. Nginx学习——简介及常用命令

    Nginx简介 Nginx是什么 同Apache一样,都是一种WEB服务器 基于REST架构风格,以统一资源描述符(URI)或者统一资源定位符(URL)作为沟通依据,通过HTTP协议提供各种网络服务 ...

  7. ASP.Net 第一天笔记 MVC 控制器与视图数据传递注意事项

    1.如果方法的参数的名称与表单元素Name属性的值一致的话,会自动填充 2.如果表单元素的Name属性与实体类型中属性一致,那么表单中的数据会自动赋值给实体中的属性 3.控制器中重载的方法 方法前上边 ...

  8. openssl编译方法

    受不了了,终于编译成功了openssl,写一下编译方法吧 准备: 0:要编译openssl,必不可少的是代码,去下载 https://www.openssl.org/source/ 1:要有一个VS系 ...

  9. 试探回溯法(backtracking)

    一.八皇后问题 国际象棋中皇后的势力范围覆盖其所在的水平线.垂直线以及两条对角线.现考查如下问题:在n*n的棋盘上放置n个皇后,如何使得她们彼此互不攻击,此时称她们构成一个可行的棋局.对于任何整数n ...

  10. css的3d注意事项

    1,如果要写出立体效果,所有的父容器都要添加属性transform-style: preserve-3d;不然子元素不能进行3d变换:背景色要写到最外层容器,且不能有transform-style: ...