Spark 性能调优提高任务效率

  1. 资源调优

①    搭建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

 

  1. 并行度调优

原则:一个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) 自定义分区器

 

 

  1. 代码调优

①     避免创建重复的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%

posted @ 2019-08-02 15:31  HandsomeEric  阅读(2411)  评论(0编辑  收藏  举报