资源来自厦门大学林子雨视频

一.spark streaming原理

Spark Streaming是Spark的核心组件之一,为Spark提供了可拓展、高吞吐、容错的流计算能力。如下图所示,Spark Streaming可整合多种输入数据源,如Kafka、Flume、HDFS,甚至是普通的TCP套接字。经处理后的数据可存储至文件系统、数据库,或显示在仪表盘里。

Spark Streaming的基本原理是将实时输入数据流以时间片(秒级)为单位进行拆分,然后经Spark引擎以类似批处理的方式处理每个时间片数据,执行流程如下图所示:

Spark Streaming最主要的抽象是DStream(Discretized Stream,离散化数据流),表示连续不断的数据流。在内部实现上,Spark Streaming的输入数据按照时间片(如1秒)分成一段一段的DStream,每一段数据转换为Spark中的RDD,并且对DStream的操作都最终转变为对相应的RDD的操作。例如,下图展示了进行单词统计时,每个时间片的数据(存储句子的RDD)经flatMap操作,生成了存储单词的RDD。整个流式计算可根据业务的需求对这些中间的结果进一步处理,或者存储到外部设备中。

Spark Streaming和Storm最大的区别在于,Spark Streaming无法实现毫秒级的流计算,而Storm可以实现毫秒级响应。
Spark Streaming无法实现毫秒级的流计算,是因为其将流数据按批处理窗口大小(通常在0.5~2秒之间)分解为一系列批处理作业,在这个过程中,会产生多个Spark 作业,且每一段数据的处理都会经过Spark DAG图分解、任务调度过程,因此,无法实现毫秒级相应。Spark Streaming难以满足对实时性要求非常高(如高频实时交易)的场景,但足以胜任其他流式准实时计算场景。相比之下,Storm处理的单位为Tuple,只需要极小的延迟。
Spark Streaming构建在Spark上,一方面是因为Spark的低延迟执行引擎(100毫秒左右)可以用于实时计算,另一方面,相比于Storm,RDD数据集更容易做高效的容错处理。此外,Spark Streaming采用的小批量处理的方式使得它可以同时兼容批量和实时数据处理的逻辑和算法,因此,方便了一些需要历史数据和实时数据联合分析的特定应用场合。

二.Spark Streaming工作原理

在Spark中,一个应用(Application)由一个任务控制节点(Driver)和若干个作业(Job)构成,一个作业由多个阶段(Stage)构成,一个阶段由多个任务(Task)组成。当执行一个应用时,任务控制节点会向集群管理器(Cluster Manager)申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行task。在Spark Streaming中,会有一个组件Receiver,作为一个长期运行的task跑在一个Executor上。每个Receiver都会负责一个input DStream(比如从文件中读取数据的文件流,比如套接字流,或者从Kafka中读取的一个输入流等等)。Spark Streaming通过input DStream与外部数据源进行连接,读取相关数据。

spark Streaming工作原理:

编写Spark Streaming程序的基本步骤是:
1.通过创建输入DStream来定义输入源
2.通过对DStream应用转换操作和输出操作来定义流计算。
3.用streamingContext.start()来开始接收数据和处理流程。
4.通过streamingContext.awaitTermination()方法来等待处理结束(手动结束或因为错误而结束)。
5.可以通过streamingContext.stop()来手动结束流计算进程。

创建streamingContext对象

如果要运行一个Spark Streaming程序,就需要首先生成一个StreamingContext对象,它是Spark Streaming程序的主入口。因此,在定义输入之前,我们首先介绍如何创建StreamingContext对象。我们可以从一个SparkConf对象创建一个StreamingContext对象。
请登录Linux系统,启动pyspark。进入pyspark以后,就已经获得了一个默认的SparkConext,也就是sc。因此,可以采用如下方式来创建StreamingContext对象:

from pyspark import SparkContext
>>> from pyspark.streaming import StreamingContext
>>> ssc = StreamingContext(sc, 1)

1表示每隔1秒钟就自动执行一次流计算,这个秒数可以自由设定。
如果是编写一个独立的Spark Streaming程序,而不是在pyspark中运行,则需要通过如下方式创建StreamingContext对象:

from pyspark import SparkContext, SparkConf
from pyspark.streaming import StreamingContext
conf = SparkConf()
conf.setAppName('TestDStream')
conf.setMaster('local[2]')
sc = SparkContext(conf = conf)
ssc = StreamingContext(sc, 1)

setAppName(“TestDStream”)是用来设置应用程序名称,这里我们取名为“TestDStream”。setMaster(“local[2]”)括号里的参数”local[2]’字符串表示运行在本地模式下,并且启动2个工作线程。

