========== Spark Streaming 是什么 ==========
1、SPark Streaming 是 Spark 中一个组件,基于 Spark Core 进行构建,用于对流式进行处理,类似于 Storm。
2、Spark Streaming 能够和 Spark Core、Spark SQL 来进行混合编程。
3、Spark Streaming 我们主要关注:
(1)Spark Streaming 能接受什么数据? kafka、flume、HDFS、Twitter 等。
(2)Spark Streaming 能怎么处理数据? 无状态的转换(前面处理的数据和后面处理的数据没啥关系)、有转换转换(前面处理的数据和后面处理的数据是有关系的,比如 叠加关系)。
========== Spark Streaming 是怎么实现的 ==========
1、Spark Streaming 采用【微批次】架构。
2、对于整个流式计算来说,数据流可以想象成水流,微批次架构的意思就是将水流按照用户设定的时间间隔分割为多个水流段。一个段的水会在 Spark 中转换成为一个 RDD,所以对水流的操作也就是对这些分割后的 RDD 进行单独的操作。每一个 RDD 的操作都可以认为是一个小的批处理(也就是离线处理)。
========== Spark Streaming DStream 是什么 ==========
1、DStream 是类似于 RDD 和 DataFrame 的针对流式计算的抽象类。在源码中 DStream 是通过 HashMap 来保存所管理的数据流的。K 是 RDD 中数据流的时间,V 是包含数据流的 RDD。
2、对于 DStream 的操作也就是对于 DStream 所包含的所有以时间序列排序的 RDD 的操作。
========== Spark Streaming 怎么用 ==========
1、通过 StreamingContext 来进入 Spark Streaming。可以通过已经创建好的 SparkContext 来创建 StreamingContext。
val ssc = new StreamingContext(sc, Seconds(1))
========== Spark Streaming 的输入 ==========
1、 文件数据源
(1)Spark Streaming 通过 streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory)
, 这个方法提供了对目录下文件数据源的支持。
(2)如果文件是比较简单的文本文件,可以使用 streamingContext.textFileStream(dataDirectory)
来代替。
(3)文件数据源目前不支持嵌套目录:
1)文件需要有相同的数据格式。
2)文件进入 dataDirectory 的方式需要通过移动或者重命名来实现。
3)一旦文件移动进目录,则不能再修改,即便修改了也不会再读取新的数据。
2、自定义的 Receiver
(1)需要新建一个 Class 去继承 Receiver,并给 Receiver 传入一个类型参数,该类型参数是需要接收的数据的类型。
(2)需要去复写 Receiver 的方法: onStart 方法(在 Receiver 启动的时候调用的方法)、onStop 方法(在 Receiver 正常停止的情况下调用的方法)。
(3)在程序中通过 streamingContext.receiverStream(new CustomeReceiver) 来调用自定义的 Receiver。
3、RDD 数据源
(1)可以通过 StreamingContext.queueStream(rddQueue)
这个方法来监控一个 RDD 的队列,所有加入到这个 RDD 队列中的新的 RDD,都会被 Streaming 去处理。
4、Spark Streaming 与 Kafka 的集成
(1)启动 zookeeper 集群和 kafka 集群。
[atguigu@hadoop102 zookeeper-3.4.10]$ pwd
/opt/module/zookeeper-3.4.10
[atguigu@hadoop102 zookeeper-3.4.10]$ /bin/zkServer.sh start
[atguigu@hadoop103 zookeeper-3.4.10]$ /bin/zkServer.sh start
[atguigu@hadoop104 zookeeper-3.4.10]$ /bin/zkServer.sh start
[atguigu@hadoop102 kafka]$ pwd
/opt/module/kafka
[atguigu@hadoop102 kafka]$ bin/kafka-server-start.sh -daemon ./config/server.properties
[atguigu@hadoop103 kafka]$ bin/kafka-server-start.sh -daemon ./config/server.properties
[atguigu@hadoop104 kafka]$ bin/kafka-server-start.sh -daemon ./config/server.properties
(2)创建两个 topic,一个为 source,一个为 target
bin/kafka-topics.sh --create \
--zookeeper 192.168.25.102:2181,192.168.25.103:2181,192.168.25.104:2181 \
--replication-factor 2 \
--partitions 2 \
--topic source
bin/kafka-topics.sh --create \
--zookeeper 192.168.25.102:2181,192.168.25.103:2181,192.168.25.104:2181 \
--replication-factor 2 \
--partitions 2 \
--topic targe
(3)启动 kafka console producer 写入 source topic
bin/kafka-console-producer.sh \
--broker-list 192.168.25.102:9092,192.168.25.103:9092,192.168.25.104:9092 \
--topic source
(4)启动 kafka console consumer 监听 target topic
bin/kafka-console-consumer.sh \
--bootstrap-server 192.168.25.102:9092,192.168.25.103:9092,192.168.25.104:9092 \
--topic target
(5)启动 kafka Streaming 程序
[atguigu@hadoop102 ~]$ /opt/module/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
--class com.atguigu.streaming.KafkaStreaming \
/opt/software/sparkjars/kafkastreaming-jar-with-dependencies.jar
========== Spark Streaming 的转换 ==========
1、这些方法定义在哪儿?
(1)在 DStream 的类定义中,主要提供对于值类型的 DStream 的操作。
(2)在 PairDStreamFunctions 的类定义中,主要提供对于 K-V 对形式的 DStream 的操作。
2、无状态装换
3、有状态装换
(1)updateStateByKey 函数
def updateStateByKey[S: ClassTag](
updateFunc: (Seq[V], Option[S]) => Option[S]
): DStream[(K, S)] = ssc.withScope {
updateStateByKey(updateFunc, defaultPartitioner())
}
S 表示的是需要保存的状态的类型。
updateFunc 是定义了每一批次 RDD 如何来更新的状态值的方法。
Seq[V] 是当前批次相同 key 的值的集合。Option[S] 是框架自动提供的,存储的是上一次保存的状态的值。
updateStateByKey 会返回一个新的 DStream,该 DStream 中保存了 (Key,State) 的序列。
(2)window 函数
4、检查点机制
(1)StreamingContext 是能够从检查点中恢复数据的,可以通过 StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext) 来创建。
(2)Streaming 中的累加器和广播变量是不能够从检查点中恢复。
========== Spark Streaming 的输出 ==========
========== Spark Streaming 与 Storm 的比较 ==========
Spark Streaming:
SPark Streaming 用于对流式进行处理,类似于 Storm。
Spark Streaming 绝对谈不上比 Storm 优秀。这两个框架在实时计算领域中,都很优秀,只是擅长的细分场景并不相同。
Spark Streaming 吞吐量高、良好的 spark 的扩展性、和 Spark Core、Spark SQL 无缝整合,实时处理出来的中间数据
Storm 支持事务机制、健壮性 / 容错性、动态调整并行度等特性。
Storm --> 纯实时
Spark Streaming --> 准实时(RDD 转换)
应用场景:
对于 Storm 来说:
1、纯实时 --> 实时金融系统,金融交易和分析。
2、事务机制和可靠性机制。
3、如果还需要针对高峰低峰时间段,动态调整实时计算程序的并行度,以最大限度利用集群资源(通常是在小型公司,集群资源紧张的情况),也可以考虑用 Storm。
4、不需要在中间执行 SQL 交互式查询、复杂的 Transformation 算子等,那么用 Storm 是比较好的选择。
对于 Spark Streaming 来说:
1、还包括了离线批处理、交互式查询等业务功能。
2、涉及到高延迟批处理、交互式查询等功能。