当前位置: > > > Spark - Spark Streaming使用详解1(基本概念介绍、简单样例)

Spark - Spark Streaming使用详解1(基本概念介绍、简单样例)

一、基本概念介绍

1,Spark Streaming

(1)Spark Streaming Apache Spark 提供的用于实时数据处理的组件。它通过将连续的实时数据流划分为一系列小批次来处理数据。这种离散的批处理操作使得 Spark Streaming 具有与传统的批处理作业相似的编程模型,但它的数据输入源和输出源是实时的。
实时流处理与批处理的区别:
  • 在传统的批处理中,数据是一次性加载到系统中,然后在一个固定的时间间隔内进行处理。而在实时流处理中,数据是以连续的方式不断产生并发送到系统中。传统的批处理通常需要等待所有数据都准备好后才能进行处理,而实时流处理是边接收数据边处理的。
  • Spark Streaming 通过将实时数据流转化为离散的小批次数据,从而能够利用 Spark 强大的批处理引擎来处理数据。这样既能够兼顾实时性,又能够享受 Spark 引擎带来的高性能和优化。

(2)Spark Streaming 具有如下优势:
  • 能运行在 100+ 的结点上,并达到秒级延迟。
  • 使用基于内存的 Spark 作为执行引擎,具有高效和容错的特性。
  • 能集成 Spark 的批处理和交互查询。
  • 为实现复杂的算法提供和批处理类似的简单接口。

2,输入与输出

  • Spark Streaming 支持的数据输入源很多,例如:KafkaFlumeTwitterZeroMQ 和简单的 TCP 套接字等等。
  • 数据输入后可以用 Spark 的高度抽象原语,如:mapreducejoinwindow 等进行运算。
  • 而结果也能保存在很多地方,如 HDFS,数据库等。

3,DStream

    Spark Streaming 的核心概念是 DStreamDiscretized Stream),即离散化的数据流。DStream 是一系列连续的 RDD(弹性分布式数据集)组成的序列,每个 RDD 包含一段时间间隔内的数据。Spark Streaming 在内部将数据流分割成一系列小的微批次,然后将每个微批次作为一个 RDD 处理。这样,我们可以通过对 DStream 进行转换操作,来实现实时数据处理和计算。

4,Spark Streaming 架构



附:一个简单的 Spark Streaming 应用程序

1,功能说明

我们使用 netcat 工具向 9999 端口不断的发送数据,而程序通过 SparkStreaming 读取端口数据并统计不同单词出现的次数。

2,代码编写

(1)首先我们编辑项目的 pom.xml 文件,添加 Spark Streaming 依赖:
<dependency>
 <groupId>org.apache.spark</groupId>
 <artifactId>spark-streaming_2.13</artifactId>
 <version>3.4.0</version>
</dependency>

(2)具体代码如下:
object Hello {
  def main(args: Array[String]): Unit = {
    // 创建 Spark 运行配置对象
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Hello")

    // 初始化 StreamingContext,设置微批处理的时间间隔为 3 秒
    val ssc = new StreamingContext(sparkConf, Seconds(3))

    // 通过监控端口创建 DStream,读进来的数据为一行行
    val lineStreams = ssc.socketTextStream("localhost", 9999)

    // 对 DStream 进行转换操作,将每一行数据做切分,形成一个个单词
    val wordStreams = lineStreams.flatMap(_.split(" "))

    // 将单词映射成元组(word,1)
    val wordAndOneStreams = wordStreams.map((_, 1))

    // 将相同的单词次数做统计
    val wordAndCountStreams = wordAndOneStreams.reduceByKey(_+_)

    // 打印结果
    wordAndCountStreams.print()

    // 启动 StreamingContext
    ssc.start()

    // 等待应用程序终止(遇错停止,否则不断工作)
    ssc.awaitTermination()
  }
}

3,运行测试

(1)我们通过在终端运行如下命令来启动一个监听本地 9999 端口的 TCP socket
nc -lk 9999

(2)程序启动后,我们在该终端中输入一些文本数据:

(3)Spark Streaming 应用程序这边将会实时处理输入的文本数据并输出结果:
评论0