========== 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、涉及到高延迟批处理、交互式查询等功能。

大数据技术之_19_Spark学习_04_Spark Streaming 应用解析小结的更多相关文章

  1. 大数据技术之_19_Spark学习_04_Spark Streaming 应用解析 + Spark Streaming 概述、运行、解析 + DStream 的输入、转换、输出 + 优化

    第1章 Spark Streaming 概述1.1 什么是 Spark Streaming1.2 为什么要学习 Spark Streaming1.3 Spark 与 Storm 的对比第2章 运行 S ...

  2. 大数据技术之_19_Spark学习_02_Spark Core 应用解析小结

    1.RDD 全称 弹性分布式数据集 Resilient Distributed Dataset它就是一个 class. abstract class RDD[T: ClassTag](    @tra ...

  3. 大数据技术之_19_Spark学习_03_Spark SQL 应用解析小结

    ========== Spark SQL ==========1.Spark SQL 是 Spark 的一个模块,可以和 RDD 进行混合编程.支持标准的数据源.可以集成和替代 Hive.可以提供 J ...

  4. 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器

    第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...

  5. 大数据技术之_19_Spark学习_05_Spark GraphX 应用解析 + Spark GraphX 概述、解析 + 计算模式 + Pregel API + 图算法参考代码 + PageRank 实例

    第1章 Spark GraphX 概述1.1 什么是 Spark GraphX1.2 弹性分布式属性图1.3 运行图计算程序第2章 Spark GraphX 解析2.1 存储模式2.1.1 图存储模式 ...

  6. 大数据技术之_19_Spark学习_01_Spark 基础解析 + Spark 概述 + Spark 集群安装 + 执行 Spark 程序

    第1章 Spark 概述1.1 什么是 Spark1.2 Spark 特点1.3 Spark 的用户和用途第2章 Spark 集群安装2.1 集群角色2.2 机器准备2.3 下载 Spark 安装包2 ...

  7. 大数据技术之_19_Spark学习_01_Spark 基础解析小结(无图片)

    1.准备安装包 2.Spark Standalone 即独立模式  2.1.解压安装包到你安装的目录.  2.2.拷贝 conf 目录下的 slaves 文件,将 slave 节点的 hostname ...

  8. 大数据技术之_16_Scala学习_01_Scala 语言概述

    第一章 Scala 语言概述1.1 why is Scala 语言?1.2 Scala 语言诞生小故事1.3 Scala 和 Java 以及 jvm 的关系分析图1.4 Scala 语言的特点1.5 ...

  9. 大数据技术之_09_Flume学习_Flume概述+Flume快速入门+Flume企业开发案例+Flume监控之Ganglia+Flume高级之自定义MySQLSource+Flume企业真实面试题(重点)

    第1章 Flume概述1.1 Flume定义1.2 Flume组成架构1.2.1 Agent1.2.2 Source1.2.3 Channel1.2.4 Sink1.2.5 Event1.3 Flum ...

随机推荐

  1. 2018.09.16 loj#10241. 取石子游戏 1(博弈论)

    传送门 好像是某年的初赛题啊. 有个很显然的结论. 当n" role="presentation" style="position: relative;&quo ...

  2. 一个简单的Linux后门程序的实现

    该程序实质是一个简单的socket编程,在受害方上运行攻击代码(后门进程),通过socket打开一个预设端口,并监听,等待攻击方的链接.一旦攻击方通过网络链接工具试图链接该socket,那么后门进程立 ...

  3. S4 exercise -- 模块

    写一个用户登录验证程序,文件如下1234.json {"expire_date": "2021-01-01", "id": 1234, &q ...

  4. Linux 系统运维常用命令

    1 文件管理2 软件管理3 系统管理4 服务管理5 网络管理6 磁盘管理7 用户管理8 脚本相关9 服务配置==================================------------ ...

  5. php学习之路-笔记分享20150327

    由于公司需要,不得已是php也学习并用了段时间做了两个项目,现也分享出笔记.需要源文档的留下邮箱,.

  6. Android-系统解析AndroidManifest

    在上一篇博客,Android-XML格式描述,介绍来XML在Android中的格式: Android-系统解析AndroidManifest,是分析Android系统是如何去解析AndroidMani ...

  7. RequestHelper

    Request["param"] 全部 Request.QueryString["param"] get Request.Form["param&qu ...

  8. Leader Election 选举算法

    今天讲一讲分布式系统中必不可少的选举算法. leader 就是一堆服务器中的协调者,某一个时刻只能有一个leader且所有服务器都承认这个leader. leader election就是在一组进程中 ...

  9. linux系统编程之管道(三):命令管道(FIFO)

    一,匿名管道PIPE局限性 管道的主要局限性正体现在它的特点上: 只支持单向数据流: 只能用于具有亲缘关系的进程之间: 没有名字: 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配 ...

  10. CSharp如何自定义鼠标样式

    一.如何设置鼠标样式? 在CSharp的WinForm开发中,可以通过下面的API设置鼠标样式: //把鼠标样式设置为十字(系统自带的一种鼠标样式) this.Cursor = Cursors.Cro ...