SparkStreaming入门+WordCount案例

SparkStreaming入门+WordCount案例

  • 1. Spark Streaming概述
    • 1.1 离线和实时的概念
    • 1.2 批量和流式的概念
    • 1.3 Spark Streaming是什么
    • 1.4 Spark Streaming特点
    • 1.5 Spark Streaming架构
  • 2. DStream入门
    • 2.1 WordCount案例实操
    • 2.2 WordCount解析
    • 2.3 注意事项

1. Spark Streaming概述

1.1 离线和实时的概念

数据处理的延迟

  • 1)离线计算
    就是在计算开始前已知所有输入数据,输入数据不会产生变化,一般计算量级较大,计算时间也较长。例如,今天早上一点,把昨天累积的日志,计算出所需结果。最经典的就是Hadoop的MapReduce方式;
  • 2)实时计算
    输入数据是可以以序列化的方式一个个输入并进行处理的,也就是说在开始的时候并不需要知道所有的输入数据。与离线计算相比,运行时间短,计算量级相对较小。强调计算过程的时间要短,即所查当下给出结果。

1.2 批量和流式的概念

数据处理的方式

  • 1)批式处理

    处理离线数据,冷数据。单个处理数据量大,处理速度比流慢。

  • 2)流式处理

    在线,实时产生的数据。单次处理的数据量小,但处理速度更快。

近年来,在Web应用、网络监控、传感监测等领域,兴起了一种新的数据密集型应用——流数据,即数据以大量、快速、时变的流形式持续到达。实例:PM2.5检测、电子商务网站用户点击流。

  • 流数据具有如下特征:

    1)数据快速持续到达,潜在大小也许是无穷无尽的;
    2)数据来源众多,格式复杂;
    3)数据量大,但是不十分关注存储,一旦经过处理,要么被丢弃,要么被归档存储;
    4)注重数据的整体价值,不过分关注个别数据。

1.3 Spark Streaming是什么

  • Spark Streaming用于流式数据的处理。Spark Streaming支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和简单的TCP套接字等等。数据输入后可以用Spark的高度抽象算子如:map、reduce、join、window等进行运算。而结果也能保存在很多地方,如HDFS,数据库等。
    SparkStreaming入门+WordCount案例_第1张图片
  • 在 Spark Streaming 中,处理数据的单位是一批而不是单条,而数据采集却是逐条进行的,因此 Spark Streaming系统需要设置间隔使得数据汇总到一定的量后再一并操作,这个间隔就是批处理间隔。批处理间隔是Spark Streaming的核心概念和关键参数,它决定了Spark Streaming提交作业的频率和数据处理的延迟,同时也影响着数据处理的吞吐量和性能。
    SparkStreaming入门+WordCount案例_第2张图片
  • 和Spark基于RDD的概念很相似,Spark Streaming使用了一个高级抽象离散化流(discretized stream),叫作DStreams。DStreams是随时间推移而收到的数据的序列。在内部,每个时间区间收到的数据都作为RDD存在,而DStreams是由这些RDD所组成的序列(因此得名“离散化”)。DStreams可以由来自数据源的输入数据流来创建,也可以通过在其他的 DStreams上应用一些高阶操作来得到。
    SparkStreaming入门+WordCount案例_第3张图片

1.4 Spark Streaming特点

  • 优点
    易用、容错、易整合到Spark体系中等。
  • 缺点
    Spark Streaming是一种“微量批处理”架构, 和其他基于“一次处理一条记录”架构的系统相比, 它的延迟会相对高一些。

1.5 Spark Streaming架构

  • Spark1.5以前版本,用户如果要限制Receiver的数据接收速率,可通过设置静态配置参数:“spark.streaming.receiver.maxRate”的值来实现,此举虽然可以通过限制接收速率,来适配当前的处理能力,防止内存溢出,但也会引入其它问题。比如:producer数据生产高于maxRate,当前集群处理能力也高于maxRate,这就会造成资源利用率下降等问题。
  • 为了更好的协调数据接收速率与资源处理能力,1.5版本开始Spark Streaming可以动态控制数据接收速率来适配集群数据处理能力。背压机制(即Spark Streaming Backpressure):根据JobScheduler反馈作业的执行信息来动态调整Receiver数据接收率。
  • 通过属性“spark.streaming.backpressure.enabled”来控制是否启用backpressure机制,默认值false,即不启用。
  • SparkStreaming架构图如下:
    SparkStreaming入门+WordCount案例_第4张图片
  • 整体架构图如下:
    SparkStreaming入门+WordCount案例_第5张图片

2. DStream入门

2.1 WordCount案例实操

  1. 需求:使用netcat工具向9999端口不断的发送数据,通过SparkStreaming读取端口数据并统计不同单词出现的次数。
  2. 添加依赖
<dependency>
	<groupId>org.apache.sparkgroupId>
    <artifactId>spark-streaming_2.11artifactId>
    <version>2.1.1version>
dependency>
  1. 代码实现
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
 * @author zjfstart
 * @create 2020-05-21-10:14
 */
object Test01_SparkStreaming_WordCount {

    def main(args: Array[String]): Unit = {
        // 创建配置文件对象     注意:Streaming程序至少不能设置为local,至少需要 2个线程
        val conf: SparkConf = new SparkConf().setAppName("Test01_SparkStreaming_WordCount").setMaster("local[*]")

        // 创建Spark Streaming上下文环境对象
        val scc = new StreamingContext(conf, Seconds(3))

        // 从端口中获取数据源
        val socketDS: ReceiverInputDStream[String] = scc.socketTextStream("hadoop102", 9999)

        // 对获取到的数据进行扁平化处理
        val flatMapDS: DStream[String] = socketDS.flatMap(_.split(" "))

        // 对数据进行结构上的转换
        val mapDS: DStream[(String, Int)] = flatMapDS.map((_, 1))

        // 对上述的数据进行聚合处理
        val reduceDS: DStream[(String, Int)] = mapDS.reduceByKey(_ + _)

        // 输出结果      注意:调用的是 DS的 print 函数
        reduceDS.print()

        // 启动采集器
        scc.start()

        // 默认情况下,上下文对象不能关闭
        // scc.stop()

        // 等待采集器结束,终止上下文环境对象
        scc.awaitTermination()
    }
}
  1. 启动程序并在NetCat端发送数据
[atguigu@hadoop102 ~]$ nc -lk 9999

注:如果没有安装过NetCat,执行如下命令安装即可:

[atguigu@hadoop102 ~]$ yum install -y nc

2.2 WordCount解析

  • Discretized Stream是Spark Streaming的基础抽象,代表持续性的数据流和经过各种Spark算子操作后的结果数据流。在内部实现上,DStream是一系列连续的RDD来表示,每个RDD含有一段时间间隔内的数据,对这些RDD的转换是由Spark引擎来计算的, DStream的操作隐藏的大多数的细节, 然后给开发者提供了方便使用的高级 API如下图:
    SparkStreaming入门+WordCount案例_第6张图片

2.3 注意事项

  • 一旦StreamingContext已经启动, 则不能再添加新的 streaming computations。

  • 一旦一个StreamingContext已经停止(StreamingContext.stop()), 他也不能再重启。

  • 在一个 JVM 内, 同一时间只能启动一个StreamingContext stop() 的方式停止StreamingContext,也会把SparkContext停掉. 如果仅想停止StreamingContext, 则应该这样: stop(false)。

  • 一个SparkContext可以重用去创建多个StreamingContext,前提是以前的StreamingContext已经停掉,并且SparkContext没有被停掉。

你可能感兴趣的:(Spark,streaming,spark)