2. Structured Streaming 入门案例
目标
了解
Structured Streaming
的编程模型, 为理解Structured Streaming
时候是什么, 以及核心体系原理打下基础步骤
需求梳理
Structured Streaming
代码实现运行
验证结果
2.1 需求梳理
目标
理解接下来要做的案例, 有的放矢
步骤
需求
整体结构
开发方式
2.1.1 需求
-
编写一个流式计算的应用, 不断的接收外部系统的消息
-
对消息中的单词进行词频统计
-
统计全局的结果
2.1.2 整体结构
-
Socket Server
等待Structured Streaming
程序连接 -
Structured Streaming
程序启动, 连接Socket Server
, 等待Socket Server
发送数据 -
Socket Server
发送数据,Structured Streaming
程序接收数据 -
Structured Streaming
程序接收到数据后处理数据 -
数据处理后, 生成对应的结果集, 在控制台打印
2.1.3 开发方式和步骤
Socket server
使用 Netcat nc
来实现
Structured Streaming
程序使用 IDEA
实现, 在 IDEA
中本地运行
-
编写代码
-
启动
nc
发送Socket
消息 -
运行代码接收
Socket
消息统计词频
2.1.4 总结
简单来说, 就是要进行流式的词频统计, 使用 Structured Streaming
2.2 代码实现
目标
实现
Structured Streaming
部分的代码编写步骤
创建文件
创建
SparkSession
读取
Socket
数据生成DataFrame
将
DataFrame
转为Dataset
, 使用有类型的API
处理词频统计生成结果集, 并写入控制台
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
的一些原理步骤
开启
Socket server
运行程序
查看数据集
开启 Socket server
和运行程序
在虚拟机
node01
中运行nc -lk 9999
在 IDEA 中运行程序
在
node01
中输入以下内容hello world hello spark hello hadoop hello spark hello spark
查看结果集
从结果集中可以观察到以下内容
Structured Streaming
依然是小批量的流处理
Structured Streaming
的输出是类似DataFrame
的, 也具有Schema
, 所以也是针对结构化数据进行优化的从输出的时间特点上来看, 是一个批次先开始, 然后收集数据, 再进行展示, 这一点和
Spark Streaming
不太一样
总结
运行的时候需要先开启
Socket server
Structured Streaming
的 API 和运行也是针对结构化数据进行优化过的