zoukankan      html  css  js  c++  java
  • spark性能调优点(逐步完善)

    1、使用高性能序列化类库
    2、优化数据结构
    3、对多次使用的RDD进行持久化/CheckPoint
    4、使用序列化的持久化级别
    5、Java虚拟机垃圾回收调优
    降低RDD缓存占用空间的比例:new SparkConf().set("spark.storage.memoryFraction","0.5"),从而提高task使用的内存比例。
    6、提高并行度
    new SparkConf().set("spark.default.parallelism","5")这个参数一旦设定,每个RDD的数据,都会被拆分为5份,针对RDD的partition,一个partition会自动的来进行计算,所以对于所的算子操作,都会创建5个task在集群中运行。
    spark官方推荐,设置集群总cpu的数量的两到三倍的并行度,每个cpu core可能分配到并发运行2-3个task线程,这样集群的状态就不太可能出现空闲的状态。
    小知识:spark会自动设置以文件作为输入源的RDD的并行度,依据其大小,比如:HDFS,就会给每个block创建一个partition,也依据这个设置并行度,对于reduceByKey等会发生shuffle的操作,就使用并行度最大的父RDD的并行度即可。

    7、广播共享数据
    默认情况下,算子函数使用到的外部数据,会被拷贝到时每个task中。如果共享的数据较大,那么每个task都会把这个较大的数据拷贝至自己的节点上。

    8、数据本地化
    数据本地化对spark job性能有着巨大的影响。如果数据以及要计算它的代码是在一起的,那么性能会非常高。但是,如果数据和计算它的代码是分开的,那么其中之一必须到另外一方的机器上。通常来说,移动代码到其他节点,会比移动数据到代码所在的节点上去速度要快很多。因为代码比较小,spark也正是基于这个数据本地化的原则来构建task调度算法的。
    本地化,指的是,数据离计算它的代码有多近,基于数据距离代码的距离,有几种数据本地化级别:
    1)PROCESS_LOCAL:数据和计算它的代码在同一个jvm进程中。
    2)NODE_LOCA:数据和计算它的代码在一个节点上,但是不在一个进程中,比如在不同的executor进程中,或者是数据在HDFS文件的block中。
    3)NO_PREF:数据从哪里过来,性能都是一样的。
    4)RACK_LOCAL:数据和计算它的代码在一个机架上。
    5)ANY:数据可能在任意地方,比如其他网络环境内,或是在其他机架上。
    spark处理partition数据时,首先会尽量的使用最好的本地化的级别去启动task,若启动的节点一直处于忙碌状态,spark会待一会,如果executor有空闲资源了,便会启动task。若等待一会(时间可以通过参数设置),发现没有executor的core释放,那么会放大一个级别去启动这个Task。
    可以设置参数,spark.locality系列参数,来调节spark等待task可以进行数据 本地化的时间。spark.locality.wait(3000ms)、spark.locality.wait.node、spark.locality.wait.process、spark.locality.wait.rack


    9、reduceByKey和groupByKey的合理使用
    如果能使用reduceByKey就使用reduceByKey,因为它会在map端先进行本地combine,可以大大减少传输reduce端的数据量,减少网络传输的开销。只有在ReduceByKey处理不了的时候,才会用groupByKey().map()来替代。


    10、shuffle调优(重中之重)
    spark.shuffle.con.solidateFiles:是否开启shuffle block file的合并,默认是false
    spark.reducer.maxSizeInFlight:reduce task的摘取缓存,默认是48m
    spark.shuffle.file.buffer:map task的写磁盘缓存,默认32K
    spark.shuffle.io.maxRetries:拉取失败的最大重试次数,默认是3次
    spark.shuffle.io.retryWait:拉取失败的重试间隔,默认5s
    spark.shuffle.memoryFraction:用于reduce端聚合的内存比例,默认为0.2,超过比例就会溢出到磁盘上。

  • 相关阅读:
    JS 反射机制及 Reflect 详解
    React Hooks
    深入理解 React setState
    React 函数组件和类组件的区别
    tsconfig.json 编译器配置大全
    React TS 解决不声明变量类型时的报错问题
    JSX onClick 和 HTML onclick 的区别
    深入理解 ES6 Generator
    JS 算法与数据结构之队列
    深入理解 ES6 Proxy
  • 原文地址:https://www.cnblogs.com/runnerjack/p/8999143.html
Copyright © 2011-2022 走看看