目录
采用kryo序列化方式
配置多个临时文件目录
启用推测执行机制
不建议使用collect
RDD操作使用MapPartitions替代map,效率高
根据业务场景,选择合适的垃圾收集器
采用kryo序列化方式
Spark默认使用Java序列化,Java序列化性能比较低、序列化完二进制的内容比较长,造成在网络上传输时间长。Spark也支持kryo,比java序列化快10倍以上,序列化后的二进制内容也比较短。
- 修改配置文件vim spark-defaults.conf,采用全局化的配置,整个集群采用kryo序列化方式传输数据
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窗口有效
- 代码中设置序列化方式
配置多个临时文件目录
修改配置文件:vim spark-env.sh,配置多个临时文件目录
这样做的目的是:多个程序读写多个磁盘目录的效率,比多个程序读写一个磁盘目录的效率高
启用推测执行机制
修改配置文件vim spark-defaults.conf,添加配置:spark.speculation true
开启后,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