spark streaming是建立在spark core之上的,也就说spark streaming任务最终执行还是依赖于RDD模型。在转化成最终的RDD模型执行前,spark streaming主要需要处理以下几个问题:

a,每个batch的RDD是怎么根据用户的代码生成的(对应JobGenerator)?

b,数据是怎么从外部接收的(对应receiver)?

c,每个batch的任务是怎么触发的(对应JobGenerator)?

d,怎么保证spark streaming任务的可靠性?

本文主要针对a,b,c这三个问题做深入分析。

1,DStream拓扑结构

当写spark批处理应用时,通过RDD形成了DAG的计算拓扑。类似的,在spark streaming中通过DStream形成了计算模板的拓扑。当定义好DStream的计算模板以后,每个batch就可以基于该模板生成RDD的计算拓扑。以example中streaming的NetworkWordCount为例:

val lines = ssc.socketTextStream(args(0), args(1).toInt, StorageLevel.MEMORY_AND_DISK_SER)
val words = lines.flatMap(_.split(" "))
val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
wordCounts.print()

生成的DStream拓扑结构如下:

以上拓扑结构图中的节点主要分为三类:输入流,一般DStream计算节点,输出流节点。

2,DStream处理的整体流程

当StreamingContext启动以后,streaming任务的整体流程逻辑图如下:

核心要点如下:

1,ReceiverTracker(位于driver端),主要负责对位于executor端的Receiver进行控制。包括通过提交任务启动Receiver,接收Receiver端Block相关的信息汇报等。

2,JobGenerator(位于driver端),主要作用是通过一个定时器定期生成任务。生成任务主要包括四个步骤:

a,根据receiver接收并且上报给ReceiverTracker的信息,生成当前batch的RDD输入数据。

b,根据用户定义的DStream拓扑结构模板生成当前batch的Jobs

c,将步骤b中生成的Job分装成Jobset,交由JobHandler去执行。在Job执行过程中,将有可能触发底层RDD任务提交和计算。

d,通过检查点,保存当前JobGraph的状态。

3,ReceiverSupervisor(位于executor端),主要负责管理executor段的Reciver,包括启动Receiver,保存Reciever接收的数据以及发送相关消息给Driver端的ReceiverTracker。

接下来,将解释一下开头提出的问题

Q1,每个batch的RDD是怎么根据用户的代码生成的(对应JobGenerator)?

首先,应用通过DStream形成了RDD生成的模板。其次,在JobGenerator定时按照batchTime生成的任务的时候,会从输出流开始(ForEachDStream注册),递归地调用DStream中getOrCompute方法,封装成Job。在Job中就包含了每个batch之间的RDD DAG。

Q2,数据是怎么从外部接收的(对应receiver)?

首先,接收数据实在executor端进行的。其次,Receiver持续不断的接受数据,并且将数据通过ReceiverSupervisor借助RecevierHanlder进行保存,最终将数据按block保存,并且向Driver汇报接受的数据信息。

Q3,每个batch的任务是怎么触发的(对应JobGenerator)?

在Driver端的JobGenerator有一个定时器,每隔batchTime时间定期出发一次任务生成。具体要做的事情已阐述。

Q4,怎么保证spark streaming任务的可靠性?

保证可靠性涉及到driver和executor端,在本文中,可以看到的一点是在任务生成以后,会通过检查点方式保存当前JobGraph的状态。其他待后续总结。

深入理解spark streaming的更多相关文章

  1. 通过案例对 spark streaming 透彻理解三板斧之一: spark streaming 另类实验

    本期内容 : spark streaming另类在线实验 瞬间理解spark streaming本质 一.  我们最开始将从Spark Streaming入手 为何从Spark Streaming切入 ...

  2. Spark Streaming高级特性在NDCG计算实践

    从storm到spark streaming,再到flink,流式计算得到长足发展, 依托于spark平台的spark streaming走出了一条自己的路,其借鉴了spark批处理架构,通过批处理方 ...

  3. 大数据开发实战:Spark Streaming流计算开发

    1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...

  4. spark streaming基础知识1

    1.怎么理解spark streaming中的dstream? 它是spark streaming的基础数据结构,代表着(time,RDD)序列,有两种生成方式,一种是基于流数据创建(kafka,so ...

  5. 1.Spark Streaming另类实验与 Spark Streaming本质解析

    1 Spark源码定制选择从Spark Streaming入手  我们从第一课就选择Spark子框架中的SparkStreaming. 那么,我们为什么要选择从SparkStreaming入手开始我们 ...

  6. 3.spark streaming Job 架构和容错解析

    一.Spark streaming Job 架构 SparkStreaming框架会自动启动Job并每隔BatchDuration时间会自动触发Job的调用. Spark Streaming的Job ...

  7. spark第六篇:Spark Streaming Programming Guide

    预览 Spark Streaming是Spark核心API的扩展,支持高扩展,高吞吐量,实时数据流的容错流处理.数据可以从Kafka,Flume或TCP socket等许多来源获取,并且可以使用复杂的 ...

  8. Spark Streaming基础概念

    为了更好地理解Spark Streaming 子框架的处理机制,必须得要自己弄清楚这些最基本概念. 1.离散流(Discretized Stream,DStream):这是Spark Streamin ...

  9. Spark Streaming 入门

    概述 什么是 Spark Streaming? Spark Streaming is an extension of the core Spark API that enables scalable, ...

随机推荐

  1. C# 事件处理与自定义事件

    http://blog.csdn.net/cyp403/article/details/1514023 图一                                               ...

  2. elastica安装

    https://www.elastic.co/guide/en/elasticsearch/reference/current/zip-targz.html

  3. centreon问题总结

    1.SNMP TABLE ERROR : Requested table is empty or does not exist 这是SNMP的服务端查询客服端失败,失败的原理是权限不足 解决办法: v ...

  4. bootstrap的学习注意点

    1.bootstrop里面所有的内容都需要用一个container 容器包裹起来: 2.一屏二屏什么的,是通过id 与href实现的: 3.下拉与菜单之类的都有固定的代码: 4.需要修改相关属性的话, ...

  5. A+B Problem && OJ推荐【持续更新】

    目录 List 前言 长郡 Position: code 1. 2. 持续更新,么么哒 List 前言 有没有觉得写这篇文章很奇怪,这个还是有原因的.①很多OJ都有着道题,所以发个博客②这可以介绍很多 ...

  6. 【HDU 3555】 Bomb

    [题目链接] 点击打开链接 [算法] 数位DP [代码] #include<bits/stdc++.h> using namespace std; #define MAXL 15 type ...

  7. C++ set和map的简单使用

    C++中的STL模板库的功能可谓相当强大.今天我们来简单说一下set和map的使用方法. 1.pair 我们先来说一下pair.pair定义在头文件<utility>中,其本身相当于一个已 ...

  8. eclipse恢复界面默认设置

    使用eclipse的时候有时候会一不小心把一些界面设置给弄乱,可以恢复默认界面设置 eclipse导航栏window选项卡 找到Perspective->点击Reset Perspective ...

  9. Sublime Text3 python代码去除白色框框

    之所以会出现白色框框,是因为代码不符合PEP8规范!!! 可以装一个 AUTOPEP8 插件,然后按 Ctrl + Alt + r 就会自动帮你PEP8格式化,白色框框就会消失了... 这是原来的博文 ...

  10. Synchronized之三:Synchronized与线程中断、线程wait

    线程中断 见<Thread之八:interrupt中断> 正如中断二字所表达的意义,在线程运行(run方法)中间打断它,在Java中,提供了以下3个有关线程中断的方法 //中断线程(实例方 ...