• 【Spark调优】Kryo序列化


    【Java序列化与反序列化】

    Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。
    序列化使用场景:
    1.数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里)。
    2.远程通信,即在网络上传送对象的字节序列。

    这篇文章写的不错https://blog.csdn.net/wangloveall/article/details/7992448

    【Spark序列化与反序列化场景】

    在Spark中,主要有三个地方涉及序列化与反序列化:
    1.在算子中使用到广播变量broadcast时,该变量会被序列化后进行网络传输。
    2.自定义对象的类型作为RDD的泛型类型时,例如JavaRDD<Student>,所有自定义类型对象,都会进行序列化,所以要求自定义类必须实现Serializable接口。
    3.使用可序列化的持久化策略时,例如MEMORY_ONLY_SER,Spark会将RDD中的每个partition都序列化成一个大的字节数组。

     

    【Spark序列化与反序列化机制】

      Spark默认使用的是Java的序列化机制,也就是ObjectOutputStream、ObjectInputStream API来进行序列化和反序列化。

      Spark也支持使用Kryo序列化库,Kryo序列化类库的性能比Java序列化类库的性能要高很多。据官方介绍,Kryo序列化机制比Java序列化机制性能高10倍左右。

      那么,对于上述3种Spark有序列化处理的方法,建议使用Kryo序列化类库,优化序列化和反序列化的性能。

      Spark之所以默认没有使用Kryo作为序列化类库,是因为Kryo要求最好要注册所有需要进行序列化的自定义类型,使用上略微繁琐,但并不麻烦。

    【Spark使用Kryo序列化与反序列化】

    例如,Student和School是自定义的2个类,Kryo使用注意点

    SparkConf().set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    
    Scala:
    val conf = new SparkConf().setMaster(...).setAppName(...)
    conf.registerKryoClasses(Array(classOf[Student], classOf[School]))
    val sc = new SparkContext(conf)
    
    Java:
    SparkConf conf = new SparkConf().setMaster(...).setAppName(...)
    conf.registerKryoClasses(Student.class, School.class)
    JavaSparkContext sc = new JavaSparkContext(conf)
    

      此外

      1.Spark参数 spark.kryoserializer.buffer.mb=2,默认值为2,是指配置Kryo默认最大能缓存2M的对象,然后再进行序列化。

      如果注册的要序列化的自定义的Class类型,本身特别大,比如包含的属性过百,会导致要序列化的对象过大。此时,可使用SparkConf.set()方法,设置spark.kryoserializer.buffer.mb参数的值,将其调大来解决。

      2.在SparkStreaming2.4.0与Kafka2.1.1集成编码中遇到过一个问题:开始没指定序列化,日志中看到有Serialize的报错,抱着试试看的心态,设置为kryo序列化方式,set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"),问题得以解决。

      我的代码实践:https://github.com/wwcom614/Spark

     

      下一篇:【Spark调优】提交job资源参数调优 

      上一篇:【Spark调优】内存模型与参数调优

  • 相关阅读:
    算法导论习题
    org.apache.subversion.javahl.ClientException: Item is not readable 解决办法
    nginx安装部署
    tomcat+jdk安装部署
    sql基本知识
    javascript权威指南学习笔记
    JAVA设计模式之---工厂模式
    Effective Java 之 --- 用私有构造器或者枚举类型强化Singleton属性
    接口中定义变量必须为public static final的原因
    对List中每个对象元素按时间顺序排序
  • 原文地址:https://www.cnblogs.com/wwcom123/p/10555594.html
Copyright © 2020-2023  润新知