Spark之Spark Streaming

SparkStreaming是Apache Spark提供的一个实时数据处理框架,它使用DStream(离散化流)作为核心抽象。DStream是由一系列RDD(弹性分布式数据集)构成的序列,用于表示随着时间推移的数据流。DStream可以通过多种方式创建,如从RDD队列、自定义数据源或Kafka数据源。无状态转换如map、flatMap和filter对每个批次独立操作,而有状态转换如updateStateByKey和基于窗口的操作则允许处理历史状态。DStream的输出操作包括保存到文件、打印或调用foreachRDD进行自定义处理。在SparkStreaming中,必须设置至少一个输出操作以启动流处理任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spark Streaming是什么

        Spark Streaming用于流式数据处理

DStream是什么

        Spark Streaming使用离散化流作为抽象表示,称作DStream,是随着时间的推移而得到的数据的序列。在DStream内部,每个时间区间收到的数据都作为RDD存在,DStream就是由这些RDD所组成的序列,DStream就是对RDD在实时处理场景中的一种封装。

架构图

DStream的创建 

        1.通过RDD队列

        2.自定义数据源接收器

        3.从kafka数据源接收

DStream转换

        1.无状态转化操作

        就是把RDD转化操作应用到DStream每个批次上,每个批次相互独立,自己算自己的。

        常规无状态转化操作

        DStream的部分无状态转化操作列在了下表中,都是DStream自己的API。

函数名称

目的

Scala示例

函数签名

map()

对DStream中的每个元素应用给定函数,返回由各元素输出的元素组成的DStream。

ds.map(x=>x + 1)

f: (T) -> U

flatMap()

对DStream中的每个元素应用给定函数,返回由各元素输出的迭代器组成的DStream。

ds.flatMap(x => x.split("  "))

f: T -> Iterable[U]

filter()

返回由给定DStream中通过筛选的元素组成的DStream

ds.filter(x => x != 1)

f: T -> Boolean

repartition()

改变DStream的分区数

ds.repartition(10)

N / A

reduceByKey()

将每个批次中键相同的记录规约。

ds.reduceByKey( (x, y) => x + y)

f: T, T -> T

groupByKey()

将每个批次中的记录根据键分组。

ds.groupByKey()

N / A

 Transform

        通过Transform可以将DStream每一批次的数据直接转换为RDD的算子操作。

2.有状态转化操作

        1.updateStateByKey() 

        用于键值对形式的DStream,可以记录历史批次状态。在参数中需要传递一个函数,在函数内部可以根据需求对新数据和历史状态进行整合处理,返回一个新的DStream。

        注意:使用updateStateByKey需要对检查点目录进行配置,会使用检查点来保存状态。会造成小文件过多,而且再次启动的时候会把间隔时间的周期再执行一次。

        2.WindowOperations

        Window Operations可以设置窗口的大小和滑动窗口的间隔来动态的获取当前Streaming的允许状态。所有基于窗口的操作都需要两个参数,分别为窗口时长以及滑动步长。

        窗口时长:计算内容的时间范围;

        滑动步长:隔多久触发一次计算。

        3.Window

        window(windowLength, slideInterval): 基于对源DStream窗口的批次进行计算返回一个新的DStream。

DStream输出

        DStream通常将数据输出到,外部数据库或屏幕上。

        DStream与RDD中的惰性求值类似,如果一个DStream及其派生出的DStream都没有被执行输出操作,那么这些DStream就都不会被求值。如果StreamingContext中没有设定输出操作,整个Context就都不会启动。

        saveAsTextFiles(prefix, [suffix]):以text文件形式存储这个DStream的内容。每一批次的存储文件名基于参数中的prefix和suffix。“prefix-Time_IN_MS[.suffix]”。

        saveAsObjectFiles(prefix, [suffix]):以Java对象序列化的方式将DStream中的数据保存为 SequenceFiles 。每一批次的存储文件名基于参数中的为"prefix-TIME_IN_MS[.suffix]"。 

        saveAsHadoopFiles(prefix, [suffix]):将Stream中的数据保存为 Hadoop files。每一批次的存储文件名基于参数中的为"prefix-TIME_IN_MS[.suffix]"。

        print():在运行流程序的驱动结点上打印DStream中每一批次数据的最开始10个元素。这用于开发和调试。

        foreachRDD(func):这是最通用的输出操作,即将函数func用于产生DStream的每一个RDD。其中参数传入的函数func应该实现将每一个RDD中数据推送到外部系统,如将RDD存入文件或者写入数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值