spark shuffle写操作——UnsafeShuffleWriter

PackedRecordPointer

使用long类型packedRecordPointer存储数据。
数据结构为:[24 bit partition number][13 bit memory page number][27 bit offset in page]

LongArray

LongArray不同于java中long数组。LongArray可以使用堆内内存也可以使用堆外内存。
MemoryLocation有两个变量obj、offset。可以表示内存的地址(堆内和堆外都可以)
堆内:obj是jvm对象的地址,offset是该对象的对象头大小。
堆外:obj是null,offset是堆外内存的地址。
MemoryBlock有三个变量obj、offset、length。表示一个内存块大小(堆内和堆外都可以)。
MemoryBlock是MemoryLocation子类
堆内:obj是jvm对象的地址,offset是该对象的对象头大小,length堆内内存大小
堆外:obj是null,offset是堆外内存的地址,length堆外内存大小
LongArray有四个变量memory、baseObj、baseOffset、length。
memory是MemoryBlock对象,表示占用内存块的大小
baseObj和baseOffset是用来确定内存的地址(堆内、堆外)
length表示可以保存long数据的量,所以就是内存大小除以8

LongArray存long数据,就是将long值放到index对应的内存地址。
index对应的地址就是baseObj和baseOffset+index*8

ShuffleInMemorySorter

  • array:类似long数组,存的是PackedRecordPointer,排序的时候是对这个数组进行排序,不是直接对消息进行排序,预留一部分空间用于排序
  • pos:新消息待插入位置
  • usableCapacity:longArray可以插入数据的容量。要留出部分空间用于排序
  • initialSize:初始内存大小

getUsableCapacity

usableCapacity变量是构造器中初始化调用getUsableCapacity。
getUsableCapacity是根据排序方法控制容量大小

reset

初始化pos、array、usableCapacity变量

expandPointerArray

  1. 数据从旧的arry迁移到新的array
  2. 释放旧的array内存
  3. 重新计算容量

insertRecord

生成long(包含partitionId、pageNumber、offset),放入longArray中

getSortedIterator

根据排序方法选择对应排序类。
RadixSort:https://baike.baidu.com/item/%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F/7875498?fr=ge_ala
TimSort:https://zhuanlan.zhihu.com/p/695042849
最后生成ShuffleSorterIterator,此时只是partition有序

_SORT_COMPARATOR:_排序是比较partition,相同partition消息放在一起。

ShuffleSorterIterator是可一个类似iterator的类,它没有next方法,每次都是调用loadNext方法,将下一个值放入packedRecordPointer变量,再读取这个变量。

ShuffleExternalSorter

  • allocatedPages:申请下来用于存储数据的内存页集合
  • spills:因为内存不够,spill生成的文件
  • currentPage:当前往里写入的内存页
  • pageCursor:写入当前内存页的位置游标
  • peakMemoryUsedBytes:内存使用的峰值,这个这是用来在UI上展示

insertRecord

1.检查是否inMemSorter有空间写入新的long值,growPointerArrayIfNecessary
2.检查是否需要新的page,acquireNewPageIfNecessary
3.为消息生成在page的内存地址
4.将数据复制到page中
5.写入到inMemSorter

growPointerArrayIfNecessary

  1. 判断是否还有空间写入新的数据
  2. 申请两倍的使用空间大小的longArray
  3. 如果申请的page太大,会触发spill。page最大是17G,不知道会不会触发
  4. 触发过spill就调用freeArray释放longArray内存
  5. 申请到新的大容量的longArray,调用expandPointerArray进行扩容

spill

是调用spill(long size, MemoryConsumer trigger)方法

writeSortedFile将内存中的数据都写入到文件
freeMemory释放全部的数据对应的page

writeSortedFile

调用inMemSorter的getSortedIterator方法生成排好序的iterator。getSortedIterator方法可以在上面翻一下。此处只是对数据的long地址进行排序,不是对实际数据进行排序。

生成临时文件用来存放数据

首先生成临时文件对应的writer,然后遍历消息。
当分区发生变化,进行提交,生成分区对应的fileSegment。

根据内存数据地址找到对应数据。

  • recordPage数据存放的内存页
  • recordOffsetInPage数据在该内存页起始位置
  • dataRemaining数据的长度

将数据写入到文件中。

提交最后一个分区的写入,将分区信息写入到spillInfo中。
spill完成将对应的spillInfo保存到spills变量

freeMemory

遍历allocatedPages释放内存。初始化内存相关的变量。

acquireNewPageIfNecessary

如果page空间不够存放数据,申请新的page,更新相关的变量。

