Spark Streaming大规模流式处理

来源:互联网 发布:mac输入法记忆 编辑:程序博客网 时间:2024/05/17 02:37

1.1概述:
Spark Streaming架构概述和原理
Spark Streaming案例集锦
源码分析与性能优化

1.2 Spark Streaming架构概述和原理
What is Spark Streaming?
是规模的,可伸缩的,实时流处理。
这里写图片描述
Spark Streaming的数据来源除了上述kafka,flume,HDFS/S3,Kinsesis,Twitter之外,还可以来源TCP sockets网站发来的数据,并且可以使用高级函数例如,map,join,reduce和window,来构建复杂的算法。最后被处理过的数据也可以被保存在hdfs,Databases, Dashboards里面。并且可以用流处理来处理图计算和机器学习。
这里写图片描述
在Spark Streaming内部实现是接收到输入数据之后,以时间为分片对数据进行批次处理。,切分好数据分片之后,Spark Engine对数据进行计算,最后,产生一批又一批的处理后的数据。对于每一批的处理batch是并行处理的。例如,一秒产生一批,如果前一秒的还没处理完,下一秒的将不会被计算,这时候就会产生阻塞。因此这里面的时间设置也是一个优化点。
这里写图片描述
数据是串行输入的,每个batch处理是并行的。

Discretized Streams (DStreams)
这里写图片描述
Discretized Streams 离散流,DStream就是一系列RDD的集合,随着时间的流逝RDD会不断地产生,这些RDD会被DSream管理和计算。流进来的数据会被DStream划分为不同的时间段,每个时间段都会产生很多RDD,每个时间段是有自己ID的,第一个时间区间是[0.1),左闭右开区间的,然后依次类推。
这里写图片描述
每一个时间段进行单词统计,进行flatMap操作,单词统计,然后随着时间流逝依次类推。

这里写图片描述
batch处理流程:
这是Spark Streaming中的 lineage(血统)关系,处理的单位是每个 RDD, 首先对batch进行split操作,把batch转化成切片产生partition,这里面的并行计算指的是batch切分成分片partition并行计算,里面的切片是平行计算。并行计算中都是batch级别的,将最终的结果以batch保存。随着时间的流逝,每个时间段都是batch同样操作。
容错性:
图中的每个椭圆是一个RDD,椭圆里面的每个小圆是一个partition,图中的每一列多个RDD,
表示一个DStream(图中有三个RDD),而每一行的最后一个RDD表示batch size所产生的中间结果。
每个RDD是lineage(血统)关系的,并且Spark Streaming数据来源有多种,可以来自磁盘,如HDFS(多份拷贝)或
是来自网络的数据流(Spark Streaming 网络输入的数据拷贝两份到其他机器上),因此可以保证Spark Streaming
很高的容错性。即使某个RDD上的partition出错,可以并行地将其他机器上将出错的partition计算出来。y

Spark Streaming 有3种主要的运行场景:
1. 无状态操作: 每次操作都只是计算当前时间切片的内容,例如:每次只计算1秒钟时间切片中产生的数据的RDD。
2. 有状态操作: 要不断的把当前和历史的时间切片的RDD累加计算,随着时间的流逝,计算的数据规模会越来越大。(例
如: updateStateByKey)
3. window操作: 是针对特定时间段并以特定时间间隔为单位进行的滑动操作,例如:在以1秒为时间切片的情况下,我们要统计最近10分钟内Spark Streaming产生的数据,并且每个2分钟进行一次更新。

1.3 Spark Streaming案例集锦
使用Twitter方式收集数据
这里写图片描述
tweets是DStream,对它进行flatMap操作之后生成新的DStream.
这里写图片描述
将产生的数据保存到hdfs,上图是把结果保存到磁盘上。

Window Operations
这里写图片描述
上图中每一个红色的方框表示一个窗口,窗口的长度为:3,滑动间隔:窗口操作的
时间间隔为:2,也就是说,每个2,对过去时间为3进行统计。注意:比如窗口长度为3
的话,则是左闭右开的,也就是说 window at time 3 是对time1 和time2 进行统计的,不
包含time3。
这里写图片描述
假设对过去10分钟进行统计计算,Minutes(10),指的是过去10分钟,Seconds(1)每个1s,这个意思就是,每隔1s对过去10分钟的数据进行统计。上面的操作很容易就重读计算,所以继续往下看,对上面操作进行优化。
这里写图片描述
假设我们现在要求出 t 到 t + 4 中所有状态的值。
滑动窗口的叠加处理上面已经介绍过了,我们现在来看增量处理。现在可以把 t-1 到 t+3
总和保存下来,然后再与t+4时刻相加,最后减去t-1时刻的就可以了,这个过程中我们只需要保存三个中间结果。
而(a)图的话,要保存5个中间结果,效率一下就提升了40%。如果数据量很大的话,这样的效果是非常明显的。

具体代码实现:
这里写图片描述
综上最后优化后的代码为:
这里写图片描述

1.3 性能优化
Batch Size 设置的大小.
假设:现在有一个batch是10s,但是你处理的时候时间超过了10s,但是每个batch之间必须要保证前一个batch结束下面的batch才可以执行,因此,就会造成阻塞。
如果真的阻塞的话怎么办?
这里写图片描述
优化内存使用
数据放入内存,要存两块副本,而我们只操作一个副本,默认数据存入到内存是需要序列化的。我们对数据进行操作的
时候就需要反序列化,这中间就比较耗CPU。
1. 如果内存足够的话,我们可以将序列化给关闭,直接写入内存。
2. 如果内存不足的情况下,可以使用Kyro序列化器。
3. 设置spark.cleaner.ttl参数:Spark Streaming会将接收到的数据全部保存在内存中,因此很多不用的数据任然会被
保存在内存中。因此可以通过设置该参数的时长,来及时清理无用的数据。

总结:
Spark Streaming提供了一套高效、可容错的准实时大规模流式处理框架,Spark Streaming能够集成spark批处理和交互查询,通过简单的接口就可以实现复杂算法等等优点,Spark Streaming在未来将会有更大的发展。 期待更多spark好消息。

0 0