Spark-Streaming有状态计算

一、上下文

《Spark-Streaming初识》中的NetworkWordCount示例只能统计每个微批下的单词的数量,那么如何才能统计从开始加载数据到当下的所有数量呢?下面我们就来通过官方例子学习下Spark-Streaming有状态计算。

二、官方例子

所属包:org.apache.spark.examples.streaming

Scala 复制代码
object StatefulNetworkWordCount {
  def main(args: Array[String]): Unit = {
    if (args.length < 2) {
      System.err.println("Usage: StatefulNetworkWordCount <hostname> <port>")
      System.exit(1)
    }

    StreamingExamples.setStreamingLogLevels()

    val sparkConf = new SparkConf().setAppName("StatefulNetworkWordCount")
    //创建微批为 1 秒的上下文
    val ssc = new StreamingContext(sparkConf, Seconds(1))
    //指定 checkpoint 目录
    ssc.checkpoint(".")

    // 用一个 List 初始化一个 RDD
    val initialRDD = ssc.sparkContext.parallelize(List(("hello", 1), ("world", 1)))

    // 在目标ip:port上创建一个ReceiverInputDStream,并对分隔测试的输入流中的单词进行计数(例如由'nc'生成)
    val lines = ssc.socketTextStream(args(0), args(1).toInt)
    val words = lines.flatMap(_.split(" "))
    val wordDstream = words.map(x => (x, 1))

    // 使用mapWithState更新累积计数这将给出一个由状态组成的DStream(即单词的累积计数)
    val mappingFunc = (word: String, one: Option[Int], state: State[Int]) => {
      val sum = one.getOrElse(0) + state.getOption.getOrElse(0)
      val output = (word, sum)
      state.update(sum)
      output
    }

    val stateDstream = wordDstream.mapWithState(
      StateSpec.function(mappingFunc).initialState(initialRDD))
    stateDstream.print()
    ssc.start()
    ssc.awaitTermination()
  }
}

三、分析

1、构建SparkConf

它是Spark应用程序的配置,用于设置Spark的各种参数。支持链式设置

Scala 复制代码
new SparkConf().setMaster("local").setAppName("My app")

一旦SparkConf对象传递给Spark,用户就不能再对其进行修改。Spark不支持在运行时修改配置

2、构建StreamingContext

它是Spark Streaming功能的主要入口点,且提供了从各种输入源创建\[org.apache.spark.streaming.dstream.DStream] 的方法。

创建和转换DStreams后,可以分别使用start()、stop()启动和停止流计算,awaitTermination()允许当前线程通过stop()或异常等待上下文的终止。

3、设置checkpoint

StreamingContext最终还是通过SparkContext来设置checkpoint,但其实都是为各自的checkpointDir设置checkpoint路径,在有状态计算中checkpoint是必须的。

所谓有状态计算就必须要把历史状态给存储下来,spark中使用使用checkpoint来实现这个存储,每个微批的数据的计算都要更新到历史状态中。

Scala 复制代码
class SparkContext(config: SparkConf) extends Logging {

  private[spark] var checkpointDir: Option[String] = None

}
Scala 复制代码
class StreamingContext private[streaming] (
    _sc: SparkContext,
    _cp: Checkpoint,
    _batchDur: Duration
  ) extends Logging {

  private[streaming] var checkpointDir: String = {
    if (isCheckpointPresent) {
      sc.setCheckpointDir(_cp.checkpointDir)
      _cp.checkpointDir
    } else {
      null
    }
  }

}

4、初始化一个RDD

为什么要初始化一个RDD呢?我们看看下面是如何用到的。

5、创建一个ReceiverInputDStream

这里是从TCP源hostname:port创建输入流。使用TCP套接字接收数据,并使用给定的转换器将接收字节解释为对象

6、处理单词

从源码中可以看出会把这样的文本

hadoop spark flink kafka hadoop spark-streaming

处理成这样的格式

hadoop 1

spark 1

flink 1

kafka 1

hadoop 1

spark-streaming 1

6、使用mapWithState更新累积计数

该算子可以维护并更新每个key的状态。

这里用到一个新对象:StateSpec,且用到了它的两个方法,initialState和function

initialState:设置包含"mapWithState"将使用的初始状态的RDD`

function:设置实际的状态更新操作

Scala 复制代码
//第1个参数:状态 key 的类别
//第2个参数:状态 value 的类别
//第3个参数:状态 数据 的类别
//第4个参数:状态 处理完要返回 的类别
def mappingFunction(key: String, value: Option[Int], state: State[Int]): Option[String] = {

  // 使用state.exists()、state.get()、state.update()和state.remove()来管理状态,并返回必要的字符串
}

四、运行

运行Netcat

nc -lk 9999

新建一个窗口运行官方例子

cd /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/spark/

bin/run-example org.apache.spark.examples.streaming.StatefulNetworkWordCount cdh1 9999


大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:

可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议如下:

第四届大数据、信息与计算机网络国际学术会议(BDICN 2025)

第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)

第六届大数据与信息化教育国际学术会议(ICBDIE 2025)

第三届通信网络与机器学习国际学术会议(CNML 2025)

相关推荐
FII工业富联科技服务2 小时前
GPT-6 Astra发布,Agent的竞争开始从“会调用工具”走向“完成完整工作”
大数据·人工智能·gpt·架构·机器人·制造
QYR-分析3 小时前
蓝海赛道高速扩容!全球小型观察ROV市场格局、细分场景与发展趋势分析
大数据·运维·云计算
Elastic 中国社区官方博客4 小时前
Elasticsearch Python DSL 客户端开发
大数据·数据库·python·elasticsearch·搜索引擎·全文检索
hughnz4 小时前
石油工程的端到端数字化转型:演化还是革命
大数据·人工智能·科技
龙亘川4 小时前
旅游强国建设|一网统管智慧旅游服务模块,赋能节假日文旅数字化治理
大数据·数据库·人工智能·科技·智慧城市·旅游
Databend5 小时前
只看 PASS 会骗你,6 条 Agent Trace 里的 Coding Agent 评测真相
大数据·数据库·agent
数字新视界5 小时前
动环监控可视化技术在机房管理智能化中的实际应用剖析
大数据·人工智能·数据中心·微模块机房·模块化机房
朴实赋能5 小时前
AI拒答机制实战:心理咨询危机识别Agent三层防护、五级分层与六类智能体拆解
大数据·人工智能·多agent协同·心理咨询ai·心理危机识别·ai拒答机制·隐私匿名化
龙亘川6 小时前
智慧景区建设实践|文旅热度持续走高,景区如何把流量稳稳转化为口碑?
大数据·人工智能·科技·信息可视化·智慧城市