Spark调优
更好的序列化实现
Spark用到序列化的地方
1)Shuffle时需要将对象写入到外部的临时文件。
2)每个Partition中的数据要发送到worker上,spark先把RDD包装成task对象,将task通过网络发给worker。
3)RDD如果支持内存+硬盘,只要往硬盘中写数据也会涉及序列化。
默认使用的是java的序列化。但java的序列化有两个问题,一个是性能相对比较低,另外它序列化完二进制的内容长度也比较大,造成网络传输时间拉长。业界现在有很多更好的实现,如kryo,比java的序列化快10倍以上。而且生成内容长度也短。时间快,空间小,自然选择它了。
方法一:修改spark-defaults.conf配置文件
设置:
spark.serializer org.apache.spark.serializer.KryoSerializer
注意:用空格隔开
方法二:启动spark-shell或者spark-submit时配置
–conf spark.serializer=org.apache.spark.serializer.KryoSerializer
方法三:在代码中
val conf = new SparkConf()
conf.set(“spark.serializer”,“org.apache.spark.serializer.KryoSerializer”)
三种方式实现效果相同,优先级越来越高。
通过代码使用Kryo
文件数据:
rose 23
tom 25
Person类代码:
class Person(var1:String,var2:Int) extends Serializable{
var name=var1 var age=var2
}
MyKryoRegister类代码:
import org.apache.spark.serializer.KryoRegistrator import com.esotericsoftware.kryo.Kryo
class MyKryoRegister extends KryoRegistrator { def registerClasses(kryo: Kryo): Unit = { kryo.register(classOf[Person])
}
}
KryoDriver代码:
import org.apache.spa