1.BroadcastManager,广播变量,是Spark实现分布式并行的一个重要特点之一,当一个stage读取了广播变量后,其他的stage也可以对该变量进行读写,从而加快数据处理速度
BroadcastManager有两种类型,一种为:HttpBroadcast,一种为TorrentBroadcast,Spark源码是以HttpBroadcast为例,所以我以HttpBroadcast为例详细讲解下
初始化一个HttpBroadcast变量时,是生成一个HttpBroascastFactory对象,接着这个对象调用HttpBroadcast类的initialize方法
<script src="https://code.csdn.net/snippets/624279.js"></script>
HttpBroadcast中还有读写广播变量,移除所有广播变量的数据库和文件等等,以写广播变量为例
<script src="https://code.csdn.net/snippets/624280.js"></script>2.CacheManager
缓存管理器,属于Spark的存储部分,感觉它主要的作用就是确保RDD的某个分区不会被重复保存在磁盘中或者内存中,实现这一任务的主要方法就是getOrCompute()
其主要的思路是get->get不到再compute
首先从块管理器中取相应的分区(RDDBlockId),若取到则返回,否则->先将RDDBlockId放在loading(loading是HashSet[RDDBlockId])中,这样可以避免其余的线程又对该RDDBlockId进行操作,导致错误->计算(应该就是对分区进行相应的函数操作,这些函数我始终认为是我们编写程序时用到的那些函数)该RDDBlockId->如果是本地运行,则直接返回该结果,否则->存放在BlockManager中->后续工作
代码太长,就不贴出来了,理解就是如上所述
SparkEnv中还有ShuffleFetcher,HttpFileServer,MetricsSystem等,在此就不一一详细介绍了,总而言之,SparkEnv是整个spark的环境设置环节,也是spark能否正确运行的关键所在
接下来我将讲讲RDD,个人认为RDD是Spark的一个核心所在,除了它是Spark的基本抽象编程模型之外,它还提供了各种丰富的API,有利于编程的实现
未完待续。。。。