Spark Streaming用于流式数据的处理。Spark Streaming支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和简单的 TCP套接字等等。
数据输入后可以用 Spark 的高度抽象原语如:map、reduce、join、window等进行运算。而结果也能保存在很多地方,如HDFS,数据库等。
和Spark基于RDD的概念很相似,Spark Streaming使用离散化流(discretized stream)作为抽象表示,叫作DStream。
DStream是随时间推移而收到的数据的序列。在内部,每个时间区间收到的数据都作为RDD存在,而DStream是由这些RDD所组成的序列(因此得名“离散化”)。
批量计算:也叫离线计算,往往计算全量数据;数据有边界,无论大小,总之有大小
流计算:数据是不断产生的,要求快速的处理,所以处理的是增量数据
易用
Spark Streaming具有类似RDD的API,易于使用,并可和现有系统公用相似代码;可以在流上使用基于Spark的机器学习和流式计算,是一个一个站式的平台
容错
Spark Streaming是微批次处理模型,微批次处理的方式不会有长时间运行的Operator,所以更易于容错设计;能够避免运行过慢的服务,实行推测执行
易整合到Spark体系
可以从kafka,flume,TCP等流和队列中获取数据,可以将处理过的数据写入文件系统中,常见的数据库中
Spark Streaming中创建SparkStreamingContext,通过监控端口创建DStream:ssc.socketTextStream("hostname", "port")
socket -> SparkStreaming -> Console
socketTextStream用于创建一个DStream,监听socket输入,当做文本来处理,DStream可以理解为一个流式的RDD
启动ssc应用程序:ssc.start()
因为main方法执行完毕后整个程序就会退出,所以需要阻塞主线程:ssc.awaitTermination()
调用stop,首先会停掉StreamingContext,参数默认为true,也会停掉SparkContext对象:ssc.stop(true)
注意:local[*]中 *的值一定要大于1,因为要有一个去监听,所以至少设置为2
测试过程中,可以通过使用 ssc.queueStream(queueOfRDDs)
来创建DStream,每一个推送到这个队列中的RDD,都会作为一个DStream处理
创建DStream时自定义数据源
SparkStreaming + Kafka集成,创建DStream以kafka作为数据源
Dstream中是RDD流,只是RDD的分区对应了kafka的分区是不行的,因为需要一套单独的机制来保证并行的读取外部的数据源,这套机制叫做Receiver。
DStream上的原语与RDD的类似,分为Transformations(转换)和Output Operations(输出)两种
此外转换操作中还有一些比较特殊的原语,如:updateStateByKey()、transform()以及各种Window相关的原语
把简单的RDD转化操作应用到每个批次上,也就是转化DStream中的每一个RDD
无状态转化操作有:map(),flatMap(),filter(),repartition(),reduceByKey(),groupByKey()等
注意:针对键值对的DStream转化操作(如reduceByKey())要添加 import StreamingContext._ 才能在scala中使用
用于记录历史记录,它提供了对一个状态变量的访问,用于键值对形式的DStream
它的结果会是一个新的DStream,其内部的RDD序列是由每个时间区间对应的(键,状态)对组成的
使用updateStateByKey需对检查点进行配置,会使用检查点来保存状态
可以设置窗口的大小和滑动窗口的间隔来动态的获取当前Streaming的允许状态
基于窗口的操作会在一个比StreamingContext的批次间隔更长的时间范围内,通过整合多个批次的结果,计算出整个窗口的结果
注意:所有基于窗口的操作都需要两个参数,分别为窗口时长、滑动步长,两者都必须是StreamingContext(batch)的批次间隔的整数倍
Transform原语允许DStream上执行任意的RDD-to-RDD函数
即使这些函数并没有在DStream的API暴露出来,通过该函数可以方便的扩展Spark API
该函数每一批次调度一次,其实就是对DStream中的RDD应用转化
连接操作(leftOuterJoin。rightOuterJoin,fullOuterJoin也可以)
可以连接Stream-Stream,Windows-Stream to Windows-Stream,Stream-dataset
Lambda架构:整合了离线计算和实时计算
一般情况下Lambda架构分三层:
兼顾优点,在批处理层可以全量查询和分析,在速度层可以查询最新的数据
速度很快,在大数据系统中,想要快速的获取结果是非常困难的,因为高吞吐量和快速返回结果往往很难兼得;例如Impala和Hive
Hive能进行非常大规模的数据量的处理,Impala能够快速的查询返回结果,但是很少有一个系统能够兼得两点
Lambda使用多种融合的手段从而实现
Lambda是一个非常反人类的设计,因为需要在系统中不仅维护多套数据层,还需要维护批量处理和流式处理两套框架,这非常难,一套都很难搞定,两套带来的运维问题是指数级提升的
因为要长时间运行,对任何一个流式计算系统来说,容错都是非常致命也是非常重要的一环,在Spark Streaming中,大致提供了如下的容错手段:
热备(默认容错手段)
StorageLevel.MEMORY_AND_DISK_SER:BlockManager不仅会在本机存储,也会发往其他的主机进行存储,本质就是冗余备份;如果失败,通过冗余的备份,再次进行计算
冷备(WAL预写日志)
当Receiver获取到一份数据后,先不存,先写日志,之后写入BlockManager;如果失败,通过log日志,再次进行计算
重放
如kafka,它可根据offset来获取数据