Spark源码阅读03-Spark存储原理之序列化和压缩_lz4 lzf-程序员宅基地

技术标签: 大数据学习之Spark  spark  scala  big data  

序列化和压缩

在分布式计算中,序列化和压缩是提升性能的两个重要手段。Spark通过序列化将链式分布的数据转化为连续分布的数据, 这样就能够进行分布式的进程间数据通信或者在内存进行数据压缩等操作,通过压缩能够减少内存占用以及I/O和网络数据传输开销, 提升Spark整体的应用性能。

序列化

在Spark中内置了两个数据序列化类:JavaSerializer和KryoSerializer,这两个继承于抽象类SeriaIizer, 而在Spark SQL中SparkSqlSerializer继承于KryoSerializer, 它们之间关系如下Spark序列化类图所示。
在这里插入图片描述
默认情况下Spark默认使用的JavaSerializer 序列方法, 它使用的是Java 的ObjectOutputStream序列化框架。JavaSerializer继承于java.io.Serializable,但性能不佳, 而且生成的序列结果也较大, 因此Spark提供性能更佳的KryoSerializer方法,不过KryoSerializer不支持所有的系列化对象, 而且要求用户注册类。 如果这两种序列化方法不满足要求, 也可以通过集成Scrializer类自定义新的序列化方法。

Spark初始序列化是在SparkEnv类进行创建,在该类中根据spark.serializer配置初始化序列化实例, 然后把该实例作为参数初始化SerializerManager实例, 而SerializerManager作为参数初始化Block.Manager。代码实现如下:

 	//这里可以序列化的对象是Shuffle数据以及RDD缓存等场合
    val serializer = instantiateClassFromConf[Serializer](
      "spark.serializer", "org.apache.spark.serializer.JavaSerializer")
    logDebug(s"Using serializer: ${serializer.getClass}")

    val serializerManager = new SerializerManager(serializer, conf, ioEncryptionKey)

    val closureSerializer = new JavaSerializer(conf)

需要注意的是,这里可配的序列化的对象是Shuffle数据以及RDD缓存等场合,对于Spark 任务的序列化是通过spark.closure.serializer米配置, 目前只支待JavaSerializer。

压缩

Spark内置提供了三种压缩方法, 分别是:LZ4、LZF和Snappy, 这三个方法均继承于特质类CompressionCodec, 并实现了其压缩和解压两个方法, 它们之间关系如下Spark压缩类图所示。
在这里插入图片描述
这二个压缩算法采用了第三方库实现的, Snappy提供了更高的压缩速度,LZF提供了更高 的压缩比, LZ4提供了压缩速度和压缩比俱佳的性能:

  • Snappy: 使用Torg.xerial.snappy库, Snappy算法的前身是Zippy, 被Google用于MapReduce、 BigTable等许多内部项目;
  • LZF: 使用了com.ning.compress.lzf库, 其中Ning-compress是 一个对数据进行LZF格式压缩和解压缩的库;
  • LZ4:使用了net.jpountz.lz4库,它是一个高效的无损压缩算法,可扩展支持多核CPU。

Spark相关压缩配置项如下表:

配置项 默认值 说明
spark.io.compression.codec LZ4 RDD缓存和Shuffle数据压缩所采用的算法, 具体采用什么符法需要权衡 CPU 、网络、 磁盘的能力和负载。在Shuffle数据时,可能采取基于哈希的写操作, 如果Reduce分区数据巨大,需要同时打开 大量的压缩数据流用于写文件, 会需要大量的内存。 对于RDD缓存而言, 绝大多数场合都是内存橾作或者本地 IO, 所以 CPU 负载 的问题可能比IO的问题更加突出。LZF和Snappy相比较, 前者压缩率比较高(逍常要高20%左右), 但足 CPU 代价较大,LZ4提供了压缩述度和压缩比俱佳的性能.
spark.rdd.compress false 该参数决定了RDD缓存过程中,RDD 数据在序列化之后是否进步进行压缩再储存到内存或磁盘上,该参数主要考虑磁盘的IO带宽。默认情况下该参数false,也就是不使用压缩。
spark.broadcast.compress true 由于广播变量需要通过网络发送,所以通过压缩减小传播数据大小,以减少网络传输开销和内存占用是必要的。默认情况下该参数true ,也就是使用压缩。
spark.io.compression.snappy.blockSize 32k 设置使用Snappy压缩算法的块大小
spark.io.compression.lz4.blockSize 32k 设置使用LZ4压缩算法的块大小
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44480968/article/details/121761724

智能推荐

python3 更新和删除 elasticsearch 及其删除es索引_删除requstes-程序员宅基地

