Spark的序列化

server/2024/10/18 6:33:36/
对象的序列化:		对象转换为字节序列的过程.
对象的反序列化:	字节序列恢复为对象的过程.
通俗地说序列化就是把内存(jvm)中一个对象的状态通过网络进行传输或者保存到磁盘上,反序列化与之相反.
spark中的序列化:
在spark2.0+版本的官方文档中提到:spark默认提供了两个序列化库,Java自身的序列化和Kryo序列化.
官网的解释是:java序列化灵活,但是速度缓慢;Kryo序列化速度更快且更紧凑,但是支持的类型较少.

Serializable

当使用Serializable方案的时候,你的对象必须继承Serializable接口,类中的属性如果有实例,那也必须是继承Serializable是可序列化的.
如果实在无法序列化那就用transient修饰的;
java代码是在修饰属性的最前面使用transient(短暂的)关键字,scala代码是在修饰属性的最前面使用@transient.
transient的作用是在Serializable序列化的时候,声明某个属性不参与序列化,带来的问题就是如果声明了属性不参与序列化,那这个属性存储的数据也带不过去了.

kryo

代码中设置conf.set("spark.serializer",classOf[KryoSerializer].getName)时,这时spark的全局序列化工具就变成了KryoSerializer而不是默认的Serializable方案了.
在生产过程中使用这个设置更简便明了,不需要进行那么多的注册。
当不设置conf.set("spark.kryo.registrationRequired","true")时,spark的所有对象都默认使用KryoSerializer序列化,设置的时候需要对要进行序列化的对象进行注册.
conf.set("spark.serializer", classOf[KryoSerializer].getName)
当设置了conf.set("spark.kryo.registrationRequired","true")时,spark中想被KryoSerializer序列化的对象必须得进行注册;注册方法如下:
val classes: Array[Class[_]] = Array[Class[_]](classOf[ORCUtil],classOf[StructObjectInspector],classOf[OrcStruct])
conf.set("spark.serializer", classOf[KryoSerializer].getName)
conf.set("spark.kryo.registrationRequired","true")
conf.registerKryoClasses(classes)
package RDD
import com.esotericsoftware.kryo.Kryo
import com.esotericsoftware.kryo.serializers.DefaultArraySerializers.IntArraySerializer
import org.apache.hadoop.hive.ql.io.orc.OrcStruct
import org.apache.hadoop.io.Text
import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.serializer.{KryoRegistrator, KryoSerializer}
import org.apache.spark.{SparkConf, SparkContext}
import util.ORCUtilclass MyRegistrator extends KryoRegistrator {override def registerClasses(kryo: Kryo): Unit = {// 注册序列化类kryo.register(Class.forName("scala.reflect.ClassTag$$anon$1"))kryo.register(Class.forName("java.lang.Class"))kryo.register(Class.forName("scala.collection.mutable.WrappedArray$ofInt"))kryo.register(classOf[Array[Int]],new IntArraySerializer)}
}
class MapJoinKryo
object MapJoinKryo {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setAppName("MapJoin").setMaster("local[*]")val classes: Array[Class[_]] = Array[Class[_]](classOf[ORCUtil],classOf[OrcStruct],classOf[Text])conf.set("spark.serializer", classOf[KryoSerializer].getName) //设置kryo为序列化方式conf.set("spark.kryo.registrationRequired","true")conf.set("spark.kryo.registrator","RDD.MyRegistrator")conf.registerKryoClasses(classes)val sc = new SparkContext(conf)val orcUtil = new ORCUtilval broadCast: Broadcast[ORCUtil] = sc.broadcast(orcUtil)val rdd: RDD[Int] = sc.parallelize(List(1,2))val value: RDD[(ORCUtil,Iterable[String])] = rdd.map(f => {val orcUtil = broadCast.value(orcUtil,"")}).groupByKey()value.take(200).map(println)}
}

http://www.ppmy.cn/server/47719.html

相关文章

最新百度专用站群seo官网程序源码二级泛程序

发布站专用站群SEO推广网站源码支持泛解析无限扩张功能: 1、支持伪静态功能,减少生成静态页增加网站内容,比动态网站更有利于网站收录。 2、支持百度seo优化效果,主动提交百度收录,可生成sitemap.xml文件提交百度减少…

【ArcGIS微课1000例】0116:将度-分-秒值转换为十进制度值(字段计算器VBA)

相关阅读:【ArcGIS微课1000例】0087:经纬度格式转换(度分秒转度、度转度分秒) 文章目录 一、计算方法二、计算案例一、计算方法 将度分秒转换为十进制度的简单等式: DD = (Seconds/3600) + (Minutes/60) + Degrees如果角度值是负数,则转换方法不同。其中一种方法是:

EasyRecovery数据恢复软件具有哪些功能特点?2025版本啥时候更新

在数字化时代,数据的重要性不言而喻。无论是个人还是企业,我们每天都产生大量的数据,包括文档、照片、视频等。然而,数据丢失的风险也随之增加。意外删除、格式化、病毒攻击等原因都可能导致我们珍贵的数据丢失。在这种情况下&…

爬山算法的详细介绍

爬山算法(Hill Climbing Algorithm)是一种基于启发式的局部搜索算法,常用于解决优化问题。它的核心思想是从当前解的邻域中选择能够使目标函数值最大(或最小)的下一个解作为当前解,直到找到一个满足问题要求…

Ubuntu的基本使用(ROS)

Ubuntu的基本使用(ROS) 终端常用指令 1. ls - 列出目录内容 用途:显示当前目录下的文件和文件夹。示例: ls:列出当前目录下的所有文件和文件夹。ls -l:以列表形式显示更详细的信息(如权限、所…

有没有全面的人、货、场零售数据分析方案?

有。奥威BI零售数据分析方案正是这样一套全面的人、货、场零售数据分析解决方案,旨在帮助零售企业实现数据驱动的决策,优化业务流程,提升市场竞争力。 一、方案概述 该零售数据分析方案基于先进的BI技术,预设了以人、货、场、供…

STM32作业设计

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

贰[2],VisionMaster/.NetCore的WPF应用程序调用控件

1,环境 VisionMaster4.2 VisualStudio2022 WPF/.Net6.0 2,记录原因 .NetFrameWork的WPF应用程序调用添加例程.NetFrameWork的Winform应用程序相应的库,不会出现报错,界面也能正常显示操作,但是.NetCore的程序却总是报错。 2.1,.NetFrameWork的WPF应用程序 注:但是.…