java登录序列化注册_Spark的Kryo序列化注册

Spark的Kryo序列化注册

Spark序列化可以将RDD序列化来减少内存占用。 对于优化网络性能极为重要

1、java序列化:

spark.serializer=org.apache.spark.serializer.JavaSerializationSpark默认 使用Java自带的ObjectOutputStream 框架来序列化对象,这样任何实现了 java.io.Serializable 接口的对象,都能被序列化。

Java序列化很灵活但性能差速度很慢,同时序列化后占用的字节数也较多。

2、Kryo序列化:

spark.serializer=org.apache.spark.serializer.KryoSerializationKryoSerialization速度快,产生的结果更为紧凑(通常能提高10倍)。

但Kryo不支持所有实现了java.io.Serializable 接口的类型,它需要你在程序中 register 需要序列化的类型,以得到最佳性能。

在 SparkConf 初始化的时候调用

conf.set(“spark.serializer”, “org.apache.spark.serializer.KryoSerializer”)使用 Kryo。这个设置不仅控制各个worker节点之间的混洗数据序列化格式,同时还控制RDD存到磁盘上的序列化格式。

需要在使用时注册需要序列化的类型,建议在对网络敏感的应用场景下使用Kryo。

一个例子:

val sparkConf = new SparkConf()

/*.setMaster("local")*/

.setAppName("Test")

.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

/*.set("spark.kryo.registrationRequired", "true")*/

.registerKryoClasses(Array(

classOf[Array[String]],

classOf[util.HashMap[String, String]],

classOf[util.ArrayList[String]],

classOf[MyTest]

))

在集群跑的时候把/*.set("spark.kryo.registrationRequired", "true")*/注释掉,否则会报如下错误:

Class is not registered: scala.reflect.ClassTag$$anon$1或者Class is not registered: scala.reflect.ManifestFactory$$anon$9 最后,如果你不注册需要序列化的自定义类型,Kryo也能工作,不过每一个对象实例的序列化结果都会包含一份完整的类名,这很浪费没必要的空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值