Spark性能调优——【笔记一】
[课程链接]——https://www.bilibili.com/video/av54322051?p=50
一、常见性能调优
1.最优资源配置
名称 | 说明 |
---|---|
–num-executors | 配置executor的数量,数量增加,同时执行的task数量也增加,并行度增加 |
–driver-memory | 配置Driver内存(影响不大) |
–executor-memory | 配置每个Executor的内存大小 |
–executor-cores | 配置每个Executor的CPU core的数量 |
尽量将任务分配的资源调节到可以使用的资源的最大限度。
--num-executors为Executor的数量;–executor-cores为每个Executor中core的个数,一个core(即Executor中一个CPU core)执行一个task,因此有并发度=Executor数目 * 每个Executor核数 = num-executors * executor-cores = Spark程序同时执行Task的数目;
总内存 = executor-memory * num-executors
名称 | 解析 |
---|---|
增加Executor个数 | 在资源允许的情况下,增加Executor的个数,可以提高task的并行度 |
增加每个Executor的CPU core个数 | 在资源允许的情况下,增加每个Executor的CPU core个数,可以提高执行task的并行度 |
增加每个Executor的内存量 | 在资源运行的情况下,增加每个Executor的内存量后,1.可以缓存更多数据(即对RDD进行cache),写入磁盘的数据相应减少,甚至不写入,减少了可能的磁盘IO;2.为Shuffle提供更多内存,有更多的空间存放reduce端拉取的数据;3.为Task执行提供更多的内存,避免频繁GC |
2.RDD优化
2.1 RDD复用
要避免相同算子和计算逻辑之下对RDD进行重复计算,如:
2.2 RDD持久化
必须对多次使用的RDD进行持久化,通过持久化将公共的RDD数据缓存到内存/磁盘中,之后对于公共RDD的计算都会直接从内存/磁盘中获取数据;
对于RDD的持久化有两点需要说明:
a.RDD的持久化是可以进行序列化的,当内存无法将RDD数据进行完整存放时,可以考虑用序列化的方式减小数据体积,将数据完整的存储在内存中;
b.对数据的可靠性要求很高,并且内存充足,可使用副本机制对RDD数据进行持久化