Spark Streaming揭秘 Day9

从Receiver的设计到Spark框架的扩展

Receiver是SparkStreaming的输入数据来源,从对Receiver整个生命周期的设计,我们可以充分领略到Spark框架设计之巧妙,废话少说,让我们来看代码。

解决的问题

在开始之前,让我们先明确一个概念,就是Receiver于inputDStream之间的关系,从如下代码中,我们可以看到,receiver其实是由inputDStream映射得到的,也就是说Receiver和inputDStream是一一对应的。

让我们需要明确一下需要解决的问题,或者说设计的目标。

Receiver其实是一个独立的应用程序,一边不断从外部数据源接收数据,一边向进行数据存储。以如下SocketInputStream为例,其实就是一个标准的Socket数据接收程序。

那么,作为一个应用程序,如何在集群上进行运行就是一个要解决的问题。
通过前面几讲的说明,我们知道,在Spark中是将Receiver作为一个Job来进行运行的。
但是如果只是简单的作为一个Job来运行,因为Spark core并不知道Receiver的特殊性,所以可能在一个executor上启动多个receiver,这时候会出现两个非常大的问题:

  1. 由于会与其他应用Job共同调度,负载可能不均衡。
  2. 如果receiver启动失败的话,可能导致整个应用程序无法工作,无法保证高可用。

事实上,对整个Receiver运行的设计,我们就是要突破Spark本身限制,解决这两个关键的问题。

解决负载均衡问题

如下代码是receiver的启动代码:

进入startReceiver

通过上面两段代码,我们可以看到两点。

  1. 每个Receiver的启动都会触发一个作业。
  2. 在启动作业时,是基于scheduledLocation来决定运行的位置。

首先,分开作业,可以起到很好的隔离作用,不同receiver互相不会发生影响,并且可以在最大程度负载均衡.
其次,利用RDD可自定义的机制,通过对scheduledLocation的操作,其实SparkStreaming是把负载均衡的策略掌握到了自己手里,而不是使用Spark自身的机制!!!

让下面看下scheduledLocation的生成,策略本身比较复杂,从注释我们可以看到,主要还是会以当前最小负载的原则进行分配,从而确保Receiver尽可能的分布。

解决高可用问题

高可用的设计目标,简单来说,就是只要集群存在,我们希望receiver一定启动成功。

在这里,比较巧妙的使用了Job启动的回调机制,可以看到,当失败时会自动进行重启操作,只要集群在运行,就会进行永无休止的重试。

那Spark原生的重试限制如何解决呢,在如下代码中,实际上是把Spark原生的重试机制进行了短路,和负载均衡类似,将这一机制控制到SparkStreaming手中,绕开了重试次数的限制。

最后,在重试机制中,使用了future的语法,使得重试在缓冲线程池中运行,支持并发启动,还可以控制负载。

其他

说实话,我是有点被这段代码震到了,SparkStreaming中采用了一组非常简洁的代码,就扩展了Spark框架,并解决了一系列其实是在分布式系统中非常通用的问题,真是精彩绝伦!!!

欲知后事如何,且听下回分解

DT大数据每天晚上20:00YY频道现场授课频道68917580

Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展的更多相关文章

  1. Spark Streaming揭秘 Day19 架构设计和运行机制

    Spark Streaming揭秘 Day19 架构设计和运行机制 今天主要讨论一些SparkStreaming设计的关键点,也算做个小结. DStream设计 首先我们可以进行一个简单的理解:DSt ...

  2. Spark Streaming揭秘 Day11 Receiver Tracker的具体实现

    Spark Streaming揭秘 Day11 Receiver Tracker的具体实现 ReceiverTracker是运行在Driver上Receiver管理程序,今天让我们深入学习一下. 核心 ...

  3. Spark Streaming揭秘 Day33 checkpoint的使用

    Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...

  4. Spark Streaming揭秘 Day32 WAL框架及实现

    Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...

  5. Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析

    Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28 ...

  6. Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming

    Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...

  7. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  8. Spark Streaming揭秘 Day24 Transformation和action图解

    Spark Streaming揭秘 Day24 Transformation和action图解 今天我们进入SparkStreaming的数据处理,谈一下两个重要的操作Transfromation和a ...

  9. Spark Streaming揭秘 Day20 动态Batch size实现初探(上)

    Spark Streaming揭秘 Day20 动态Batch size实现初探(上) 今天开始,主要是通过对动态Batch size调整的论文的解析,来进一步了解SparkStreaming的处理机 ...

随机推荐

  1. 关于 error: LNK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案【Qt】【 VS2010】

    近日因为换装硬盘重装了系统,于是不得不重新安装VS2010 Qt 这些个开发工具.安装过程都没什么问题,安装完了顺手点了个例子测试下好没好用,于是就出现了标题中的错误提示.之前处理过一次,时间久了就忘 ...

  2. JavaFX(二)自定义窗口标题栏

    1.问题场景 PC客户端登录界面仿QQ,上边显示图片,下边显示输入框和登录按钮.而JavaFX默认的窗口,不满足需求. 2.解决思路 隐藏窗口默认的标题栏,使用创建label对象,使用css将按钮图片 ...

  3. 前端必会css整理

    1.设置css样式的三种方式?         外部样式表,引入一个外部css文件         内部样式表,将css代码放在<head>标签内部         内联样式,将css样式 ...

  4. 查看Oracle执行计划的几种方法

    查看Oracle执行计划的几种方法 一.通过PL/SQL Dev工具 1.直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果.其中,Cos ...

  5. Umbraco入门(一)--在VS中安装Umbraco

    在VS中安装Umbraco 由于Vs中自己集成的IIS,所以在安装Umbraco是不用再想以前那么麻烦,需要设置IIS等等…… 使用VS的NuGet程序包管理器   创建一个用空的ASP Web应用程 ...

  6. hdu 4340 树状DP

    思路:我们定义两个数组,ant[Maxn][2],bob[Maxn][2].ant[i][0]表示还未确定哪个城市被全费用占领,ant[i][1]表示确定了哪个城市被全费用占领.那么ant[i][0] ...

  7. iOS 视频开发-AVPlayer

    如果我只是简单的播放一个视频,而不需要考虑播放器的界面.iOS9.0 之前使用 MPMoviePlayerController, 或者内部自带一个 view 的 MPMoviePlayerViewCo ...

  8. 在CentOS6.4中安装配置LAMP环境的详细步骤

    本文详细介绍了CentOS6.4系统中安装LAMP服务并对其进行配置的过程,即安装Apache+PHP+Mysql,参照了网上大神的设置,其他Linux发行系统可以参考~ 在本文中部分命令操作需要ro ...

  9. linq检索带命名空间的xml

    XElement el = XElement.Load(fil); XNamespace ns = "http://schemas.microsoft.com/ado/2009/11/edm ...

  10. Jackson - Date Handling

    Handling dates on Java platform is complex business. Jackson tries not to make it any harder than it ...