Spark源码学习1.5——BlockManager.scala
一、BlockResult类
该类用来表示返回的匹配的block及其相关的参数。共有三个参数:
data:Iterator [Any]。
readMethod: DataReadMethod.Value。
bytes: Long。
实例化InputMetrics类。
二、BlockManager类
关系的参数有executorId,blockManagerMaster,mapOutPutTracker等。关系的类有ShuffleBlockManager类,DiskBlockManager类,ConnectionManager类,MemoryStore类,DiskStore类等。包含以下操作:
1、检查broadcast,shuffle,rdds,shuffleSpill存储时是否被压缩。
2、定义其slaveActor。
3、建立一个BlockManagerSlaveActor(this, mapOutputTracker)。
4、一个lazy val compressionCodec,压缩包解码器。lazy表示在调用它时才实例化一个解码器,主要是针对用户自定义的jar包。
包含的方法有:
1、initialize():初始化操作,主要是向master(BlockManagerMaster)注册BlockManager,并启动BlockManagerWorker。
2、reportAllBlocks():再次将所有的blocks汇报给BlockManager。这个方法强调所有的blocks必须都能在BlockManager的管理下,因为可能会出现各种因素,如slave需要重新注册、进程冲突导致block变化等,让blocks产生变化。
3、reregister():重新注册BlockManager,这个方法主要是在心跳进程发现BlockManager没有注册时调用。这个方法的调用无需在锁状态下执行。
4、asyncReregister():异步地重新向master注册BlockManager。
5、waitForAsyncReregister():如果有其他的异步重注册进程,则等待。
6、getStatus(block Id: BlockId):根据blockId获取block的信息。
7、getMatchingBlockIds():指定过滤器对所有的blocks进行过滤。
8、reportBlockStatus():向master报告block所在存储位置的状况,这个信息不仅反映了block当前的状态,还用于更新block的信息。但是这个存储状态的信息,如磁盘、内存、cache存储等等,并不一定是block的Information中所期望的存储信息,例如MEMORY_AND_DISK等。
9、tryToReportBlockStatus():实际上是发送UpdateBlockInfo信息,返回master返回的信息。block记录正确则返回true,slave需要重新注册则返回false。信息包括storageLevel, inMemSize, inTachyonSize, onDiskSize等
10、getCurrentBlockStatus():返回指定block所在存储块的最新信息。特别的,当block从内存移到磁盘时,更改其存储级别并更新内存和磁盘大小。
11、getLocationBlockIds():获取一系列block的位置。
12、getLocalFromDisk():直接从磁盘获取block,主要是用来获取shuffle block的。
13、getLocal():从本地block manager获取block。
14、getLocakBytes():以序列化字节流的形式从本地block manager获取block。
15、doGetLocal():getLocalBytes()的实际操作函数,用来获取block并以序列化形式输出。需要处理的问题主要是同步问题,既要保证block仍然在指定的存储位置,也要保证block没有处于写的锁状态(尽管如此,Spark提示它仍然存在一定的隐患,block被移除)。
16、getRemote():从远程block manager获取block。
17、getRemoteBytes():同getLocalBytes()。
18、doGetRemote():与doGetLocal()类似。
19、get():从block manager获取block,无论本地还是远程。
20、getMultiple():根据BlockManagerIds获取一系列的block。
21、putIterator():在Iterator中加入block的信息。
22、getDiskWriter():创建一个能够直接将数据写到磁盘的writer,block通过文件名来指定写入的文件,这个方法通常用来在shuffle之后写入shuffle的输出文件。
23、putArray():在block manager中写入新的block,block的值是Array数组。
24、putBytes():在block manager中写入新的block,block的值是序列化的字符流。这个方法和putArray都是使用doPut()来实际写入信息到block manager。
25、doPut():将给定的block根据给定的存储等级(内存还是磁盘)写入相应的block存储区,必要时复制其中的数据。实际有效的存储级依赖于block最终所挂载的区域,因此调用者可以指定存储级,而不是依靠最初由用户指定的存储级来确定(用户可能存在错误或恶意行为)。doPut()需要考虑的问题包括:block信息的写入,block的值的处理,block向block manager和master的注册,block存储的位置(先内存,后实际考虑),报告block所在存储区的信息,block manager信息的更新等。
26、replicate():复制block到另外的节点上。
27、putSingle():在block manager中写入新的block,block的值是一个对象。调用的方法是putIterator。
28、dropFromMemory():将内存中的block溢出到磁盘中。往往在内存达到限制时调用。
29、removeRdd():将指定RDD的block全部移除,返回移除的block的数量。
30、removeBroadcast():将指定的broadcast的block全部移除。这个方法和removeRdd都是循环移除自身的所有block,移除的方法为removeBlock()。
31、removeBlock():移除内存和磁盘中的指定block。同时需要告知master并更新block信息reportBlockStatuses。
32、dropOldNonBroadcastBlocks()和dropOldBroadcastBlocks():移除旧的没有的/旧的broadcast block。
33、dropOldBlocks():移除没有用的block。
34、shouldCompress():判断是否经过压缩,共有四种压缩包——shuffle,broadcast,rdds,shuffleSpill。
35、wrapForCompression():有两种加载方式,根据参数决定是压缩输入流还是压缩输出流。
36、dataSerializeStram():序列化为流。
37、dataSerialize():序列化为字符缓存。
38、dateDeserialize():反序列化字符缓存为迭代的参数值,并且在末尾对该值进行处理。在对block进行处理的时候,如果block是shuffle的block,也就是会传递给reduce进行处理的block时,需要进行压缩(lazy的)。
39、stop():清除各种类的实例化对象。
三、BlockManager对象
针对blockId进行了注册、处理等操作。
Spark源码学习1.5——BlockManager.scala的更多相关文章
- Spark源码学习1.2——TaskSchedulerImpl.scala
许久没有写博客了,没有太多时间,最近陆续将Spark源码的一些阅读笔记传上,接下来要修改Spark源码了. 这个类继承于TaskScheduler类,重载了TaskScheduler中的大部分方法,是 ...
- Spark源码学习1.1——DAGScheduler.scala
本文以Spark1.1.0版本为基础. 经过前一段时间的学习,基本上能够对Spark的工作流程有一个了解,但是具体的细节还是需要阅读源码,而且后续的科研过程中也肯定要修改源码的,所以最近开始Spark ...
- Spark源码学习1.6——Executor.scala
Executor.scala 一.Executor类 首先判断本地性,获取slaves的host name(不是IP或者host: port),匹配运行环境为集群或者本地.如果不是本地执行,需要启动一 ...
- Spark源码学习1.8——ShuffleBlockManager.scala
shuffleBlockManager继承于Logging,参数为blockManager和shuffleManager.shuffle文件有三个特性:shuffleId,整个shuffle stag ...
- Spark源码学习1.4——MapOutputTracker.scala
相关类:MapOutputTrackerMessage,GetMapOutputStatuses extends MapPutputTrackerMessage,StopMapOutputTracke ...
- Spark源码学习1.3——TaskSetManager.scala
TaskSetManager.scala TaskSet是指一系列被提交的task,一般是代表特定的stage中丢失的partition.TaskSetManager通过一个TaskScheduler ...
- Spark源码学习1.7——Master.scala
master第一步是加载系统定义的环境变量,如worker的超时时间.系统保留的Application数目等:第二步,加载worker的信 息,地址.id等:第三步,加载Application的信息, ...
- Spark源码学习2
转自:http://www.cnblogs.com/hseagle/p/3673123.html 在源码阅读时,需要重点把握以下两大主线. 静态view 即 RDD, transformation a ...
- spark源码学习-withScope
withScope是最近的发现版中新增加的一个模块,它是用来做DAG可视化的(DAG visualization on SparkUI) 以前的sparkUI中只有stage的执行情况,也就是说我们 ...
随机推荐
- python3 三级菜单
python版本3.5 功能: 1.程序执行显示一级菜单,输入内容进入二级菜单: 2.进入二级菜单后,输入二级菜单内容,进入三级菜单:输入b返回一级菜单: 3.进入三级菜单后,输入b返回二级菜单. # ...
- Android N做了啥
Android N做了哪些改变 一. 性能改善 Doze超级省电模式 手机在关屏同时没有充电的情况,在一段时间后会进入打盹状态,第一阶段会停掉同步.作业.网络等访问,第二阶段会停掉app的位置服 ...
- JavaScript 深入了解基本类型和引用类型的值
转载:https://segmentfault.com/a/1190000006752076 一个变量可以存放两种类型的值,基本类型的值(primitive values)和引用类型的值(refere ...
- 20145218&20145240 《信息安全系统设计基础》实验二 固件设计
20145218&20145240 <信息安全系统设计基础>实验二 固件设计 实验报告链接:http://www.cnblogs.com/20145240lsj/p/6035512 ...
- JS学习之事件流
本文是原创文章,如需转载,请注明文章出处 JS和AS师出同源,所以事件流的3个阶段也跟AS一样,分别是捕获阶段,目标阶段,冒泡阶段. 下面写了个例子可以清晰的看出事件流的顺序: eventTest.h ...
- SPSS数据分析—生存分析
生存分析是对生存时间进行统计分析的一种技术,所谓生存时间,就是指从某一时间点起到所关心的事件发生的这段时间.这里的时间不一定就是钟表日历上的时间,也有可能是其他的度量单位,比如长度单位等. 生存时间有 ...
- Java数组扩容算法及Java对它的应用
1)Java数组对象的大小是固定不变的,数组对象是不可扩容的.利用数组复制方法可以变通的实现数组扩容.System.arraycopy()可以复制数组.Arrays.copyOf()可以简便的创建数组 ...
- dos命名重启或关闭远程服务器
1.建议远程连接.(把远程机器IP换成实际IP地址,把密码改为administrator的真实密码) net use \\远程机器IP\ipc$ "密码"/user:adminis ...
- hihocoder挑战赛26
某蒟蒻成功的·写出了T1并rank16...小岛的题目真难... 传送门:http://hihocoder.com/contest/challenge26 T1 如果你想要暴力枚举的话显然是不行的 如 ...
- java入门笔记
1.安装路径:不能含空格和中文,建议安装路径d:\java\jdk 2.名词 bin:binary javac:java compile java:运行java文件 3.命名: (1)尽量用英 ...