3.2.1 Spark Streaming简介
Spark Streaming是构建在Spark上的实时计算框架,扩展了Spark流式大数据处理能力。Spark Streaming将数据流以时间片为单位进行分割形成RDD,使用RDD操作处理每一块数据,每块数据(也就是RDD)都会生成一个Spark Job进行处理,最终以批处理的方式处理每个时间片的数据。请参照图3-6。
图3-6 Spark Streaming生成Job
Spark Streaming编程接口和Spark很相似。在Spark中,通过在RDD上用Transformation(例如:map,filter等)和Action(例如:count,collect等)算子进行运算。在Spark Streaming中通过在DStream(表示数据流的RDD序列)上进行算子运算。图3-7为Spark Streaming转化过程。
图3-7 Spark Streaming转化过程
图3-7中Spark Streaming将程序中对DStream的操作转换为DStream有向无环图(DAG)。对每个时间片,DStream DAG会产生一个RDD DAG。在RDD中通过Action算子触发一个Job,然后Spark Streaming会将Job提交给JobManager。JobManager会将Job插入维护的Job队列,然后JobManager会将队列中的Job逐个提交给Spark DAGScheduler,然后Spark会调度Job并将Task分发到各节点的Executor上执行。
(1)优势及特点
1)多范式数据分析管道:能和Spark生态系统其他组件融合,实现交互查询和机器学习等多范式组合处理。
2)扩展性:可以运行在100个节点以上的集群,延迟可以控制在秒级。
3)容错性:使用Spark的Lineage及内存维护两份数据进行备份达到容错。RDD通过Lineage记录下之前的操作,如果某节点在运行时出现故障,则可以通过冗余备份数据在其他节点重新计算得到。
对于Spark Streaming来说,其RDD的Lineage关系如图3-8所示,图中的每个长椭圆形表示一个RDD,椭圆中的每个圆形代表一个RDD中的一个分区(Partition),图中的每一列的多个RDD表示一个DStream(图中有3个DStream),t=1和t=2代表不同的分片下的不同RDD DAG。图中的每一个RDD都是通过Lineage相连接形成了DAG,由于Spark Streaming输入数据可以来自于磁盘,例如HDFS(通常由三份副本)也可以来自于网络(Spark Streaming会将网络输入数据的每一个数据流复制两份到其他的机器)都能通过冗余数据及Lineage的重算机制保证容错性。所以RDD中任意的Partition出错,都可以并行地在其他机器上将缺失的Partition重算出来。
图3-8 Spark Streaming容错性
4)吞吐量大:将数据转换为RDD,基于批处理的方式,提升数据处理吞吐量。图3-9是Berkeley利用WordCount和Grep两个用例所做的测试。
图3-9 Spark Streaming与Storm吞吐量比较图
5)实时性:Spark Streaming也是一个实时计算框架,Spark Streaming能够满足除对实时性要求非常高(例如:高频实时交易)之外的所有流式准实时计算场景。目前Spark Streaming最小的Batch Size的选取在0.5~2s(对比:Storm目前最小的延迟是100ms左右)。
(2)适用场景
Spark Streaming适合需要历史数据和实时数据结合进行分析的应用场景,对于实时性要求不是特别高的场景也能够胜任。