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

转载于:https://www.cnblogs.com/dt-zhw/p/5495978.html

Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展相关推荐

  1. Spark Streaming揭秘 Day13 数据安全容错(Driver篇)

    Spark Streaming揭秘 Day13 数据安全容错(Driver篇) 书接上回,首先我们要考虑的是在Driver层面,有哪些东西需要维持状态,只有在需要维持状态的情况下才需要容错,总的来说, ...

  2. Spark Streaming揭秘 Day16 数据清理机制

    Spark Streaming揭秘 Day16 数据清理机制 今天主要来讲下Spark的数据清理机制,我们都知道,Spark是运行在jvm上的,虽然jvm本身就有对象的自动回收工作,但是,如果自己不进 ...

  3. spark streaming 自定义接收数据源Receiver测试

    spark streaming 自定义接收数据源Receiver测试 package orderimport org.apache.log4j.{Level, Logger} import org.a ...

  4. Spark Streaming揭秘 Day14 State状态管理

    Spark Streaming揭秘 Day14 State状态管理 今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作.State是SparkStreaming ...

  5. Spark Streaming之Kafka的Receiver和Direct方式

    一 Receiver方式 Receiver是使用Kafka的high level的consumer API来实现的.Receiver从Kafka中获取数据都是存储在Spark Executor内存中的 ...

  6. Spark Streaming实践和优化

    2019独角兽企业重金招聘Python工程师标准>>> Spark Streaming实践和优化 博客分类: spark 在流式计算领域,Spark Streaming和Storm时 ...

  7. Spark Streaming 图片处理案例介绍

    Spark Streaming 图片处理案例介绍 本文首先介绍了流式处理框架的设计原理.Spark Streaming 的工作原理,然后通过一个基于 Spark Streaming 编写的读取.分析. ...

  8. Spark 定制版:002~Spark Streaming(二)

    本讲内容: a. 解密Spark Streaming运行机制 b. 解密Spark Streaming架构 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. ...

  9. Spark Streaming学习笔记

    特点: Spark Streaming能够实现对实时数据流的流式处理,并具有很好的可扩展性.高吞吐量和容错性. Spark Streaming支持从多种数据源提取数据,如:Kafka.Flume.Tw ...

最新文章

  1. 使用SVG中的Symbol元素制作Icon
  2. Spring 整合 Junit
  3. C++面试题:list和vector有什么区别
  4. 小米盒子4 android版本,安卓系统越用越卡,曾学忠:小米 10 至尊纪念版搭载黑科技 MITurbo 4.0 技术...
  5. 2019.7.13刷题统计
  6. garmin USB: linux USB host驱动
  7. 亚马逊云服务(AWS)中国与毕马威中国建立战略合作伙伴关系
  8. 转载:WPF binding
  9. liunx 系统下面安装jdk
  10. Atitit.并发编程原理与概论 attilax总结
  11. HTTP/HTTPS/SOCKS5协议的区别
  12. 超好用的截屏标注软件Snipaste
  13. 生活计算机的模拟环境中,惊人发现:人类生活在高等文明创建的模拟环境中!...
  14. 麦子学院字符设备驱动201126
  15. 小米路由器3c 虚拟服务器,小米路由器3C,怎么刷breed啊?可以吗
  16. java8新特性回顾(四)---并发增强之Striped64和longAdder
  17. Jenkins从svn获取代码报”E170001“异常问题解决
  18. JMeter入门教程详解
  19. 气象数据的可视化展现形式
  20. IE中的看板管理在软件开发中的应用

热门文章

  1. 图片在容器里垂直居中
  2. 解决kubernetes中ingress-nginx配置问题
  3. Apache Flink 漫谈系列(12) - Time Interval(Time-windowed) JOIN...
  4. python中的有序字典
  5. 008 centos7安装docker ce
  6. linux的文件系统及节点表
  7. c#调用cmd执行相关命令
  8. C#----DataGridView控件60招(一) [转]
  9. Servicehot和你说说运维自动化的那些事儿
  10. css属性cusor