设为首页 加入收藏

TOP

Spark Streaming知识总结
2018-12-06 01:23:24 】 浏览:20
Tags:Spark Streaming 知识 总结

Spark Streaming原理

Spark Streaming 是基于spark的流式批处理引擎。其基本原理是:将实时输入数据流以时间片为单位进行拆分,然后经Spark引擎以类似批处理的方式处理每个时间片数据。
在这里插入图片描述

Spark Streaming作业流程

在这里插入图片描述

  • 客户端提交作业后启动Driver(Driver是spark作业的Master);
  • 每个作业包含多个Executor,每个Executor以线程的方式运行task,Spark Streaming至少包含一个receiver task(可选的);
  • Receiver接收数据后生成Block,并把BlockId汇报给Driver,然后备份到另外一个Executor上;
  • ReceiverTracker维护Reciver汇报的BlockId;
  • Driver定时启动JobGenerator,根据Dstream的关系生成逻辑RDD,然后创建Jobset,交给JobScheduler;
  • JobScheduler负责调度Jobset,交给DAGScheduler,DAGScheduler根据逻辑RDD,生成相应的Stages,每个stage包含一到多个task;
  • TaskScheduler负责把task调度到Executor上,并维护task的运行状态;
  • 当tasks、stages、jobset完成后,单个batch才算完成。

Spark Streaming 与 Strom

联系:
流式系统的特点:
低延迟。秒级或更短时间的响应
高性能
分布式
可扩展。伴随着业务的发展,数据量、计算量可能会越来越大,所以要求系统是可扩展的
容错。分布式系统中的通用问题,一个节点挂了不能影响应用

区别:
1、同一套系统,安装spark之后就一切都有了
2、spark较强的容错能力;strom使用较广、更稳定
3、storm是用Clojure语言去写的,它的很多扩展都是使用java完成的
4、任务执行方面和strom的区别是:
spark steaming数据进来是一小段时间的RDD,数据进来之后切成一小块一小块进行批处理
storm是基于record形式来的,进来的是一个tuple,一条进来就处理一下
5、中间过程实质上就是spark引擎,只不过sparkstreaming在spark之后引擎之上动了一点手脚:对进入spark引擎之前的数据进行了一个封装,方便进行基于时间片的小批量作业,交给spark进行计算

离散数据流

Spark Streaming最主要的抽象是DStream(Discretized Stream,离散化数据流),表示连续不断的数据流。
在内部实现上,Spark Streaming的输入数据按照时间片(如1秒)分成一段一段,每一段数据转换为Spark中的RDD,这些分段就是DStream,并且对DStream的操作都最终转变为对相应的RDD的操作。
Spark Streaming提供了被称为离散化流或者DStream的高层抽象,这个高层抽象用于表示数据的连续流;

创建DStream的方式:由文件、Socket、Kafka、Flume等取得的数据作为输入数据流;或其他DStream进行的高层操作;

在内部,DStream被表达为RDDs的一个序列。
1、Dstream叫做离散数据流,是一个数据抽象,代表一个数据流。这个数据流可以从对输入流的转换获得
2、Dstream是RDD在时间序列上的一个封装
3、DStream的内部是通过一组时间序列上连续的RDD表示,每个都包含了特定时间间隔的数据流,RDD代表按照规定时间收集到的数据集
4、DStream这种数据流抽象也可以整体转换,一个操作结束后转换另外一种DStream
5、DStream的默认存储级别为<内存+磁盘>
6、sparkstreaming有一种特别的操作:windows操作,称为窗口操作,实质是对固定的以时间片积累起来的几个RDD作为一整体操作
7、可以使用persist()函数进行序列化(KryoSerializer)

输入输出数据源

Spark Streaming可整合多种输入数据源,如:
文件系统(本地文件、HDFS文件)
TCP套接字
Flume
Kafka
处理后的数据可存储至文件系统、数据库等系统中

Spark Streaming 读取外部数据

在Spark Streaming中,有一个组件Receiver,作为一个长期运行的task跑在一个Executor上;

