Spark Streaming大规模流式处理
2015-11-21 22:19
197 查看
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好消息。
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好消息。
相关文章推荐
- probe要求四个角色
- 004--VS C++ 绘制封闭图形
- 获取嵌入ActiveX控件的页面IWebBrowser2指针
- 在Jquery实现Ajax和JS实现Ajax的方法
- 自定义Layer的两种方法
- 【iOS】NSString rangeOfString
- 高精度模板
- web项目快速代码生成器rapid-framework
- 10007---Java中从控制台输入数据的几种常用方法
- set接口及实现类
- BestCoder Round #63 (div.1) B.matrix
- C++时间类型详解
- CacheBrowser:利用CDN内容缓存上网
- CacheBrowser:利用CDN内容缓存上网
- 图算法:1、邻接表实现图的深度优先遍历,广度优先遍历
- iOS开发实战tips--断点可以这样玩(debug)
- 软件工程课程设计
- 理解 JavaScript 的作用域链
- 关于JAVA NIO的就绪选择
- GSM/GPRS/EGPRS相关调制方式/速率