文章浏览阅读8.3k次。from elasticsearch import Elasticsearches_client = Elasticsearch(["localhost:9200"])// 多个条件限制的删除delete_options ={"query":{ "bool":{ "must":[{"te..._删除requstes

QNX 分区和文件系统制作_qnx 文件系统测试-程序员宅基地

文章浏览阅读544次。QNX 分区和文件系统制作_qnx 文件系统测试

《七天数据可视化之旅》第一天 数据可视化过程-程序员宅基地

文章浏览阅读236次。《七天数据可视化之旅》第一天 数据可视化过程Destiny,某物流公司数据产品经理,目前从事数据平台搭建和可视化相关的工作。持续学习中,期望与大家多多交流数据相关的技术和实际应用,共同成长。0x00 前言之前写过一篇文章,叫做数据可视化的基本流程,是站在可视化过程中的上下游关系,来梳理和介绍数据可视化的全过程,及其各个环节的主要工作内容。今天这篇文章,也是介绍数据可视化的过程,但是更多的是站在产品..._可视化工具的一天

Transformer:注意力机制(attention)和自注意力机制(self-attention)的学习总结_注意力机制和自注意力机制-程序员宅基地

文章浏览阅读4.1w次,点赞323次,收藏1.2k次。本文主要分为两个部分:第一部分重点介绍了注意力机制的原理、公式演变、评分函数以及多头注意力。第二部分重点介绍了自注意力机制的原理、优缺点以及和注意力机制的区别,并最后给出了单头和多头自注意力机制的图片示例。_注意力机制和自注意力机制

LeetCode简单题分享(8)-程序员宅基地

文章浏览阅读1.4w次。题目:这道题求动态和,最先考虑到的就是就是一个遍历累加的状态,仔细分析发现,其实新的数组只需要前面的和就好了,没必要多次遍历,那么这道题的思路就出来了代码如下:class Solution { public static int[] runningSum(int[] nums) { //定义长度 int length = nums.length; //初始化返回数组 int [] newNum = ne...

mysql语句属于dml的有_MySQL语言分类——DML-程序员宅基地

文章浏览阅读781次。DMLDML的全称是Database management Language,数据库管理语言。主要包括以下操作:insert、delete、update、optimize。本篇对其逐一介绍INSERT数据库表插入数据的方式:1、insert的完整语法:(做项目的过程中将字段名全写上,这样比较容易看懂)单条记录插入语法:insert into table_name (column_name1,......

随便推点

华为手机linux连接网络设置ip地址,华为路由器(Huawei)默认登录IP地址是多少-程序员宅基地

文章浏览阅读542次。本站收集了华为路由器所有的登录地址;路由器登录地址可以登录到路由器的管理界面,然后设置路由器各项参数,如果你使用的是华为路由器,请在以下列表中找到路由器的登录地址。华为IP地址列表10.0.0.13810.0.0.210.0.20.1192.168.0.1192.168.1.1192.168.1.254192.168.100.1192.168.15.1192.168.2.1192.168.254...._华为路由器 linux 访问

IAR修改工程名方法_iar修改工程名字-程序员宅基地

文章浏览阅读1.7k次。IAR修改工程名方法_iar修改工程名字

android studio中导入一个module作为另一个module的lib_android studio 将app moudel当做另一个moudel的依赖-程序员宅基地

文章浏览阅读1w次。在我们有两个Android Studio工程的情况时,我们想使用一个作为library工程导入到另一个工程作为一个module。我们可以使用Android Studio很容易的做到。让我们假设我们有两个工程:MyApplication和MyLibrary,我们想导入MyLibrary到MyApplication作为一个module。 首先我们需要从MyLibrary工程中找到m_android studio 将app moudel当做另一个moudel的依赖

IOS 搭建 XMPP实现环境-程序员宅基地

文章浏览阅读40次。第一步:添加XMPP FrameWork For IOS需要添加的文件:第二步: 编译后发现有很多错误,那么需要添加其他扶助的类库第三步:ARC(只限没有使用ARC的项目)当所有类库都添加后,编译,我们会发现有很多黄色的警告,这..._ios xmpp 编译报错

Maven实战手册_:nm /u-程序员宅基地

文章浏览阅读321次。nm_:nm /u

leetcode联系我,并且恢复了我的几十篇算法题解!-程序员宅基地

文章浏览阅读568次。熟悉我的朋友,应该知道前段时间我被leetcode封号,同时还被删除了几十篇题解的事。当然,我当时一方面很不爽,另一方面也挺纳闷。因为一直以来,我自认为我的题解还是蛮不错的,里边的内容也..._leetcode申诉