Spark学习之 Streaming相关推荐

  1. Spark学习之Spark Streaming(9)

    Spark学习之Spark Streaming(9) 1. Spark Streaming允许用户使用一套和批处理非常接近的API来编写流式计算应用,这就可以大量重用批处理应用的技术甚至代码. 2. ...

  2. Spark学习痛点和路线图

    Spark学习的痛点 对初学者(特别是自学者)学习来说,Spark学习有以下两大痛点. 1.头绪太多,不知道从哪学 从Spark的技术栈可以看到,涉及的技术从操作系统到外部组件.Spark框架.交互工 ...

  3. Hadoop学习系列之Hadoop、Spark学习路线(很值得推荐)

    Hadoop学习系列之Hadoop.Spark学习路线(很值得推荐) 文章出自:http://www.cnblogs.com/zlslch/p/5448857.html 1 Java基础: 视频方面: ...

  4. Spark学习之路一——Spark基础及环境搭建

    Spark学习之路一--Spark基础及环境搭建 文章目录 一. Spark 概述 1.1 概述 1.2 优势特性 1.2.1 运行速度快 1.2.2 容易使用 1.2.3 通用性 1.2.4 运行模 ...

  5. Apache Spark学习:利用Eclipse构建Spark集成开发环境

    介绍了如何使用Maven编译生成可直接运行在Hadoop 2.2.0上的Spark jar包,而本文则在此基础上, 介绍如何利用Eclipse构建Spark集成开发环境 . 不建议大家使用eclips ...

  6. Apache Spark学习:利用Scala语言开发Spark应用程序

    Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可以阅读网络教程 A Scala Tutorial for Ja ...

  7. Spark学习之Spark调优与调试(7)

    Spark学习之Spark调优与调试(7) 1. 对Spark进行调优与调试通常需要修改Spark应用运行时配置的选项. 当创建一个SparkContext时就会创建一个SparkConf实例. 2. ...

  8. 用Spark学习FP Tree算法和PrefixSpan算法

    在FP Tree算法原理总结和PrefixSpan算法原理总结中,我们对FP Tree和PrefixSpan这两种关联算法的原理做了总结,这里就从实践的角度介绍如何使用这两个算法.由于scikit-l ...

  9. Spark学习(一) -- Spark安装及简介

    标签(空格分隔): Spark 学习中的知识点:函数式编程.泛型编程.面向对象.并行编程. 任何工具的产生都会涉及这几个问题: 现实问题是什么? 理论模型的提出. 工程实现. 思考: 数据规模达到一台 ...

最新文章

  1. Django模板继承
  2. UVA1629 Cake slicing
  3. 她把肥皂放在矿泉水瓶盖上,第二天大吃一惊...…
  4. Java 的发展(历史)轨迹和历史变迁
  5. C#实现 Linq 序列的Distinct—— IEnumerable.Distinct()——IEqualityComparer
  6. 训练日志 2019.7.27
  7. 如何快速启动MongoDB服务?
  8. IOS的UIPickerView 和UIDatePicker
  9. Grid++Report——打印功能
  10. Perl篇:获取操作系统的信息
  11. 7种方式实现3栏布局
  12. 把mysql一个表的部分或全部数据复制追加到另一个表的方法
  13. drupal主题开发_佐治亚理工学院Drupal Web开发人员的首要考虑
  14. html meta标签之http-equiv(转)
  15. 自律给你自由——Android设计布局的新姿势
  16. 【SQL Server 还原数据库】:因为数据库正在使用,所以无法获得对数据库的独占访问权
  17. 计算机网络安全设计毕业设计,计算机网络安全及防护毕业设计论文01
  18. 19c 单实例打补丁
  19. m1芯片的mac怎样安装PS2021 m1芯片的mac安装Photoshop21适配版解决方案 2021最新方法
  20. 网易云音乐评论墙php源码,网易云音乐热评墙那些令人感慨的句子,哪一句打动了你?...

热门文章

  1. 王者服务器维护什么时间结束s19,王者荣耀S19什么时候开始 S18结束段位怎么掉...
  2. 霜狼老师TA学习笔记 - 渲染流程(光栅化阶段、逐片元操作)
  3. jsp注释与html注释区别,jsp注释和html注释的区别
  4. c 语言求字符数组长度,C/C++中获取数组长度的方法示例
  5. c语言10位域宽怎么写,C语言格式修饰符洋解
  6. Excel学习日记:L15-If函数
  7. Nacos配置中心设计分析-客户端
  8. 关于新浪微博里面长图加载功能的一点窥探
  9. veth pair上的两个ip能否ping通?
  10. ubuntu安装和卸载python3.8