Spark优化
2020-08-18 18:20:59 1 举报
AI智能生成
Spark优化
作者其他创作
大纲/内容
Spark优化
资源调优
在部署Spark集群中指定资源分配的默认参数
Spark_worker_cores
spark_worker_memory
spark_worker_instances
在提交Application的时候给当前的Application分配更多资源
动态分派资源(代码)
提交命令选项(任务提交)
配置信息(配置文件)
并行度调优
读取数据在hdfs中,降低block大小,提高了RDD中partition个数
sc.parallelize
sc.makeRDD
sc.parallelizePair
repartions/coalesce
增大分区和减少分区
产生shuffle和不产生shuffle
redecBuKey/groupByKey/join
reducByKey预聚合操作
groupByKey分区聚合
spark.default.parallelism net set
设置默认分区数
只属于RDD
spark.sql.shuffle.partitions---200
配置在为连接或聚合转移数据时要使用的分区数
只属于Spark sql
如果读取数据是在SparkStreaming中
Receiver
spark.streaming.blockInterval—200ms
Direct
读取的topic的分区数
代码调优
避免重复的RDD
对多次使用的RDD进行持久化操作
cache
持久化到内存
persist
可选择持久化级别
checkpoint
载入点
切断RDD之间的依赖关系
shuffle
避免使用shuffle算子
使用预聚合的shuffle算子
reduceByKey
aggregateByKey
combinerByKey
尽量使用高性能算子
使用reduceByKey代替groupBykey
使用mapPartition代替map
使用foreachPartition代替map
filter后使用coalesce减少分区
使用repartition和coalesce算子操作分区
使用广播变量
较少网络传输性能开销,用时降低Executor内存的占用开销,较少gc频率
使用Kryo优化序列化性能
速度快,体积小,需要手动注册需要进行序列化的自定义类型
优化数据结构
字符串代替对象
数组代替集合类型
使用高性能的库fastutil
JDK原生类型占内存太大,使用fastutil可以直观减少内存
数据本地化
数据本地化级别
PROCESS_LOCAL
task要计算的数据在本进程(Executor)的内存中
NODE_LOCAL
task所计算的数据在本节点所在的磁盘上
task所计算的数据在本节点所在的磁盘上。
NO_PREF
task所计算的数据在关系型数据库中,如mysql
RACK_LOCAL
task所计算的数据在同机架的不同节点的磁盘或者Executor进程的内存中
ANY
跨机架
每分发失败后,会重新发送,每3秒一次,默认重试5次
Spark数据本地化调优
可以增加每次发送task的等待时间,将3秒倍数调大
内存调优
JVM垃圾回收机制
vjm垃圾回收机制
年轻代
老年代
提高Executor总体内存大小
降低储存内存比例或者降低聚合内存比例
Spark Shuffle调优
buffer大小--默认32k
shuffle read拉取数据量的大小--默认48M
shuffle聚合内存的比例--默认20%
拉取数据重试次数--默认5次
重试间隔时间--默认60s
Spark Shuffle的种类
hashshuffle
sortshuffle
SortShuffle bypass机制
调节Executor的堆外内存
堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。
yarn下
--conf spark.yarn.executor.memoryOverhead=2048 单位M
standalone下
--conf spark.executor.memoryOverhead=2048单位M
解决数据倾斜
使用Hive ETL预处理
甩锅给hive
过滤少数导致倾斜的Key
不要这些Key了
提高shuffle操作的并行度
将任务多分配给几个人,一起做
双重聚合
范围随机数+key = KEY
将reduce join转为mapjoin
预聚合操作
采样倾斜key并拆分Join
单独给倾斜数据的key 进行范围随机数+key
使用随机前缀和扩容RDD进行join
0 条评论
下一页