closeAndGetSpills

将缓存的数据写入到文件中,释放内存,关闭inMemSorter。

UnsafeShuffleWriter

write

遍历数据调用insertRecordIntoSorter写入到sorter中。
最后调用closeAndWriteOutput合并中间spill文件

insertRecordIntoSorter

将消息序列化成byte[],调用ShuffleExternalSorter的insertRecord方法。

closeAndWriteOutput

关闭sorter,将剩余的缓存数据生成文件。
调用mergeSpills将所有的spill文件合并成一个文件。

mergeSpills

  • 没有spill文件,直接生成空的data和index文件
  • 只有一个spill文件,没有合并文件的过程。调用transferMapSpillFile方法
  • 有多个spill文件,调用mergeSpillsUsingStandardWriter方法合并文件


LocalDiskSingleSpillMapOutputWriter的transferMapSpillFile方法是根据shuffleId、mapId生成临时的data数据文件,将spill文件重命名为临时data文件,最后生成正式data文件和index文件。

mergeSpillsUsingStandardWriter
根据compression和fastMerge选择对应的合并文件方式
1.transferTo-based fast merge:调用mergeSpillsWithTransferTo(spills, mapWriter)
2.fileStream-based fast merge:调用mergeSpillsWithFileStream(spills, mapWriter, null)
3.slow merge:调用mergeSpillsWithFileStream(spills, mapWriter, compressionCodec)
最后生成正式的data文件和index文件

mergeSpillsWithTransferTo

  1. 生成spill文件对应的channel
  2. 生成最终data临时文件的channel
  3. 对于每一个分区,遍历spill文件的channel将对应分区的数据写入的data临时文件

mergeSpillsWithFileStream

  1. 生成spill文件对应的stream
  2. 生成临时data文件对应的分区writer的stream
  3. 包装分区的stream,加上监控、加密、压缩等相关功能
  4. 对应每个分区,遍历spill文件的stream,加上limit、加密、压缩的功能,数据复制到分区writer的stream

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

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

相关文章

秋招突击——7/9——字节面经

文章目录 引言正文八股MySQL熟悉吗?讲一下MySQL索引的结构?追问:MySQL为什么要使用B树?在使用MySQL的时候,如何避免索引失效?讲一下MySQL的事物有哪几种特征?MySQL的原子性可以实现什么效果&…

【区块链+跨境服务】粤澳健康码跨境互认系统 | FISCO BCOS应用案例

2020 年突如其来的新冠肺炎疫情,让社会治理体系面临前所未见的考验,如何兼顾疫情防控与复工复产成为社会 各界共同努力的目标。区块链技术作为传递信任的新一代信息基础设施,善于在多方协同的场景中发挥所长,从 而为粤澳两地的疫情…

CSS关于居中的问题

文章目录 1. 行内和块级元素自身相对父控件居中1.1. 块级元素相对父控件居中1.2. 行内元素相对于父控件居中 2. 实现单行文字垂直居中3. 子绝父相实现子元素的水平垂直居中3.1. 方案一3.1.1. 示例 3.2. 方案二3.2.1. 示例 3.3. 方案三(推荐)3.3.1. 示例 3.4. 方案四(了解一下) …

AI大模型知识点大梳理_ai大模型的精度以下哪项描述的准确

AI大模型是什么 AI大模型是指具有巨大参数量的深度学习模型,通常**包含数十亿甚至数万亿个参数。**这些模型可以通过学习大量的数据来提高预测能力,从而在自然语言处理、计算机视觉、自主驾驶等领域取得重要突破。 AI大模型的定义具体可以根据参数规模…

短信验证码研究:公开的短信验证码接口、不需要注册的短信验证码接口

短信验证码研究:公开的短信验证码接口、不需要注册的短信验证码接口 0 说明 本文提供了一个短信验证码接口,主要用于以下场景: 1、用于开发调试 2、用于申请验证码困难的企业和个人 3、用于短信验证码认证还没有通过,但是着急…

DBeaver操作MySQL无法同时执行多条语句的解决方法

DBeaver选择数据库连接,在【驱动属性】中将allowMultiQueries允许执行多条语句置为True

泰迪智能科技大数据实验室产品-实训管理平台介绍

高校大数据实验室通常配备有先进的计算机硬件和软件工具,以及专门的数据库和分析平台,以便研究人员和学生能够进行复杂的数据处理、分析和解释。主要利用大数据技术进行科学研究、技术开发和人才培养。 泰迪智能科技实训管理平台作为教学核心&#xff0c…

JS进阶-构造函数

