spark发行版笔记11
本期概览:
ReceiverTracker架构设计
消息循环系统
ReceiverTracker具体的实现
Spark Streaming作为Spark Core基础 架构之上的一个应用程序,其中的ReceiverTracker接收到数据之后,具体该怎么进行数据处理呢?
为了弄清楚这个问题,首先,我们打开源码
找到ReceiverSupervisorImpl这个类
从源码中可以看出,写数据是通过ReceivedBlockHandler的对象receivedBlockHandler写的。写的过程中有俩种方式,一种是基于WAL方式进行容错写。一种是直接写(相对不安全)。如下图所示
然后存储数据完成后并报告给Driver,以便Driver对元数据进行存储,如下所示
用于汇报给Driver的消息类、如下图所示
上图谈到了Record,要注意到,一般专业的描述处理的数据的大小的时候,应该用多少条记录来描述更科学,一般说数据规模达到多少多少百亿条记录,而不是说数据规模达到多少PB的数据规模,这样不是很科学,因为记录可能有很多字段,比如说,1PB的数据,5个字段,和5PB的数据1个字段是差不多的。所以1PB的数据规模未必比5PB的数据规模体现出一个大数据引擎的数据处理能力。也比如说,有些数据是视频或者音频。更不适合说多少个PB来描述规模大小。
上图说明ReceiverSupervisorImpl中有ReceiverTracker的通信体,能进行与ReceiverTracker的通信
并且ReceiverSupervisorImpl将数据的元数据信息汇报给ReceiverTracker
于是,我们进入ReceiverTracker这个类,这个类是整个流处理数据管理的中心。
ReceiverTracker中有endpoint通信体,这个通信体接收来自ReceiverSuperVisorImpl的元数据的数据汇报。
接下来,我们再进入ReceiverTracker本身,从整体上认识ReceiverTracker。
记录Receiver的三种状态,分别为非活跃状态,正在执行调度任务状态,活跃状态
密封关键字,说明所有的子类都密封在这里,方便管理
/**
* This message will trigger ReceiverTrackerEndpoint to restart a Spark job for the receiver.
*/
这个消息用来告知为receiver启动一个job, ReceiverTracker有很多这样的case class用于通信。
private[streaming] case class RestartReceiver(receiver: Receiver[_])
extends ReceiverTrackerLocalMessage
再比如此类相同的消息
/**
* This message will trigger ReceiverTrackerEndpoint to send stop signals to all registered
* receivers.
*/
private[streaming] case object StopAllReceivers extends ReceiverTrackerLocalMessage
注意:param skipReceiverLaunch Do not launch the receiver. This is useful for testing.,如下图
简单的来说,ReceiverTracker可以简单的说包括Receiver的数据的启动接收,管理,回收三个过程。
事先来个预告,我们将把Streaming流处理的所有的代码一行行的过滤,讲整个streaming通过一滴水看世界。
所有的输入流都会交给grapx对象,因为该对象会将所有的待调度的数据统一调度。
内部还有一个成员叫做ReceiverBlockTracker
ListenerBus非常的重要,后续我们会重点分析ListenerBus的源代码,它在监控层面起着重要的作用。
在这里,可以看出ReceiverTracker的状态有如下的4种状态,分别为
初始化,开始,正在停止中,停止了。
接收到ReceiverSuperVisorImpl远程发送过来的消息之后进行处理的过程在此。
这也是今天的重点之一。
先写日志后再进行下一步操作,这里是出于容错的原因考虑的。
注意:这里如果指定了checkpoint目录的话,才会使得isWriteAheadLogEnabled为true.
ReceivedBlockTrackerLogEvent其实就是元数据信息。
用一个HashMap结构将Stream 与 BlockQueue中的Block一一对应,可谓是真的巧妙到了极点。
再回到我们的消息通信层面。
回复对方,告知对方,addBlock成功。并且保存有数据的元数据信息。
ReceivedBlockTracker类的主要的任务在于将Block分配给没有分配Block的Stream batch。
这是具体分配Block给batch的代码。
这里说明具体的分配是以batch time为单位分配的.
再次看看消息通信体。
这里说启动所有的Receiver.
启动所有的receiver
这样,整个数据接收的环节就打通了。
最后做点补充:
该阶段是CleanupOldBlocks阶段,此时将发送消息给ReceiverSuperVisorImpl,从而让它执行cleanUpOldBlocks方法。
/** Update a receiver's maximum ingestion rate */
最后stopAllReceivers,结束了。
spark发行版笔记11的更多相关文章
- spark发行版笔记10
感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制. 本期概览: 数据接收全生命周期的思考 大数据处理框架中,最重要的就是性能,性能是排在前面的.其次再考虑其他的.因为数 ...
- spark发行版笔记9
感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制. 本期概览: 1 Receiver生命全周期 首先,我们找到数据来源的入口,入口如下 Receiver的设计是极其巧妙 ...
- spark发行版笔记4Spark Streaming事务处理彻底掌握
Spark Streaming事务处理彻底掌握 感谢DT大数据梦工厂支持提供以下内容,DT大数据梦工厂专注于Spark发行版定制. 内容概括: 1Exactly once 2 输出不重复 1 正如银行 ...
- spark发行版笔记13
本期概览: ReceiverTracker架构设计 消息循环系统 ReceiverTracker具体的实现 Spark Streaming作为Spark Core基础 架构之上的一个应用程序,其中的R ...
- maven:无效的目标发行版:11
maven:无效的目标发行版:11 我之前在博客里是不记录bug和error的处理的,昨天听了一个资深程序员的视频,决定要改习惯了,记录一些自己平时遇到的问题 这个是我在mvn clean insta ...
- idea出现无效的源发行版:11
idea启动的时候报错: 点击->file->project structure->project
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Linux 桌面玩家指南:11. 在同一个硬盘上安装多个 Linux 发行版以及为 Linux 安装 Nvidia 显卡驱动
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- IDEA Error:java: 无效的源发行版: 11错误
IDEA Error:java: 无效的源发行版: 11错误 今天在网上下载了一个项目到本地运行报错 Error: Java : 无效的源发行版: 11 ,上网查了很多找到问题所在.项目的 JDK(P ...
随机推荐
- word域1
Description: 域是WORD中的一种特殊命令,它由花括号.域名(域代码)及选项开关构成.域代码类似于公式,域选项并关是特殊指令,在域中可触发特定的操作.在用WORD处理文档时若能巧妙应用域, ...
- synergy 两台Windows电脑配置过程
Synergy 介绍 软件作用 Synergy 两台独立电脑,共享一套鼠标和键盘的工具, 软件原理(我自己想的) 保证两台电脑在一个局域网内,可以相互Ping通的电脑(这样才能直接通过TCP连接) 将 ...
- ubuntu 14.04 vsftpd安装问题
sudo apt-get install vsftpd; 打开允许访问用户名 local_enable=YES write_enable=YES chroot_list_file=/etc/vsftp ...
- js 单例模式笔记
单例指一个类只有一个实例,这个类自行创建这个实例. 利用对象字面量直接生成一个单例: var singleton = { prop: 1, method: function(){ console.lo ...
- 前端中sprite.png的实现
通过background-position来控制X轴和Y轴,从而实现显示sprite.png中想要的ico或图案. 如下图所示:
- dom4j的quickstart
我所理解的dom4j就是用来解析XML文档的,XML文档的重要性不言而喻,用过框架的人谁不知道呢,是不是.但是实际上需要我们自己来解析XML文档的应用场景感觉不是很多,毕竟该解析的XML都已经被框架很 ...
- 实现LRU的两种方法---python实现
这也是豆瓣2016年的一道笔试题... 参考:http://www.3lian.com/edu/2015/06-25/224322.html LRU(least recently used)就不做过多 ...
- Javascript学习笔记:闭包题解(1)
代码: function createFunctions(){ var result=[]; for(var i=0;i<10;i++){ result[i]=function(){ retur ...
- CSS与JavaScript的一些问题汇总
通过最近的学习,总结了一些问题,可能总结得不够完善,但是好记性不如烂笔头,先记在这儿,后面看到更完整的回答,再进行修改. 1.事件流,如何阻止冒泡事件流:在点击一个按钮时,实则,按的父容器与按钮的父容 ...
- session、cookie
session:全局变量组 存放位置:存放在服务器上 用法:相当于一个变量的使用方法,存在于服务器内存上,抓取速度快 主界面: using System; using System.Collectio ...