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.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.storage.StorageLevel

object KryoDriver {

def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster(“local”).setAppName(“kryoTest”)
.set(“spark.serializer”, “org.apache.spark.serializer.KryoSerializer”)
.set(“spark.kryo.registrator”, “cn.tedu.MyKryoRegister”)
val sc = new SparkContext(conf)

val data=sc.textFile("d://people.txt")

val userData=data.map { x => new Person(x.split(" ")(0),x.split(" ")(1).toInt) }

userData.persist(StorageLevel.MEMORY_AND_DISK)

userData.foreach(x=>println(x.name))

}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章