[Spark] - SparkCore程序优化总结
http://spark.apache.org/docs/1.6.1/tuning.html
1) 代码优化
a. 对于多次使用的RDD,进行数据持久化操作(eg: cache、persist)
b. 如果对同一个份数据进行操作,那么尽量公用一个RDD
c. 优先使用reduceByKey和aggregateByKey取代groupByKey
原因:前两个API存在combiner,可以降低数据量;groupByKey可能存在OOM异常
d. 对于Executor使用到Driver中的变量的情况,使用广播变量进行数据传递, 可以减少网络传输量,原理是:使用广播变量后,原来Driver传递给Task的数据,变成只需要传递给Executor即可。
e. 当大表join小表,而且存在shuffle的时候,可以考虑使用map join来进行替换<使用广播变量将小表的数据广播出去,前提:Driver和单个的Executor的内存可以存储下小表的数据>;
h. 启动kyro序列化机制
2) 资源优化
a. spark-submit脚本相关参数
driver的内存:--driver-memory
driver的cpu:
standalone(cluster):--driver-cores
yarn(cluster): --driver-cores
executor的数量:
yarn: --num-executors
总的executor的CPU数量:
standalone/mesos:--total-executor-cores
单个executor的内存:--executor-memory
单个executor的cpu:
standalone/yarn:--executor-cores
b. 资源相关参数
spark.driver.cores:1
spark.driver.memory:1g
spark.executor.cores:1(yarn)/all(standalone)
spark.executor.memory:1g
spark.memory.fraction:0.75
spark.memory.storageFraction:0.5
Spark中执行和缓存的内存是公用的,执行可以争夺缓存的内存,就是可以将部分缓存自动清楚,用于执行过程中使用内存;这两个参数的含义分别是:spark.memory.fraction指定总内存占比((1g-300M)*0.75),spark.memory.storageFraction指定缓存部分最少占比内存((1g-300M)*0.75*0.5);当没有执行的情况下,缓存可以使用全部的公用内存,即缓存最多使用((1g-300M)*0.75),最少可占用((1g-300M)*0.75*0.5)
1.5版本以前的采用固定内存设置:spark.storage.memoryFraction(0.6)以及spark.shuffle.memoryFraction(0.2)
spark.default.parallelism: 默认的分区数量,默认两个,一般比较小;在实际环境中一般需要改大。
spark.scheduler.mode:FIFO(默认,先进先出)/FAIR(公平调度)
spark.task.cpus:每个Task执行需要的CPU数量(默认值1)
spark.task.maxFailures:每个Task允许的最大失败次数(默认值4)
spark.dynamicAllocation.enabled: false; 是否启动动态分配资源,默认为不启动
spark.shuffle.service.enabled:false,当启动动态资源分配的时候,该参数必须设置为true,表示允许额外的shuffle服务管理
spark.dynamicAllocation.initialExecutors:动态资源初始executor数量
spark.dynamicAllocation.maxExecutors:动态资源设置最大允许分配资源
spark.dynamicAllocation.minExecutors:动态资源设置最小允许分配资源,默认(0)
Spark on Yarn:
spark.yarn.am.memory:512m; 运行在Yarn上的时候ApplicationMaster运行的内存大小(client模式下)
spark.yarn.am.cores:1; ApplicationMaster运行的CPU核数(client模式下)
spark.executor.instances: Executor的数量,默认2个;该参数和动态参数参数互斥,当两者都存在的时候,动态参数设置无效。
3) 数据倾斜优化
a. 两阶段聚合
b. 使用MAP JOIN替代REDUCE JOIN
c. 数据重分区(更改分区数量)
e. 扩容RDD及随机前缀JOIN方式
4) shuffle过程优化(两种ShuffleManager,四种模式一定要懂)
a. spark.shuffle.file.buffer:32k; 数据溢出磁盘的缓冲区内存大小
b. spark.shuffle.manager: sort; 给定数据
shuffle的管理器,sort(基于排序规则)或者hash(基于Hash值)
c. spark.shuffle.sort.bypassMergeThreshold: 200; 当分区数量小于该值的时候,启动SortShuffleManager中的bypass模式
d. spark.shuffle.consolidateFiles: false; 当该参数为true的时候,使用hash shuffle的时候,可以提高shuffle速度,原理是:合并shuffle过程中的数据输出文件
[Spark] - SparkCore程序优化总结的更多相关文章
- Spark Streaming的优化之路—从Receiver到Direct模式
作者:个推数据研发工程师 学长 1 业务背景 随着大数据的快速发展,业务场景越来越复杂,离线式的批处理框架MapReduce已经不能满足业务,大量的场景需要实时的数据处理结果来进行分析.决 ...
- spark新能优化之序列化
概叙: 在任何分布式系统中,序列化都是扮演着一个重要的角色的.如果使用的序列化技术,在执行序列化操作的时候很慢,或者是序列化后的数据还是很大,那么会让分布式应用程序的性能下降很多.所以,进行Spark ...
- 使用Java编写并运行Spark应用程序
我们首先提出这样一个简单的需求: 现在要分析某网站的访问日志信息,统计来自不同IP的用户访问的次数,从而通过Geo信息来获得来访用户所在国家地区分布状况.这里我拿我网站的日志记录行示例,如下所示: 1 ...
- [大数据从入门到放弃系列教程]第一个spark分析程序
[大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...
- [转] - Spark排错与优化
Spark排错与优化 http://blog.csdn.net/lsshlsw/article/details/49155087 一. 运维 1. Master挂掉,standby重启也失效 Mast ...
- 一次Spark应用程序参数优化案例
并行度 对于*ByKey等需要shuffle而生成的RDD,其Partition数量依如下顺序确定:1. 方法的第二个参数 > 2. spark.default.parallelism参数 &g ...
- Spark实践 -- 性能优化基础
性能调优相关的原理讲解.经验总结: 掌握一整套Spark企业级性能调优解决方案:而不只是简单的一些性能调优技巧. 针对写好的spark作业,实施一整套数据倾斜解决方案:实际经验中积累的数据倾斜现象的表 ...
- intel关于spark gc的优化建议
Apache Spark由于其出色的性能.简单的接口和丰富的分析和计算库而获得了广泛的行业应用.与大数据生态系统中的许多项目一样,Spark在Java虚拟机(JVM)上运行.因为Spark可以在内存中 ...
- spark 集群优化
只有满怀自信的人,能在任何地方都怀有自信,沉浸在生活中,并认识自己的意志. 前言 最近公司有一个生产的小集群,专门用于运行spark作业.但是偶尔会因为nn或dn压力过大而导致作业checkpoint ...
随机推荐
- 如何使用Ninja快速编译LLVM和Clang
在使用Make工具编译LLVM是非常耗时的.往往需要三四个小时.但是使用goolge开源的ninja编译LLVM只需要10到20分钟. 本文以llvm3.3为例,演示在linux上编译和安装过程. 第 ...
- SSM框架整合(注解)-Spring+SpringMVC+MyBatis+MySql
准备工作: 下载整合所需的jar包 点击此处下载 使用MyBatis Generator生成dao接口.映射文件和实体类 如何生成 搭建过程: 先来看一下项目的 目录结构 1.配置dispatcher ...
- Ubuntu14.04 安装Oracle JDK
在Ubuntu 14.04 中安装 Oracle JDK6,7 或 8. 准备:添加add-apt-repository工具 #apt-get install python-software-prop ...
- JSTL标签之c:foreach,c:if标签小结
<c:forEach>标签用于通用数据循环,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 开始条件 否 0 end 结束条件 否 集合中的 ...
- PHP使用hash_algos函数计算哈希值,之间的性能排序
PHP从5.1.2版本以上开始支持hash_algos函数,看这个名字就知道了,algos在英文中也表示算法的意思,hash_algos就是哈希算法,收集了一些常用的哈希算法,从5.1.2开始不同版本 ...
- iOS视频压缩处理
最近忙于项目开发, 昨天才完成整个项目的开发, 今天就抽出时间, 分享一下我在开发中所涉及到的技术问题! 由于近期开发涉及到视频, 所以视频压缩, 上传, 播放等一系列功能都是要涉及到的, 所以在此, ...
- VS Code C# 插件离线版 1.6.2
VS Code C# 插件离线版,目前最新稳定版为:1.6.2 . 由于在扩展中下载C#插件总是缓慢,或者容易出现错误,特制作离线版本共享出来. 本离线版本为Windows版本,其他系统请在扩展中下载 ...
- Odoo安装
打开终端机0. sudo passwd root #设定超级使用者密码1. sudo apt-get update #更新软件源2. sudo apt-get dist-upgrade #更新软件包, ...
- path和classpath的用途
1 path很明显是unix shell的环境变量,比如bash shell,输入一个命令,它会先去path指定的目录下查找是不是有该命令的可执行文件. 2 -classpath 只是用在下面这种不发 ...
- Java显式锁学习总结之二:使用AbstractQueuedSynchronizer构建同步组件
Jdk1.5中包含了并发大神Doug Lea写的并发工具包java.util.concurrent,这个工具包中包含了显示锁和其他的实用同步组件.Doug Lea在构建锁和组件的时候,大多是以队列同步 ...