Scala | Spark性能优化 | 资源调优 | 代码调优 | 数据本地化 | 内存调优 | Spark Shuffle调优 | 数据倾斜 | Spark故障解决

文章目录

    • 一、资源调优
    • 二、并行度调优
    • 三、代码调优
      • 1.避免创建重复的 RDD
      • 2.对多次使用的 RDD 进行持久化
      • 3.持久化算子:
      • 4.尽量避免使用 shuffle 类的算子
      • 5.使用 map-side 预聚合的 shuffle 操作
      • 5.尽量使用高性能的算子
      • 6.使用广播变量
      • 7.使用 Kryo 优化序列化性能
      • 8.优化数据结构
      • 9.使用高性能的库 fastutil
    • 四、数据本地化
      • 1.数据本地化的级别
      • 2.Spark 数据本地化调优
    • 五、内存调优
      • 1.总结-堆内存不足造成的影响
      • 2.Spark 中如何内存调优?
      • 3.调节 Executor 的堆外内存
    • 六、Spark Shuffle 调优
    • 七、解决数据倾斜
      • 1.使用 Hive ETL 预处理数据
      • 2.过滤少数导致倾斜的 key
      • 3.提高 shuffle 操作的并行度
      • 4.双重聚合
      • 5.使用广播变量替代 Join
      • 6.采样倾斜 key 并分拆 join 操作
      • 7.使用随机前缀和扩容 RDD 进行 join
    • 八、 Spark 故障解决(troubleshooting)


  • 课件视频地址:【优极限】Spark实战性能优化_spark通俗易懂教程_spark优化广播变量

一、资源调优

  下面了解在standalone模型下的资源调优,最大就最好。

  1. 在部署 spark 集群中指定资源分配的默认参数
    spark 安装包的 conf spark-env.sh

    SPARK_WORKER_CORES
    SPARK_WORKER_MEMORY
    SPARK_WORKER_INSTANCES 每台机器启动 worker 数
    
  2. 在提交 Application 的时候给当前的 Application 分配更多的资源
    提交命令选项:(在提交 Application 的时候使用选项)

    --executor-cores
    --executor-memory
    --total-executor-cores
    

    配置信息:(Application 的代码中设置或在 Spark-default.conf 中设置)

    spark.executor.cores
    spark. executor.memory
    spark.max.cores
    
  3. 动态分配资源

    spark.shuffle.service.enabled true //启用 External shuffle Service 服务
    spark.shuffle.service.port 7337 //Shuffle Service 服务端口,必须和yarn-site 中的一致
    spark.dynamicAllocation.enabled true //开启动态资源分配
    spark.dynamicAllocation.minExecutors 1 //每个Application最小分配的executor数
    spark.dynamicAllocation.maxExecutors 30 //每个Application最大并发分配的executor数
    spark.dynamicAllocation.schedulerBacklogTimeout 1s
    spark.dynamicAllocation.sustainedSchedulerBacklogTimeout 5s
    

yarn命令:

/opt/lzj/sparkhome/bin/spark-submit \
--class 主类 \
-master yarn-cluster \
-num-executors 100 \
-executor-cores 4 \
-driver-cores 4 \
-driver-memory 6g \
-executor-memory 8d \
-quene root. default \
--conf 
jar包路径
[主类运行所需参数]\

二、并行度调优

  并行度的合理调整,可以降低资源浪费,提高spark任务的运行效率。task的数量应该设置为sparkCPU cores(总核数)的2-3倍。并行度设置的是task的并行度。

  1. 如果读取的数据在 HDFS 中,降低 block 大小,相当于提高了 RDDpartition 个数 sc.textFile(xx,numPartitions)

  2. sc.parallelize(xxx, numPartitions)

  3. sc.makeRDD(xxx, numPartitions)

  4. sc.parallelizePairs(xxx, numPartitions)

  5. repartions/coalesce
    repartions增加分区;coalesce减小分区,一般与filter搭配

  6. redecByKey/groupByKey/join ---(xxx, numPartitions)
    这几个算子都是会产生shuffle的算子。

  7. spark.default.parallelism 500

  8. spark.sql.shuffle.partitions 200
    spark.default.parallelism并行度调节对sparksql无效(即这个并行度只要是没有使用sparkSqlstage中都会生效)。一般我们的操作就是使用repartition去增大sparksql查询出的rdd的分区数。

  9. 自定义分区器

  10. 如果读取数据是在 SparkStreaming
    Receiver: spark.streaming.blockInterval—200ms定义的是max
    Direct:读取的 topic 的分区数

三、代码调优

1.避免创建重复的 RDD

val rdd1 = sc.textFile(path1)
val rdd2 = sc.textFile(path1)

这就是创建了重复的 RDD。有什么问题? 对于执行性能来说没有问题,但是呢,代码乱。

2.对多次使用的 RDD 进行持久化

  如何选择一种最合适的持久化策略
  默认情况下,性能最高的当然是 MEMORY_ONLY,但前提是你的内存必须足够足够大,可以绰绰有余地存放下整个 RDD 的所有数据

你可能感兴趣的:(Spark,spark,scala,性能优化)