- 资源调优
① 搭建Spark集群的时候要给Spark集群足够的资源(core,memory)
在spark安装包的conf下spark-env.sh
SPARK_WORKER_CORES --worker节点的可用核数
SPARK_WORKER_MEMORY
SPARK_WORKER_INSTANCE
在提交Application的时候给Application分配更多的资源。
提交命令选项:(在提交Application的时候使用选项)
--executor-cores
--executor-memory
--total-executor-cores
配置信息:(在Application的代码中设置,在Spark-default.conf中设置)
spark.executor.cores
spark.executor.memory
spark.max.cores
- 并行度调优
原则:一个core一般分配2~3个task,每一个task一般处理1G数据(task的复杂度类似wc)
① 提高并行度的方式:
1) .如果读取的数据在HDFS上,降低block块的大小 2) .sc.textFile(path,numPartitions) 3) sc.parallelize(list,numPartitions) 一般用于测试 4) coalesce、repartition可以提高RDD的分区数。 5) 配置信息: spark.default.parallelism not set (默认executor core的总个数) spark.sql.shuffle.partitions 200 6) 自定义分区器
|
- 代码调优
① 避免创建重复的RDD
val rdd1 = sc.textFile(“xxx”)
val rdd2 = sc.textFile(“xxx”)
在执行效率上没有区别,但是代码乱。
② 在其他的job中对于重复使用的RDD要使用持久化算子
cache:
MEMORY_ONLY
persist:
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK_SER
一般不要选择带有_2的持久化级别。
checkpoint:
① 如果一个RDD的计算时间比较长或者计算起来比较复杂,一般将这个RDD的计算结果保存到HDFS上,这样数据会更加安全。
② 如果一个RDD的依赖关系非常长,也会使用checkpoint,会切断依赖关系,提高容错的效率。
③ 尽量使用广播变量
使用广播变量可以大大的降低集群中变量的副本数。
不使用广播变量:变量的副本数和task数一致。
使用广播变量:变量的副本数与Executor数一致。
广播变量最大可以是多大?
ExecutorMemory*60%*90%*80%