5. Spark调优
*以下内容由《Spark快速大数据分析》整理所得。
读书笔记的第五部分是讲的是Spark调优相关的知识点。
一、并行度调优
二、序列化格式优化
三、内存管理优化
四、Spark SQL性能优化
一、并行度调优
并行度调优有两种方法:
1. 是在数据混洗操作时,使用参数的方式为混洗后的RDD指定并行度。
2. 对于任何已有的RDD,可以进行重新分区来获取更多或者更少的分区数。重新分区操作通过 repartition() 实现,该操作会把 RDD随机打乱并分成设定的分区数目。如果你确定要减少RDD分区,可以使用 coalesce() 操作。由于没有打乱数据,该操作比 repartition() 更为高效。
例子:在PySpark shell中合并分区过多的RDD
# 以可以匹配数千个文件的通配字符串作为输入
>>> input = sc.textFile("s3n://log-files/2014/*.log")
>>> input.getNumPartitions() # 得到分区数
35154
# 排除掉大部分数据的筛选方法
>>> lines = input.filter(lambda line: line.startswith("2014-10-17"))
>>> lines.getNumPartitions()
35154
# 在缓存lines之前先对其进行合并分区操作(即:合并分区->缓存转化操作)
>>> lines = lines.coalesce(5).cache()
>>> lines.getNumPartitions()
4
# 可以在合并之后的RDD上进行后续分析(即:行为操作)
>>> lines.count()
二、序列化格式优化
序列化会在数据进行混洗操作时发生。使用Kryo序列化工具,可以提供比Java的序列化工具更短的序列化时间和更高压缩比的二进制表示。你只需要设置 spark.serializer 为 org.apache.spark.serializer.KryoSerializer 即可。
例子:使用 Kryo 序列化工具并注册所需类
val conf = new SparkConf()
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
三、内存管理优化
内存管理的优化可以从三块地方下手:
1. RDD存储:当调用RDD的 persist() 或cache()方法时,这个RDD的分区会被存储到缓存区中。Spark会根据 spark.storage.memoryFraction 限制用来缓存的内存占整个JVM堆空间的比例大小(默认60%)。如果超出限制,旧的分区数据会被移出内存。
2. 数据混洗与聚合的缓存区:当进行数据混洗操作时,Spark会创建出一些中间缓存区来存储数据混洗的输出数据。根据 spark.shuffle.memoryFraction 限定这种缓存区内存占总内存的比例(默认20%)
3. 用户代码:Spark可以执行任意的用户代码,所以用户的函数可以自行申请大量内存。用户代码可以访问JVM堆空间中除分配给 RDD存储和数据混洗存储以外的全部剩余空间(默认20%)。
注意:如果用户代码中分配了大量的对象,那么降低RDD存储和数据混洗存储所占用的空间可以有效避免程序内存不足的情况。
四、Spark SQL性能调优
beeline> set spark.sql.codegen=true; 可以提高大型查询的性能,但在进行小规模查询时会变慢(即不推荐小的即时查询时用)。
5. Spark调优的更多相关文章
- 【Spark学习】Apache Spark调优
Spark版本:1.1.0 本文系以开源中国社区的译文为基础,结合官方文档翻译修订而来,转载请注明以下链接: http://www.cnblogs.com/zhangningbo/p/4117981. ...
- 【Spark调优】提交job资源参数调优
[场景] Spark提交作业job的时候要指定该job可以使用的CPU.内存等资源参数,生产环境中,任务资源分配不足会导致该job执行中断.失败等问题,所以对Spark的job资源参数分配调优非常重要 ...
- 【Spark调优】大表join大表,少数key导致数据倾斜解决方案
[使用场景] 两个RDD进行join的时候,如果数据量都比较大,那么此时可以sample看下两个RDD中的key分布情况.如果出现数据倾斜,是因为其中某一个RDD中的少数几个key的数据量过大,而另一 ...
- 【Spark调优】小表join大表数据倾斜解决方案
[使用场景] 对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小(例如几百MB或者1~2GB),比较适用此方案. [解决方案] ...
- 【Spark调优】数据倾斜及排查
[数据倾斜及调优概述] 大数据分布式计算中一个常见的棘手问题——数据倾斜: 在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或j ...
- 【Spark调优】Broadcast广播变量
[业务场景] 在Spark的统计开发过程中,肯定会遇到类似小维表join大业务表的场景,或者需要在算子函数中使用外部变量的场景(尤其是大变量,比如100M以上的大集合),那么此时应该使用Spark的广 ...
- 【Spark调优】Kryo序列化
[Java序列化与反序列化] Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程.序列化使用场景:1.数据的持久化,通过序列化可以把数据永久 ...
- 【翻译】Spark 调优 (Tuning Spark) 中文版
由于Spark自己的调优guidance已经覆盖了很多很有价值的点,因此这里直接翻译一份过来.也作为一个积累. Spark 调优 (Tuning Spark) 由于大多数Spark计算任务是在内存中运 ...
- 【Spark调优】Shuffle原理理解与参数调优
[生产实践经验] 生产实践中的切身体会是:影响Spark性能的大BOSS就是shuffle,抓住并解决shuffle这个主要原因,事半功倍. [Shuffle原理学习笔记] 1.未经优化的HashSh ...
- 【Spark调优】:结合业务场景,优选高性能算子
聚合操作使用reduceByKey/aggregateByKey替代groupByKey 参见我的这篇博客说明 [Spark调优]:如果实在要shuffle,使用map侧预聚合的算子 内存充足前提下使 ...
随机推荐
- javascript里面的this指向问题
1:一般情况下this最终指向调用它的那个对象. 2:全局作用域或者普通函数中的this都会指向window. 例1:console.log(this); // 在控制台输出的是BOM顶级对象 wi ...
- go 结构体初始化
package main import "fmt" type Dog struct { Name string } func TestStruct() { // 方式1 //var ...
- spring-boot-route(十九)spring-boot-admin监控服务
SpringBootAdmin不是Spring官方提供的模块,它包含了Client和Server两部分.server部分提供了用户管理界面,client即为被监控的服务.client需要注册到serv ...
- Excel中外部数据链接无法删除的解决方法【转】
[摘要] 当Excel中公式引用了外部数据,每次打开时,总是自动弹出自动更新链接的对话框.如何找到这些链接?有没有办法实现断开原有链接,而保持数值不变? 有客户反应,当Excel无法链接到外部数据后, ...
- SQL报表语句;SQL获取今日、本周、本月数据
SQL报表语句 SQL获取今日.本周.本月数据 本日:select * from table where datediff(dd,C_CALLTIME,getdate())=0 --C ...
- Windows环境下vscode Live Server插件如何开启https
0x01 vscode http插件 Live Server如何开启https 在本机端的开发环境下,如果要测试一些需要HTTPS的功能可以使用mkcert给自己颁发凭证 0x02 安装步骤如下: 1 ...
- 一个鲜为人知但很实用的Windows使用技巧
作为一个电脑党,最无法忍受的就是每次开机都要手动打开那些必要的程序.有没办法让这些程序自动打开呢?今天小编意外地得到了一个方法,现在分享给大家. (以腾讯桌面整理为例) 1,Win + R 2,输入t ...
- 基于.Net Core开发的物联网平台 IoTSharp V1.5 发布
很高兴的宣布新版本的发布, 这次更新我们带来了大量新特性, 最值得关注的是, 我们逐步开始支持分布式, 这意味着你可以通过多台服务器共同处理数据, 而不是原来的单机处理, 我们也将遥测数据进行分开存储 ...
- mysql 必会基础2 distinct
1.插入数据方式 a> insert into student (id, name, age) values (1, 'zhangsan', 3); --字符串类型要用双引号.或单引号引起来,否 ...
- oracle索引失效情况(转)
1.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Orac ...