【SPARK】Spark Streaming简介

Spark Streaming可以整合多种输入数据源,如Kafka、Flume、HDFS甚至是普通的TCP套接字。经处理后的数据可存储至文件系统、数据库、或显示在仪表盘。

 

Spark Streaming执行流程

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

DStream操作示意图

Spark Streaming最主要的抽象是DStream(Discretized Stream,离散化数据流),表示连续不断的数据流。在内部实现上,Spark Streaming的输入数据按照时间片(如1秒)。一个DStream,就是一堆的RDD,即RDD集合,所以多DStream的操作就是对RDD的操作

Spark输入源

文件流:https://github.com/chris1132/spark_lecture/blob/master/src/main/scala/com/chovy/spark/SparkStreaming/FileStream.scala

套接字流:https://github.com/chris1132/spark_lecture/blob/master/src/main/scala/com/chovy/spark/SparkStreaming/SocketSream.scala

RDD队列流:https://github.com/chris1132/spark_lecture/blob/master/src/main/scala/com/chovy/spark/SparkStreaming/RDDQueueStream.scala

kafka:https://github.com/chris1132/spark_lecture/tree/master/src/main/scala/com/chovy/spark/SparkStreaming/kafka

DStream无状态转换操作

一个DStream,就是一堆的RDD,即RDD集合,所以多DStream的操作就是对RDD的操作

map(func):对DStream的每个元素,采用func函数进行转换,得到一个新的DStream

flatMap(func):与map相似,但是每个输入项可用被映射为0个或者多个输出项

repartition(numPartitions):通过创建更多或更少的分区改变DStream的并行程度

count():统计源DStream中每个RDD的元素数量

filter(func):返回一个新的DStream,仅包含源DStream中满足函数func的项

reduce(func):利用函数func聚集源DStream中每个RDD的元素,返回一个包含单元素RDDs的新DStream

union(otherStream):返回一个新的DStream,包含源DStream和其他DStream的元素

countByValue():应用于元素类型为K的DStream上,返回一个(K,V)键值对类型的新DStream,每个键的值是在原DStream的每个RDD中的出现次数

reduceByKey(func,[numTasks]):当一个由(K,V)键值对组成的DStream上执行该操作时,返回一个新的由(K,V)键值对组成的DStream,每一个key的值均由给定的reduce函数聚集起来

无状态转换

每次统计都是只统计当前批次到达的单词的词频,和之前批次无关,不会进行累计。如:“套接字流”的词频统计

有状态转换

1、滑动窗口转换操作

  • 事先设定一个滑动窗口的长度(也就是窗口的持续时间)。如下图为time3-time5的3秒
  • 设定滑动窗口的时间间隔(每隔多长时间执行一次计算),让窗口按照制定时间间隔在源DStream上滑动。如下图为2秒
  • 每次窗口停放的位置上,都会有一部分DStream(或者一部分RDD)被框入窗口内,形成一个小段的DStream
  • 可以启动对这个小段DStream的计算

常用操作方法:

window(windowLength,slideInterval):基于源DStream产生的窗口化的批数据,计算得到一个新的DStream

countByWindow(windowLength,slideInterval):返回流中元素的一个滑动窗口数

reduceByWindow(func,windowLength,slideInterval):返回一个单元素流。利用函数func聚集滑动时间间隔的流的元素创建这个单元素流。函数func必须满足结合律,从而可以支持并行计算

reduceByKeyAndWindow(func,windowLength,slideInterval,[numTasks]):应用到一个(k,v)键值对组成的DStream上时,会返回一个由(k,v)键值对组成的新的DStream。每一个key的值均由给定的reduce函数(func函数)进行聚合计算。PS:在默认情况下,这个算子利用了spark默认的并发任务数去分组。可以通过numTasks参数的设置来指定不同的任务数

reduceByKeyAndWindow(func,invFunc,windowLength,slideInterval,[numTasks]):更高效

val worldCounts = lines.reduceByKeyAndWindow(_+_,_-_,Minutes(2),Seconds(10),2)

如lines为("a",1)("b",1)("c",1)等键值对组成的DStream。t0时刻统计完窗口的数据,到了t1时刻,有部分数据离开窗口,由新数据进入窗口,_+_函数把新增的数据加入到统计结果中,用_-_函数从统计结果中减掉离开的数据

updateStateByKey:跨批次间的状态维护,对于有状态转换操作而言,本批次的词频统计,会在之前批次的词频统计结果的基础上进行不断累加,所以,最终统计得到的词频,是所有批次的单词的总的词频统计结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肚子饿没人理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值