spark-7

SparkStreaming使用离散化流作为抽象表示,叫做DStream。Dstream是随时间推移而得到的数据序列。在内部,每个时间区间收到的数据都作为RDD的存在
而DStream是由这些RDD所组成的序列。DStream可以从各种输入源创建,比如Flume、KafaKa或者HDFS。创建出来的DStream支持两种操作(转换和输出)

SparkStreaming应用需要进行额外配置保证24/7不间断工作。这里用到了检查点机制,也就是把数据存储到可靠文件系统。

架构与抽象
SparkStreaming 使用“微批次”的架构,把流式计算当做一系列连续的小规模批处理来对待。
SparkStreaming 从各种输入源中读取数据,并把数据分组为小的批次,新的批次按均匀的时间间隔创建出来,在每个时间区间开始的时候,一个新的批次就
创建出来了每个时间区间开始的时候,一个新的批次就创建出来,在该区间内收到的数据都会添加到这个批次中,在时间区间结束时,批次停止增长,时间区间
的大小是由批次间隔这个参数决定的。每个批次都形成一个RDD,以SPark作业的方式处理并生成其他RDD,处理的结果可以批处理的方式传给外部系统。

Spark Streaming 为每个输入源启动对应的接收器,接收器以任务的形式运行在应用的执行器进程中,从输入源收集数据并保存为RDD,他们收集到输入数据会把数据
复制到另一个执行器进程来保障容错性。数据保存在执行器进程的内存中,和缓存RDD的方式一样,驱动器程序中的StreamingContext 会周期性地运行Spark
作业来处理这些数据,把数据与之前时间区间中的RDD进行整合。

SparkStreaming 对DStream 提供的容错性与Spark为RDD所提供的容错性一致:只要输入数据还在,他就可以使用RDD谱系计算出任意状态,默认情况下收到的
数据分别存在于两个节点上,这样Spark可以容忍一个节点故障,不过如果只用谱系图来恢复的话,重算有可能会花很长时间,因为处理从程序启动以来的所有
数据。因此Spark Streaming 也提供了检查点机制,可以把状态阶段性存储到可靠性文件系统中。一般来说你需要处理5-10个批次的数据就保存一次,在恢复数据时
SparkStreaming 只需要回溯到上一个检查点即可。

转化操作:有状态和无状态

无状态转换操作:把简单的RDD转换操作应用到每个批次上,也就是转化DStream中的每一个RDD,部分无状态转化操作如下表所示,
map() 对DStream中的每个元素引用给定函数,返回由各元素输出的元素组成的DStream
flatMap() 对DStream中每个元素应用给定函数,返回由各元素输出迭代器组成的Dstream
filter(): 对元素进行过滤
repartition() 改变DStream的分区数
reduceByKey() 将每个批次中键相同的记录进行规约处理
groupByKey() 将每个批次记录根据键进行分组

这些操作只能规约每个时间中的数据,也可以规约相同时间区间的数据。我们可以通过cogroup join leftouterJoin union来规约不同时间的数据

transform() :可以直接操作其内部的RDD,对内部RDD进行处理。

有状态转化操作:
DStream 的有状态转化操作是跨时间区间跟踪数据的操作,也就是说,一些先前批次的数据也被用来新的批次中计算结果。
主要的两种类型是滑动串口和updateStateByKey().前者是以一个时间阶段为滑动窗口进行操作,后者则用来跟踪每个键的状态变化。

有状态转化操作需要在你的StreamingContext中打开检查点机制来确保容错性。ssc.checkpoint(” save path”)
基于窗口的转化操作:
基于窗口的操作会在一个比StreamingContext的批次间隔更长的时间范围内,通过整合多个批次结果,计算出整个窗口的结果,
所有基于窗口的操作都需要两个参数,分别为窗口时长和滑动步长,两者都必须是StreamContext的批次间隔的整数倍。起始就是最近的windowDuration
/batchInterval个批次,如果有一个以10s为批次间隔的源DStream,要创建一个30s的时间窗口(处理近3个批次)就应当吧windowDuration设置为30s
而滑动步长的默认值与批次间隔相等,用来控制对新的Dstream进行计算间隔。如果源DStream批次间隔为10s,并且我们只希望每两个批次计算一次窗口结果
则将滑动步长设置为20s。

即每次处理(窗口时长/批时长)的单位,每隔滑动步长的时间处理一次。

对DStream可以用简单的窗口操作是window() ,它返回一个新的DStream表示所请求的窗口操作数据。count() transform()

reduceByWindow() reduceByKeyAndWindow() countByWindow() countByValueAndWindow() 作为对数据进行计数操作的简写

foreachRDD() :用来对DStream中的RDD运行任意计算。

输出操作:指定对流数据经转化操作得到的数据所要执行的操作。
开发时,输出操作一般为print。生产时,就可以保存结果。
saveAsTextFile(“outputDir”,“txt”)

输入源
1.文件流: jssc.textFileStream(“path”);
2.附加数据源: Apache KafKaf:因其速度与弹性成为了一个流行的输入源。
Apache Flume 、推式接收器、拉式接收器、自定义数据源
3.多数据源与集群规模

24/7不间断运行
SparkStreaming 的一大优势在于它提供了强大的容错性保障,只要输入数据存储在可靠的系统中,SparkStreaming就可以根据输入计算出正确结果
提供“精确一次”执行的语义。
要不间断的运行spark Streaming应用,需要一些特别的配置,第一步是设置好诸如HDFS可靠存储系统中的检查点机制。不仅如此,我们还需要考虑
驱动器程序的容错性,以及对不可靠输入源的处理。

检查点机制:哟景来保障容错性的主要机制,他可以使SparkStreaming阶段性地把应用数据存储到诸如hdfs这样的可靠性存储系统中,以供恢复时使用
控制发生失败时需要重算的状态数,我们在10.2节讨论过,SparkStreaming可以通过转化图的谱系图来重算状态
提供驱动器程序容错,如果流计算应用中的驱动程序崩溃了,你可以重启驱动器程序并让驱动器程序从检查点恢复。这样SparkStreaming就可以读取之前运行
的程序处理数据的进度。并从哪里继续。

配置检查点:ssc.checkpoint(path):第一次生成,第二次检查。在创建jssc后加入代码
驱动程序容错:配置检查点
工作节点容错:类似于spark,提供工作节点备份。
接收器容错:所有从可靠文件系统中读取的数据,都是可靠地,因为底层文件系统是有备份的,sparkstreaming会记住那些数据存放到了检查点,并在应用
崩溃后从检查点继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值