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参考

相关推荐
西邮彭于晏1 小时前
Git 标签(Tag)与版本发布完整指南|附全场景命令速查表
大数据·git·elasticsearch
梵构广告1 小时前
平台怎么做品牌营销策划?—品牌营销
大数据·人工智能·平面·品牌策划
AC赳赳老秦1 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
Aloudata1 小时前
Prompt 驱动分析 vs Skill 驱动分析:企业 AI 分析如何从会问走向可复用
大数据·人工智能·数据分析·prompt·skill·语义层
数字化老赵2 小时前
有没有什么好用的AI工具可以用在设备巡检管理的?
大数据·人工智能·设备管理·设备
2401_881203962 小时前
一网统管 | 赋能智慧养老,守护夕阳美好时光
大数据·智慧养老·一网统管
zcmodeltech2 小时前
智能矿井沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的感知-传输-控制一体化方案
服务器·数据库·分布式·stm32·单片机·嵌入式硬件
A hao2 小时前
免校准 XR技术:打造沉浸式显示系统的关键技术
大数据
数据皮皮侠3 小时前
全国乡村旅游重点村DID数据(2000-2026)
大数据·人工智能·搜索引擎·智慧城市·制造·旅游
米瑞格门窗3 小时前
上海系统门窗哪个靠谱
大数据·人工智能·安全·家装·家装建材·系统门窗