每个Receiver都会负责一个input DStream(比如从文件中读取数据的文件流,比如套接字流,或者从Kafka中读取的一个输入流等等);

Spark Streaming通过input DStream与外部数据源进行连接,读取相关数据。这项工作由Receiver完成。

Streaming 程序基本步骤

1、创建输入DStream来定义输入源

2、通过对DStream应用转换操作和输出操作来定义流计算

3、用streamingContext.start()来开始接收数据和处理流程;start之后不能再添加业务逻辑。

4、通过streamingContext.awaitTermination()方法来等待处理结束(手动结束或因为错误而结束)

5、可以通过streamingContext.stop()来手动结束流计算进程

StreamingContext 对象

StreamingContext 对象可以通过 SparkConf 对象创建;

不要硬编码 master 参数在集群中, 而是通过 spark-submit 接收参数;

对于本地测试和单元测试, 可以传递“local[*]” 来运行 Spark Streaming 在进程内运行(自动检测本地系统的CPU内核数量);

分批间隔时间基于应用延迟需求和可用的集群资源进行设定(设定间隔要大于应用数据的最小延迟需求,同时不能设置太小以至于系统无法在给定的周期内处理完毕)

其他问题

StreamingContext 对象也可以通过SparkContext对象创建。在context创建之后,可以接着开始如下的工作:
定义 input sources,通过创建 input Dstreams 完成
定义 streaming 计算,通过DStreams的 transformation 和 output 操作实现
启动接收数据和处理,通过 streamingContext.start()
等待处理停止 (通常因为错误),通过streamingContext.awaitTermination()
处理过程可以手动停止,通过 streamingContext.stop()

备注:
一旦context启动, 没有新的 streaming 计算可以被设置和添加进来
一旦context被停止, 它不能被再次启动
只有一个StreamingContext在JVM中在同一时间可以被激活
StreamingContext.stop()执行时,同时停止了SparkContext

基本输入源

文件流

1、文件必须是cp到指定的路径中,不能是mv。新建文件也可以。
hdfs、本地文件系统都可以

2、文件流不需要运行接收器,可以不分配核数,即可以使用local[1],这是特例

Socket(套接字)流

Spark Streaming可以通过Socket端口监听并接收数据,然后进行相应处理

编写基于套接字的WordCount程序

新开一个命令窗口,启动nc程序:
nc -lk 9999
(nc 需要安装 yum install nc)

随后可以在nc窗口中随意输入一些单词,监听窗口会自动获得单词数据流信息,在监听窗口每隔x秒就会打印出词频统计信息,可以在屏幕上出现结果。

备注:使用local[],可能存在问题。
如果给虚拟机配置的cpu数为1,使用local[
]也只会启动一个线程,该线程用于receiver task,此时没有资源处理接收达到的数据。
【现象:程序正常执行,不会打印时间戳,屏幕上也不会有其他有效信息】

有几个问题:
日志信息太多,不爽,能改善吗?
加入 setLogLevel

可以从别的机器发送字符串吗,可以监听别的机器的端口吗?
nc –lk 9999
ssc.socketTextStream(“node1”, 9999)
nc命令只能将字符串发送到本地的端口;
streaming程序可以监听其他机器的端口

每次都需要手动输入字符串,实在不爽!能写一个模仿nc的程序,向固定端口发送数据吗?

RDD队列流

调试Spark Streaming应用程序的时候,可使用streamingContext.
queueStream(queueOfRDD)创建基于RDD队列的Dstream;

新建一个RDDQueueStream.scala代码文件,功能是:每秒创建一个RDD,Streaming每隔5秒就对数据进行处理;

这种方式多用来测试streaming程序。
在这里插入图片描述
备注:
oneAtATime:缺省为true,一次处理一个RDD,
设为false,一次处理全部RDD;
RDD队列流可以使用local[1];
涉及到同时出队和入队操作,所以要做同步;


编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spark将数据压缩存储 下一篇spark集群模式的部署

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }