BlockManager中存储block的流程: doPut()方法  

入参:blockId, data, level, tellMaster

1)为block创建BlockInfo并加锁使其不能被其他线程访问;

2)按照block的存储级别:useMemory, useOffHeap, useDisk进行存储,并标识该block可以被其他线程访问;

  注:只要使用了useMemory,就算也使用了useDisk,一开始也只会存在内存中,而不会立即存储到硬盘上,只有等内存不够时才会将部分partition数据drop到硬盘上

3)tellMaster=true(默认就时true): reportBlockStatus(blockId, putBlockInfo, putBlockStatus)

  通知BlockManagerMaster有新的数据写入,在BlockManagerMaster中更新Block信息

4)根据block的replication数决定是否将该block备份到其他节点(异步)

  1)存储结果是序列化后的字节数组

  2) 存储结果是没有序列化的值

    备份数据的序列化:序列化成字节数组;先压缩再序列化

    默认的压缩是snappy,可以通过spark.io.compression.codec参数进行配置;

    序列化默认使用的是org.apache.spark.serializer.JavaSerializer,可以通过spark.serializer参数进行配置;在创建BlockManager时设定;

bytesAfterPut = dataSerialize(blockId, valuesAfterPut)  //数据序列化
replicate(blockId, bytesAfterPut, putLevel){ //数据备份到其他节点
val putBlock = PutBlock(blockId, data, eLevel)
val cmId = new ConnectionManagerId(host, port)
BlockManagerWorker.syncPutBlock(putBlock, cmId)
}

BlockManagerWorker 以防止数据丢失的时候还能够恢复,进行数据的备份操作,将数据拷贝到其他节点(异步)
ConnectionManager 负责与其它计算结点建立连接,并负责数据的发送和接收

BlockManager获取block的流程:get()方法

//Get a block from the block manager (either local or remote).
def get(blockId: BlockId): Option[BlockResult] = {
val local = getLocal(blockId) //调用doGetLocal()方法
if (local.isDefined) {
return local
}
val remote = getRemote(blockId) //调用doGetRemote()方法
if (remote.isDefined) {
return remote
}
None
}

1)先从本地的BlockManager查找:依次从useMemory, useOffHeap, useDisk去查找;

根据blockid获得到对应的blockinfo(该blockinfo被加锁了),获取到该blockinfo的storagelevel,进入如下分支进行查找:

  level.useMemory    从Memory中取出block并返回,如果没有就进入下一个分支;

  level.useOffHeap   从Tachyon中取出block并返回,如果没有就进入下一个分支;

  level.useDisk

    level.useMemory==true 将block从disk中读出并写入内存以便下次使用时从内存中获取,同时返回该block;

    level.useMemory==false 将block从disk中读出并返回;

2)本地获取不到再从远端(executor)的BlockManager去查找(BlockManagerWorker.syncGetBlock)

  获得该block的location信息;

  根据location向远端发送请求获取block,只要有一个远端返回block该函数就返回而不继续发送请求;

注:通常情况下spark任务的分配时根据block的分布决定的,任务往往会被分配到拥有block的节点上,因此getLocal()就能找到所需要的block;但在资源有限的情况下,spark会将任务调度到与block不同的节点上,这样就必须通过getRemote()来获得block。

