Spark(9):RDD的序列化

news2024/10/6 8:22:33

目录

0. 相关文章链接

1. 闭包检查

2. 序列化方法和属性

3. Kryo 序列化框架 

4. 核心点总结


0. 相关文章链接

 Spark文章汇总 

1. 闭包检查

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

2. 序列化方法和属性

从计算的角度, 算子以外的代码都是在 Driver 端执行, 算子里面的代码都是在 Executor端执行:

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

/**
 * @ date: 2023/7/4
 * @ author: yangshibiao
 * @ desc: 项目描述
 */
object ModelTest {

    def main(args: Array[String]): Unit = {

        //1.创建SparkConf并设置App名称
        val conf: SparkConf = new SparkConf().setAppName("ModelTest").setMaster("local[*]")

        //2.创建SparkContext,该对象是提交Spark App的入口
        val sc: SparkContext = new SparkContext(conf)

        //3.创建一个RDD
        val rdd: RDD[String] = sc.makeRDD(Array("hello world", "hello spark", "hive", "12345"))

        //3.1创建一个Search对象
        val search: Search = new Search("hello")

        //3.2 函数传递,打印:ERROR Task not serializable
        search.getMatch1(rdd).collect().foreach(println)

        //3.3 属性传递,运行正常
        // search.getMatch2(rdd).collect().foreach(println)

        //4.关闭连接
        sc.stop()

    }
}


class Search(query: String) {

    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] = {
        val q: String = query
        rdd.filter((x: String) => x.contains(q))
    }

}

运行第一个方法进行函数传递时,抛出 ERROR Task not serializable,如下图所示:

运行第二个方法进行属性传递时,运行正常,打印出正常结果,如下图所示:

3. Kryo 序列化框架 

参考地址: https://github.com/EsotericSoftware/kryo 

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

注意:即使使用 Kryo 序列化,也要继承 Serializable 接口。 


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

/**
 * @ date: 2023/7/4
 * @ author: yangshibiao
 * @ desc: 项目描述
 */
object ModelTest {

    def main(args: Array[String]): Unit = {

        //1.创建SparkConf并设置App名称
        val conf: SparkConf = new SparkConf()
            .setAppName("ModelTest")
            .setMaster("local[*]")
            // 替换默认的序列化机制
            .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
            // 注册需要使用 kryo 序列化的自定义类
            .registerKryoClasses(Array(classOf[Search]))

        //2.创建SparkContext,该对象是提交Spark App的入口
        val sc: SparkContext = new SparkContext(conf)

        //3.创建一个RDD
        val rdd: RDD[String] = sc.makeRDD(Array("hello world", "hello spark", "hive", "12345"))

        //3.1创建一个Search对象
        val search: Search = new Search("hello")

        //3.2 函数传递
        search.getMatch1(rdd).collect().foreach(println)

        //4.关闭连接
        sc.stop()

    }
}


class Search(query: String) extends Serializable {

    def isMatch(s: String): Boolean = {
        s.contains(query)
    }

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

}

运行成功,如下图所示:

4. 核心点总结

  • 在Spark中,如果有类进行序列化,该类需要继承Serializable,如下图所示:

  • 在Spark中,Serializable比较重,所以可以使用更优的Kryo框架,但是注意的是即使使用 Kryo 序列化,也要继承 Serializable 接口(如果Spark包中的类均已注册,但如果是自定义的类,还需要手动注册),如下图示所示:


注:其他Spark相关系列文章链接由此进 ->  Spark文章汇总 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/716691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 泛型List排序的实现

本文主要介绍了C# 泛型List排序的实现,分享给大家,具体如下: 代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 5…

Github下载Failed to connect to github.com port 443: Timed out

方法一: 使用ssh下载的方式 方法二 使用github加速网站 https://gitclone.com ,用命令行: git clone https://http://gitclone.com/http://github.com/xxx/yyy 参考链接 github克隆失败提示“443:Timed out”怎么解决? - 知乎

形式化验证,Complete Formal Verification of TriCore2 and Other Processors(五)

