Spark---RDD序列化

文章目录

      • [1 什么是序列化](#1 什么是序列化)
      • 2.RDD中的闭包检查
      • [3.Kryo 序列化框架](#3.Kryo 序列化框架)

1 什么是序列化

序列化是指 将对象的状态信息转换为可以存储或传输的形式的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

2.RDD中的闭包检查

从计算的角度, 算子以外的代码都是在 Driver 端执行, 算子里面的代码都是在 Executor端执行。
那么在 scala 的函数式编程中,就会导致算子内经常会用到算子外的数据,这样就形成了闭包的效果,如果使用的算子外的数据无法序列化,就意味着无法传值给 Executor端执行,就会发生错误,所以需要在执行任务计算前,检测闭包内的对象是否可以进行序列化,这个操作我们称之为闭包检测。Scala2.12 版本后闭包编译方式发生了改变。

复制代码
package bigdata.wordcount.xuliehua

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object SerializableDemo01 {
  def main(args: Array[String]): Unit = {
    //1.创建 SparkConf 并设置 App 名称
    val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local")
    val sc: SparkContext = new SparkContext(conf)
    //3.创建一个 RDD
    val rdd: RDD[String] = sc.makeRDD(Array("hello world", "hello spark", "Scala", "Java"))
    //3.1 创建一个 Search 对象
    val search = new Search("h")

	//筛选出单词首字母为h的单词
    search.getMatch1(rdd).collect().foreach(println)
    println("=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
    search.getMatch2(rdd).collect().foreach(println)
    //4.关闭连接
    sc.stop()
  }


}

//在类构造器中以val/var修饰的变量为类的实例变量,在类中调用的时候实际是 实例.变量
//此时rdd内要用到次变量的化,需要进行序列化操作
class Search(var query:String) extends Serializable
{
  def isMatch(s: String): Boolean = {
    s.contains(query)
  }

  // 函数序列化案例
  def getMatch1(rdd: RDD[String]): RDD[String] = {
    rdd.filter(isMatch)
  }

  // 属性序列化案例
  def getMatch2(rdd: RDD[String]): RDD[String] = {
    rdd.filter(x => x.contains(query))
  }

}

如果Search类不实现Serializable特质的话,会通不过闭包检查,报出错误如下:

可以直接定义样例类,因为样例类自动继承了序列化特质,这样也可以通过rdd的闭包检查

复制代码
case class Search(var query:String) 
{
  def isMatch(s: String): Boolean = {
    s.contains(query)
  }

  // 函数序列化案例
  def getMatch1(rdd: RDD[String]): RDD[String] = {
    //rdd.filter(this.isMatch)
    rdd.filter(isMatch)
  }

  // 属性序列化案例
  def getMatch2(rdd: RDD[String]): RDD[String] = {
    //rdd.filter(x => x.contains(this.query))
    rdd.filter(x => x.contains(query))
    //val q = query
    //rdd.filter(x => x.contains(q))
  }
  }

3.Kryo 序列化框架

Java 的序列化能够序列化任何的类。但是比较重(字节多),序列化后,对象的提交也比较大。Spark 出于性能的考虑,Spark2.0 开始支持另外一种 Kryo 序列化机制。Kryo 速度是 Serializable 的 10 倍。当 RDD 在 Shuffle 数据的时候,简单数据类型、数组和字符串类型已经在 Spark 内部使用 Kryo 来序列化。

在使用Kryo序列化框架的时候,也需要继承序列化特质。

Kryo参考

相关推荐
在未来等你11 分钟前
Elasticsearch面试精讲 Day 30:Elasticsearch面试真题解析与答题技巧
大数据·分布式·elasticsearch·搜索引擎·面试
Micra52031 分钟前
8款企业微信SCRM工具功能对比分析
大数据·经验分享
培培说证41 分钟前
2025年大专计算机技术专业就业方向!
大数据
在未来等你1 小时前
Elasticsearch面试精讲 Day 27:备份恢复与灾难恢复
大数据·分布式·elasticsearch·搜索引擎·面试
涛思数据(TDengine)1 小时前
TDengine TSDB 3.3.8.0 上线:SMA、TLS、TDgpt、taosX、taosgen 一次全进化
大数据·数据库·时序数据库·tdengine
研究司马懿1 小时前
【GitOps】Argo CD app of apps
大数据·开发语言·elasticsearch·搜索引擎·云原生·argocd·gitops
qqxhb2 小时前
系统架构设计师备考第49天——数字孪生体&云计算&大数据技术
大数据·系统架构·云计算·saas·paas·iaas·数字孪生体
盖雅工场2 小时前
企业用工成本高、留人难?零工管家以数字化管理实现精准控本与人才留存
大数据
hans汉斯2 小时前
【计算机科学与应用】基于多光谱成像与边缘计算的物流安全风险预警模式及系统实现
大数据·数据库·人工智能·设计模式·机器人·边缘计算·论文笔记
皮皮学姐分享-ppx3 小时前
上市公司CEO IT背景数据(2007-2024)
大数据·人工智能·经验分享·科技·区块链