Spark(五)--Structured Streaming(二) - 入门案例

2. Structured Streaming 入门案例

目标

了解 Structured Streaming 的编程模型, 为理解 Structured Streaming 时候是什么, 以及核心体系原理打下基础

步骤

  1. 需求梳理

  2. Structured Streaming 代码实现

  3. 运行

  4. 验证结果

2.1 需求梳理

目标

理解接下来要做的案例, 有的放矢

步骤

  1. 需求

  2. 整体结构

  3. 开发方式

2.1.1 需求

  • 编写一个流式计算的应用, 不断的接收外部系统的消息

  • 对消息中的单词进行词频统计

  • 统计全局的结果

2.1.2 整体结构

  1. Socket Server 等待 Structured Streaming 程序连接

  2. Structured Streaming 程序启动, 连接 Socket Server, 等待 Socket Server 发送数据

  3. Socket Server 发送数据, Structured Streaming 程序接收数据

  4. Structured Streaming 程序接收到数据后处理数据

  5. 数据处理后, 生成对应的结果集, 在控制台打印

2.1.3 开发方式和步骤

Socket server 使用 Netcat nc 来实现

Structured Streaming 程序使用 IDEA 实现, 在 IDEA 中本地运行

  1. 编写代码

  2. 启动 nc 发送 Socket 消息

  3. 运行代码接收 Socket 消息统计词频

2.1.4 总结

简单来说, 就是要进行流式的词频统计, 使用 Structured Streaming

 

2.2  代码实现

目标

实现 Structured Streaming 部分的代码编写

步骤

  1. 创建文件

  2. 创建 SparkSession

  3. 读取 Socket 数据生成 DataFrame

  4. 将 DataFrame 转为 Dataset, 使用有类型的 API 处理词频统计

  5. 生成结果集, 并写入控制台

import org.apache.spark.sql.streaming.OutputMode
import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}

object SocketWordCount {
  def main(args: Array[String]): Unit = {
    //1.创建SparkSession
    val spark = SparkSession.builder()
      .master("local[6]")
      .appName("socket_structured")
      .getOrCreate()

    spark.sparkContext.setLogLevel("WARN")
    import spark.implicits._

    //2.数据集的生成,数据读取
    val source: DataFrame= spark.readStream
      .format("socket")
      .option("host","192.168.52.100")
      .option("port",9999)
      .load()
    val sourceDS: Dataset[String] = source.as[String]

    //3.数据的处理
    val words = sourceDS.flatMap(_.split(" "))
      .map((_,1))
      .groupByKey(_._1)
      .count()

    //4.结果集的生成输出
    words.writeStream
      .outputMode(OutputMode.Complete())
      .format("console")
      .start()
      .awaitTermination()

  }
}
  • 调整 Log 级别, 避免过多的 Log 影响视线
  • 默认 readStream 会返回 DataFrame, 但是词频统计更适合使用 Dataset 的有类型 API
  • 统计全局结果, 而不是一个批次
  • 将结果输出到控制台
  • 开始运行流式应用
  • 阻塞主线程, 在子线程中不断获取数据

总结

  • Structured Streaming 中的编程步骤依然是先读, 后处理, 最后落地

  • Structured Streaming 中的编程模型依然是 DataFrame 和 Dataset

  • Structured Streaming 中依然是有外部数据源读写框架的, 叫做 readStream 和 writeStream

  • Structured Streaming 和 SparkSQL 几乎没有区别, 唯一的区别是, readStream 读出来的是流, writeStream 是将流输出, 而 SparkSQL 中的批处理使用 read 和 write

2.3 运行和结果验证

目标

代码已经编写完毕, 需要运行, 并查看结果集, 因为从结果集的样式中可以看到 Structured Streaming 的一些原理

步骤

  1. 开启 Socket server

  2. 运行程序

  3. 查看数据集

开启 Socket server 和运行程序

  1. 在虚拟机 node01 中运行 nc -lk 9999

  2. 在 IDEA 中运行程序

  3. 在 node01 中输入以下内容

    hello world
    hello spark
    hello hadoop
    hello spark
    hello spark

查看结果集

从结果集中可以观察到以下内容

  • Structured Streaming 依然是小批量的流处理

  • Structured Streaming 的输出是类似 DataFrame 的, 也具有 Schema, 所以也是针对结构化数据进行优化的

  • 从输出的时间特点上来看, 是一个批次先开始, 然后收集数据, 再进行展示, 这一点和 Spark Streaming 不太一样

总结

  1. 运行的时候需要先开启 Socket server

  2. Structured Streaming 的 API 和运行也是针对结构化数据进行优化过的

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值