目录 一、Article:文献出处(方便再次搜索) (1)作者 (2)文献题目 (3)文献时间 (4)引用 二、Data:文献数据(总结归纳,方便理解&am…

Linux 学习记录45(C++篇)

Linux 学习记录45(C篇) 本文目录 Linux 学习记录45(C篇)一、纯虚函数和抽象类1. 纯虚函数2. 抽象类 二、C中的异常处理1. 抛出异常2. 处理/捕获异常 三、模板(template)1. 模板函数(1. 模板函数的定义和调用(2. 模板函数需要显性调用的时机 2. 模板类3. 模板函数和模板类实现的…

【运维】GitLab相关配置优化等

默认 Git 设置 http post 的缓存为 1MB,使用命令将git的缓存设为500M,重新配置一下postBuffer值 git config --global http.postBuffer 524288000 解决方法2:直接修改config参数, windows: ./git/config中,加入以下…

构建无忧:探索 Linux 项目自动化构建神器-make/Makefile

目录 一.make/Makefile的介绍1.理解make/Makefile二.make/Makefile的使用1.基本使用2.PHONY3.特殊符号拓展 一.make/Makefile的介绍 1.理解make/Makefile 编写Makefile是Linux开发中一项重要的技能,熟练的运用这个工具能提高编译效率,帮助你完成大型工…

【Java系列】Java虚拟机—类加载器介绍

什么是Java虚拟机 Java虚拟机(Java Virtual Machine,JVM)是一个能够执行 Java 字节码的虚拟计算机。它是 Java 技术的核心部分,是 Java 应用程序运行的基础。 Java 程序在编译后会生成字节码(bytecode)&am…

【动手学习深度学习--逐行代码解析合集】07多层感知机的简洁实现

【动手学习深度学习】逐行代码解析合集 07多层感知机的简洁实现 视频链接:动手学习深度学习–softmax回归简洁实现 课程主页:https://courses.d2l.ai/zh-v2/ 教材:https://zh-v2.d2l.ai/ 1、代码 import torch from torch import nn from d…

uni-app crypto-js DES 加解密 ,支持app , h5,小程序

crypto-js DES 加解密 ,支持app,h5,小程序 第一步 npm install crypto-js 可以直接下载示例运行,看控制台打印 下载地址 https://ext.dcloud.net.cn/plugin?id13351 crypto-js DES 加解密 - DCloud 插件市场

科技富豪抑郁了

原美团二当家王慧文据说抑郁了 什么能解决抑郁问题? 趣讲大白话:科技富豪也抑郁 【趣讲信息科技216期】 **************************** 王富豪创立光年之外AI公司2个月就休息了 知识解决不了抑郁问题 抑郁是现代社会一个常见的症状 是压力所带来的综合症…

牛客网Verilog刷题——VL39

牛客网Verilog刷题——VL39 题目答案 题目 设计一个自动贩售机,输入货币有两种,为0.5/1元,饮料价格是1.5/2.5元,要求进行找零,找零只会支付0.5元。 1、投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1&#x…

HTML-表格、表单标签

目录 表格标签 表单标签 表单项标签 表格标签 场景&#xff1a;在网页中以表格&#xff08;行、列&#xff09;形式整齐展示数据&#xff0c;如班级表标签 标签描述属性/备注<table>定义表格整体&#xff0c;可以包裹多个<tr>border:规定表格边框的宽度width&am…

盖雅劳动力管理云完成多方信创适配,打造信创产业生态

为响应国产化和信创战略需求&#xff0c;盖雅工场积极推动产品适配国产操作系统、国产数据库、国产硬件设备和国产处理器&#xff0c;不断拓展公司信创产业链技术升级。 近日&#xff0c;盖雅工场顺利完成多方信创适配&#xff0c;成功与 麒麟Kylin、鲲鹏Kunpeng、达梦数据库…

一键ai绘画怎么使用你清楚吗?

在当代科技的浪潮中&#xff0c;人工智能绘画生成器犹如一位神奇的画笔&#xff0c;以其特别的创造力&#xff0c;将数字代码转化成令人惊叹的艺术杰作。它就像是一位天才魔术师&#xff0c;能从虚无中诞生出栩栩如生的图像&#xff0c;给人们带来触动和美感。 看着这些ai绘画…

VOC数据集介绍以及读取(目标检测object detection)

VOC&#xff08;Visual Object Classes&#xff09;数据集是一个广泛使用的计算机视觉数据集&#xff0c;主要用于目标检测、图像分割和图像分类等任务。VOC数据集最初由英国牛津大学的计算机视觉小组创建&#xff0c;并在PASCAL VOC挑战赛中使用。 VOC数据集包含各种不同类别…

今晚打老虎:用katalon解决接口/自动化测试拦路虎--参数化

#全局变量 右侧菜单栏中打开profile&#xff0c;点击default&#xff0c;打开之后&#xff0c;在default页面点击add添加全局变量 如果你想学习接口自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的接口自动化测试教程&#xff0c…

ux-grid实现表格排序

需求说明&#xff1a; 1、第一行不参与排序 2、实现带%排序 3、实现null值排序 4、实现值相等不排序 5、实现含有占位符‘–‘排序放到最后 表格属性说明文档 效果图如下&#xff1a; 代码如下&#xff1a; <template><div><ux-gridhighlightCurrentRow:data&…

JavaScript 使用canvas绘制随机生成图形验证码

文章目录 HTML 结构准备CSS 样式准备JavaScript 逻辑部分首先做个准备&#xff1a;声明一个空数组用来随机生成验证码封装一个为canvas标签渲染的函数&#xff0c;用来随机生成验证码还需要封装一个用来生成随机颜色的函数获取到canvas标签为其绑定点击事件为按钮绑定判断点击事…

day1-若依项目前后端分离的初步使用

响应式布局: 做好的产品能在pc端,手机,平板都能正常浏览 开发项目两种方式 1.自己从0开始写代码 2.在若依中下载拥有基础功能的源码 若依使用的mysql版本 mysql5.7 导入别人的项目如何操作 若依项目下载地址**:https://gitee.com/y_project/RuoYi-Vue.git** 可以使用揉…