目录

 

采用kryo序列化方式

配置多个临时文件目录

启用推测执行机制

不建议使用collect

RDD操作使用MapPartitions替代map,效率高

根据业务场景,选择合适的垃圾收集器


采用kryo序列化方式

Spark默认使用Java序列化,Java序列化性能比较低、序列化完二进制的内容比较长,造成在网络上传输时间长。Spark也支持kryo,比java序列化快10倍以上,序列化后的二进制内容也比较短。

  • 修改配置文件vim spark-defaults.conf,采用全局化的配置,整个集群采用kryo序列化方式传输数据

Spark ThriftServer 场景 spark thriftserver2优化_序列化

def main(args: Array[String]): Unit = {
    
    val conf=new SparkConf().setMaster("local").setAppName("kryo")
                .set("spark.serializer", 
                    "org.apache.spark.serializer.KryoSerializer")
                //--设定自定义的kryo注册器
                .set("spark.kryo.registrator", 
                    "cn.test.kryo.MykryoRegister")
                    
    val sc=new SparkContext(conf)  
   
    
    val rdd1=sc.makeRDD(List(new Person("tom",23),new Person("rose",25)))
    
    rdd1.persist(StorageLevel.MEMORY_ONLY_SER)
    
    rdd1.unpersist()

  }
/**
 * 自定义的kryo序列化注册器,可以将指定的scala class的序列化变为kryo
 */
class MykryoRegister extends KryoRegistrator {
  
  /*
   * 将指定的scala class变为kryo序列化
   */
  def registerClasses(kryo: Kryo): Unit = {
      
    kryo.register(classOf[Person])
  }
}

 

  • 当前客户端执行启动命令:

sh spark-shell --master=local --conf spark.serializer=org.apache.spark.serializer.KryoSerializer

序列化仅在当前shell窗口有效

  • 代码中设置序列化方式

Spark ThriftServer 场景 spark thriftserver2优化_序列化_02

 

配置多个临时文件目录

修改配置文件:vim spark-env.sh,配置多个临时文件目录

Spark ThriftServer 场景 spark thriftserver2优化_序列化_03

 

这样做的目的是:多个程序读写多个磁盘目录的效率,比多个程序读写一个磁盘目录的效率高

启用推测执行机制

修改配置文件vim spark-defaults.conf,添加配置:spark.speculation  true

Spark ThriftServer 场景 spark thriftserver2优化_默认值_04

 

开启后,spark会检测执行较慢的Task,并复制这个Task在其他节点运行,最后哪个节点先运行完,就用它计算的结果,然后将慢Task 杀死

不建议使用collect

Driver执行Collect() 函数,是将分布在集群中不同分区的数据 ,收集到一台机器上,封装成一个数据包返回给该Driver。数据跨网络传输,不仅占用带宽,也要求Driver服务器有足够大的内存。所以不建议使用Collect。建议使用saveAsTextFile函数把计算结果输出到分布式文件系统

RDD操作使用MapPartitions替代map,效率高

Map函数以每个数据为单位映射,操作每个数据都需要建立和关闭一次连接,频繁的建立网络连接,不仅占用网络资源,也导致系统性能低。MapPartitions函数以每个分区为单位建立连接,网络资源消耗比map低,性能比map高

根据业务场景,选择合适的垃圾收集器

用参数-XX:指定垃圾收集器,例如:-XX:+UseSerialGC、-XX:+UseParallelGC、-XX:+UseConcMarkSweepGC、-XX:+UseG1GC

结合一些参数来配置:

  • -XX:MaxGCPauseMillis=n   设置最大GC停顿时间,这是一个软性指标,JVM 会尽量去达成这个目标.

-XX:InitiatingHeapOccupancyPercent=n      G1之类的垃圾收集器,基于整个堆的使用率,来触发并发GC周期。值为 0 则表示"一直执行GC循环"。默认值为 45,表示堆使用率达到了45%,触发Minor GC。如果调优的角度:此参数应该调小,让Minor GC变多,从而延迟Full GC的到来

  • -XX:NewRatio=n        老生代与新生代的占用比(old/new generation)的大小比例(Ratio). 默认值为 2。G1GC设置此参数无效
  • -XX:SurvivorRatio=n    eden/survivor 空间大小的比例(Ratio). 默认值为 8.
  • -XX:MaxTenuringThreshold=n     老年代的最大临界值(tenuring threshold). 默认值为 15。表示对象存活超过了15代,就被移到老年代
  • -XX:ParallelGCThreads=n      设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同。一般设置的数量=服务器的核数
  • -XX:ConcGCThreads=n        并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同
  • -XX:G1ReservePercent=n       设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10。比如可用内存100GB,假天花板10%,即G1能使用的内存为90GB,预留出10GB,从而降低失败的可能性 
  • -XX:G1HeapRegionSize=n        使用G1时Java堆会被分为大小统一的的区。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb.

上面JVM的参数配置在%SPARK_HOME%/conf/spark-defaults.conf

 

Spark ThriftServer 场景 spark thriftserver2优化_大数据_05