一、WordCount 案例实操
➢ 需求:使用 netcat 工具向 9999 端口不断的发送数据,通过 SparkStreaming 读取端口数据并
统计不同单词出现的次数
1) 添加依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.12</artifactId>
<version>3.0.0</version>
</dependency>
2) 编写代码
package com.spack.bigdata.streaming
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* SparkStreaming 入门
* WordCount
*/
object SparkStreaming01_WordCoun {
def main(args: Array[String]): Unit = {
//创建环境对象
//StreamingContext 创建时、需要传递两个参数
//第一个参数表示环境变量
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SparkStreaming")
//第二个参数表示批量处理的周期(采集周期)---Seconds以秒为单位
val scc = new StreamingContext(sparkConf, Seconds(3))
//TODO 逻辑处理
//获取端口数据
val lines: ReceiverInputDStream[String] = scc.socketTextStream("localhost", 9999)
val words = lines.flatMap(_.split(" "))
val wordsToOne = words.map(
w => {
(w, 1)
}
)
val wordCount: DStream[(String, Int)] = wordsToOne.reduceByKey(_ + _)
wordCount.print()
//TODO 关闭环境
//由于 SparkStreaming 采集器是长期执行的任务。所以不能直接关闭
//如果main方法 执行完毕,应用程序也会自动结束。所以不能让main执行完毕
// scc.stop()
//1、启动采集器
scc.start()
//2、等待采集器的关闭
scc.awaitTermination()
}
}
3) 启动程序并通过 netcat 发送数据
nc -lk 9999
hello spark
二、WordCount 解析
Discretized Stream 是 Spark Streaming 的基础抽象,代表持续性的数据流和经过各种 Spark 原语操作后的结果数据流。在内部实现上,DStream 是一系列连续的 RDD 来表示。每个 RDD 含有一段时间间隔内的数据。
对数据的操作也是按照 RDD 为单位来进行的
计算过程由 Spark Engine 来完成