学习目标: 掌握构造函数 学习内容: 构造函数 构造函数: 封装是面向对象思想中比较重要的一部分,js面向对象可以通过构造函数实现的封装。 同样的将变量和函数组合到了一起并能通过this实现数据的共享,所不同的是借助…

小程序需要进行软件测试吗?小程序测试有哪些测试内容?

在如今移动互联网快速发展的时代,小程序已成为人们生活中不可或缺的一部分。然而,面对日益增长的小程序数量和用户需求,小程序的稳定性和质量问题日益突显。因此,对小程序进行软件测试显得尤为重要。 近期的一项调查显示&#xf…

【架构】分布式与微服务架构解析

分布式与微服务架构解析 一、分布式1、什么是分布式架构2、为什么需要分布式架构3、分布式架构有哪些优势?4、分布式架构有什么劣势?5、分布式架构有哪些关键技术?6、基于分布式架构如何提高其高性能?7、如何基于架构提高系统的稳…

【工具】咸鱼小助手,一款咸鱼之王辅助工具

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ Github:咸鱼之王的自动化脚本,自动答题、爬塔、领资源等 下载:(密码:9u22) 咸鱼小助手 文档:腾讯文档 视…

软考《信息系统运行管理员》-3.2信息系统设施运维的环境管理

3.2信息系统设施运维的环境管理 1 计算机机房的选址要求 电子计算机机房地理位置 选择水源充足,电子比较稳定可靠,交通通信方便,自然环境清洁的地点要远离产生粉尘、油烟、有害气体以及生产或存储具有腐蚀性、易燃、易爆物品的工厂、仓库、…

3d模型选不中任何东西是什么原因?---模大狮模型网

在进行3D模型设计过程中,有时会遇到无法选择模型中的任何元素的问题。这种情况可能会影响设计师的工作效率和体验,因此了解问题的原因以及如何解决是至关重要的。本文将探讨在3D建模中遇到无法选中模型元素的原因及解决方法。 一、问题原因分析 无法选中…

07浅谈大语言模型可调节参数tempreture

浅谈temperature 什么是temperature? temperature是大预言模型生成文本时常用的两个重要参数。它的作用体现在控制模型输出的确定性和多样性: 控制确定性: temperature参数可以控制模型生成文本的确定性,大部分模型中temperatur…

医疗器械网络安全 | 漏洞扫描、渗透测试没有发现问题,是否说明我的设备是安全的?

尽管漏洞扫描、模糊测试和渗透测试在评估系统安全性方面是非常重要和有效的工具,但即使这些测试没有发现任何问题,也不能完全保证您的医疗器械是绝对安全的。这是因为安全性的评估是一个多维度、复杂且持续的过程,涉及多个方面和因素。以下是…

数模打怪(一)之层次分析法

一、什么是层次分析法 层次分析法(AHP)主要用于解决评价类问题(可打分) 比如哪种方案更好、哪位运动员更优秀等 二、层次分析法的三个步骤 1、建立层次结构 分析题目,找出评价类问题的三要素: &#x…

android13 设置左右分屏修改为单屏幕,应用分屏改为单屏

1.前言 android13中,系统设置变成,左边是一级菜单,右侧是二级菜单, 这样跟我们以前android7/8/9的布局是不一样的,我们需要将它修改为一级菜单,点进去才是二级菜单这种。 效果如下 2.系统设置实现分析 它这里使用的是google新出的embedding activity, 相关的知识这里…

从重庆元宇宙国风秀看未来元宇宙发展趋势

2024年2月24日,为纪念梅兰芳先生诞辰130周年,以“新国风东方美”为主题的【承华灵境】元宇宙国风秀在重庆市人民大礼堂发布。这场活动将中国经典艺术与数字化技术融合,呈现了一场新国风东方美学的跨越时空人文科技之旅,其中的重点…

最后纪元Last Epoch可以通过什么搬砖 游戏搬砖教程

来喽来喽,最后纪元,一款《最后纪元》是一款以获得战利品为基础的暗黑风格动作RPG游戏,玩家将从2281年的毁灭时代追溯到由女神Eterra创造的世界,通过多个时代与黑暗的命运对抗,找到拯救世界的方式。游戏有五种职业&…

萌啦数据多少钱一个月,萌啦数据价格是多少

在跨境电商的浩瀚星海中,Ozon作为俄罗斯及独联体地区领先的电商平台,正吸引着越来越多的商家和创业者的目光。而“萌啦ozon数据”作为专注于Ozon平台数据分析与洞察的服务提供商,更是成为了众多商家在数据驱动决策道路上的得力助手。然而&…