Spark不常用的参数调节

内容基本都来自:http://spark.apache.org/docs/1.0.2/tuning.html,自己随手记下来点东西。

数据序列化

对于分布式框架来说,牵扯到数据传输的问题,故序列化问题非常重要。
在spark中,默认采用的是java的序列化(java.io.Serializable),此种序列化的效率较低。建议采用Kryo serialization的序列化方法,但是此种方法的不足之处在于,如果你自己编写了一个类,需要继承自org.apache.spark.serializer.KryoRegistrator才可以。但是这种代价是可以承受的,因为此种序列化方式压缩率高、速度快。综上,其范例代码如下:

import com.esotericsoftware.kryo.Kryo
import org.apache.spark.serializer.KryoRegistrator

class MyRegistrator extends KryoRegistrator {
  override def registerClasses(kryo: Kryo) {
    kryo.register(classOf[MyClass1])
    kryo.register(classOf[MyClass2])
  }
}

val conf = new SparkConf().setMaster(...).setAppName(...)
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryo.registrator", "mypackage.MyRegistrator")
val sc = new SparkContext(conf)

另外一点,当Kryo序列化工作时,需要一个缓冲空间,默认为2Mb,当你的定制类特别大时(假设存了一整张图),则需要改变这个默认参数(spark.kryoserializer.buffer.mb),使这个缓冲区能够容纳下任意的定制类,不会发生溢出问题。

内存

内存消耗主要分为三个部分:
实际数据结构占用的空间、访问这个数据结构所需要的空间、垃圾回收所需要的空间。
默认情况下,我们是可以较快的访问java对象的,但这是一定量的额外空间消耗做到的。

  1. 确定你本身数据结构的空间消耗
    这部分空间是无法减少的,每当你产生一个RDD时,会看到如下信息:
INFO BlockManagerMasterActor: Added rdd_0_1 in memory on mbk.local:50311 (size: 717.5 KB, free: 332.3 MB)

这表示在分区1的rdd 0消耗了717.5KB
2. 调整你的数据结构
a、官方建议把java原生的set容器之类的用fastutil的实现版本,据说这个版本的内存消耗更小。
b、避免你的数据结构太过于零散
c、如果你的内存机器小雨32GB,可以在JVM中添加命令-xx:+UseCompressedOops命令,把原本8位的对象指针压缩为4位。
d、少用string当做key,除非你不得不这么做。。

  1. 其他
    其他几种方法觉得略不实用,感兴趣的可以去原文看下。

Thanks

你可能感兴趣的:(spark)