Spark分析之BlockManager的更多相关文章

  1. spark的存储系统--BlockManager源码分析

    spark的存储系统--BlockManager源码分析 根据之前的一系列分析,我们对spark作业从创建到调度分发,到执行,最后结果回传driver的过程有了一个大概的了解.但是在分析源码的过程中也 ...

  2. 使用Spark分析拉勾网招聘信息(一):准备工作

    本系列专属github地址:https://github.com/ios122/spark_lagou 前言 我觉得如果动笔,就应该努力地把要说的东西表达清楚.今后一段时间,尝试下系列博客文章.简单说 ...

  3. [大数据从入门到放弃系列教程]第一个spark分析程序

    [大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...

  4. Spark分析之Job Scheduling Process

    经过前面文章的SparkContext.DAGScheduler.TaskScheduler分析,再从总体上了解Spark Job的调度流程 1.SparkContext将job的RDD DAG图提交 ...

  5. 使用Spark分析拉勾网招聘信息(四): 几个常用的脚本与图片分析结果

    概述 前一篇文章,已经介绍了BMR的基础用法,再结合Spark和Scala的文档,我想应该是可以开始你的数据分析之路的.这一篇文章,着重进行一些简单的思路上的引导和分析.如果你分析招聘数据时,卡在了某 ...

  6. 使用Spark分析拉勾网招聘信息(三): BMR 入门

    简述 本文,意在以最小的篇幅,来帮助对大数据和Spark感兴趣的小伙伴,能尽快搭建一个可用的Spark开发环境.力求言简意赅.文章,不敢自称BMR的最佳实践,但绝对可以帮助初学者,迅速入门,能够专心于 ...

  7. 使用Spark分析拉勾网招聘信息(二): 获取数据

    要获取什么样的数据? 我们要获取的数据,是指那些公开的,可以轻易地获取地数据.如果你有完整的数据集,肯定是极好的,但一般都很难通过还算正当的方式轻易获取.单就本系列文章要研究的实时招聘信息来讲,能获取 ...

  8. Spark分析之TaskScheduler

    TaskScheduler概述: TaskScheduler是一个可插拔任务调度接口,通过不同的SchedulerBackend进行任务的调度.主要功能如下: 1.一个TaskScheduler只为一 ...

  9. Spark分析之SparkContext启动过程分析

    SparkContext作为整个Spark的入口,不管是spark.sparkstreaming.spark sql都需要首先创建一个SparkContext对象,然后基于这个SparkContext ...

随机推荐

  1. java.c++.c#.c的区别

    C++则一般看作是对C语言的扩展. Java语言是一种完全的面向对象语言,虽然它的底层(运行时库)是用C语言开发的,可是并不依赖于C. C#是微软开发的一种编程语言,语法类似Java,几乎就是从Jav ...

  2. git的时候 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    更改Ubuntu服务器的时候,提交git出错: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE ...

  3. SWIFT Enumeration(1)

    Swift中定义Enumeration跟其它语言挺类似的,看如下定义一个星期的Enumeration enum Day:Int{ case Monday = 1, Tuesday,Wednesday, ...

  4. 玩转TypeScript(3)--类型转换

    使用强类型变量常常需要从一种类型向另一种类型转换,通常使用ToString或ParseInt可以来实现一些简单的转换,但是有时候需要像.NET语言中那样将一种类型显示的转换为另一种类型,在TypeSc ...

  5. windows7所有版本迅雷地址下载集合(含32位和64位) - imsoft.cnblogs

    Windows7 SP1旗舰版 32位官方原版下载: ed2k://|file|/cn_windows_7_ultimate_with_sp1_x86_dvd_618763.iso|265187737 ...

  6. ZOJ 3211dream city dp(效率优化)

    Dream City Time Limit: 1 Second      Memory Limit:32768 KB JAVAMAN is visiting Dream City and he see ...

  7. hdu 5311(暴力)

    题意:要求在一个字符串中找出三段,然后能拼成一个固定的单词,问是否可行 BC周年庆第二题,我枚举了那个单词的切断位置,然后到给的字符串里分别找,然后就没有然后了``` #include<stdi ...

  8. 一个简单的批量更新oracle 数据库中 最近的服务商名称的数据

    有一个需求是这样的,我们需要更新数据库中的数据,数据时这样的 1.大约50万以上 2. 数据中有较多的重复数据 3. 需要将表中最近的代理商的名称赋值给行中的服务商名称 4. 代理商的名称可能有多个, ...

  9. Oracle connect resource权限

    connect resource权限:grant connect,resource to user;后用户包括的权限:CONNECT角色: --是授予最终用户的典型权利,最基本的ALTER SESSI ...

  10. RabbitMQ客户端负载均衡算法

    负载均衡(Load balance)是一种计算机网络技术,用于在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最佳资源使用.最大化吞吐率.最小响应时间以及避免过载的 ...