Spark Streaming编程基础

文章目录

  • [1. 流式词频统计](#1. 流式词频统计)
    • [1.1 Spark Streaming编程步骤](#1.1 Spark Streaming编程步骤)
    • [1.2 流式词频统计项目](#1.2 流式词频统计项目)
      • [1.2.1 创建项目](#1.2.1 创建项目)
      • [1.2.2 添加项目依赖](#1.2.2 添加项目依赖)
      • [1.2.3 修改源目录](#1.2.3 修改源目录)
      • [1.2.4 添加scala-sdk库](#1.2.4 添加scala-sdk库)
      • [1.2.5 创建日志属性文件](#1.2.5 创建日志属性文件)
    • [1.3 创建词频统计对象](#1.3 创建词频统计对象)
    • [1.4 利用nc发送数据](#1.4 利用nc发送数据)
    • [1.5 启动应用,查看结果](#1.5 启动应用,查看结果)
  • [2. 编程模型的基本概念](#2. 编程模型的基本概念)
  • [3. 离散化数据流](#3. 离散化数据流)
  • [4. 基本数据源](#4. 基本数据源)
  • [5. 基本DStream转换操作](#5. 基本DStream转换操作)
  • [6. DStream输出操作](#6. DStream输出操作)

1. 流式词频统计

  • 本实战演示了如何使用 Spark Streaming 实现实时词频统计。通过创建 Spark Streaming 项目,添加依赖,编写 Scala 代码,监听网络端口接收数据流,并按批次处理数据。利用 nc 工具发送数据,程序每10秒统计一次词频并输出结果。该示例展示了 Spark Streaming 的微批处理特性,适用于实时数据处理场景。

1.1 Spark Streaming编程步骤

  1. 添加SparkStreaming相关依赖
  2. 获取程序入口接收数据
  3. 对数据进行业务处理
  4. 获取最终结果
  5. 启动程序等待程序执行结束

1.2 流式词频统计项目

1.2.1 创建项目

  • 设置项目基本信息
  • 单击【Create】按钮,生成项目基本骨架

1.2.2 添加项目依赖

  • pom.xml文件里添加依赖
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.huawei.streaming</groupId>
    <artifactId>SparkStreamingDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.12</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
    </dependencies>

</project>
  • 刷新项目依赖

1.2.3 修改源目录

  • java修改为scala

  • pom.xml里设置源目录

1.2.4 添加scala-sdk库

  • 在项目结构对话里添加
  • 单击【Add to Modules】菜单项
  • 单击【OK】按钮以后,就可以在scala里创建Scala Class

1.2.5 创建日志属性文件

  • resources里创建log4j2.properties文件
shell 复制代码
rootLogger.level = ERROR
rootLogger.appenderRef.stdout.ref = console

appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n%ex

1.3 创建词频统计对象

  • 创建net.huawei.streaming
  • net.huawei.streaming包里创建SparkStreamingWordCount对象
scala 复制代码
package net.huawei.streaming

import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
 * 功能:流式词频统计
 * 作者:华卫
 * 日期:2025年01月23日
 */
object SparkStreamingWordCount {
  def main(args: Array[String]): Unit = {
    // 创建SparkConf对象,2个线程,本地运行
    val conf: SparkConf = new SparkConf()
      .setMaster("local[2]")
      .setAppName("SparkStreamingWordCount")
    // 创建StreamingContext对象,10秒一个批次
    val ssc: StreamingContext = new StreamingContext(conf, Seconds(10))
    // 创建ReceiverInputDStream对象接收来自网络端口的数据
    val lines: ReceiverInputDStream[String] = ssc.socketTextStream("bigdata1", 9999)
    // lines中每条数据按照空格进行切分然后扁平化处理
    val words: DStream[String] = lines.flatMap(_.split(" "))
    // words中每条数据转换成(word,1)二元组
    val wordmap: DStream[(String, Int)] = words.map(word => (word, 1))
    // wordmap中每条数据按key分组,按value进行累加求和
    val wordcount: DStream[(String, Int)] = wordmap.reduceByKey(_ + _)
    // 打印词频统计结果 
    wordcount.print()
    // 启动实时流程序
    ssc.start()
    // 等待实时流程序结束
    ssc.awaitTermination()
  }
}
  • 代码说明 :这段代码实现了一个基于Spark Streaming的实时词频统计程序。它通过监听指定端口(bigdata1:9999)接收数据流,将每行数据按空格切分并扁平化为单词,然后统计每个单词的出现次数。程序每10秒处理一个批次的数据,并打印词频统计结果。代码结构清晰,适用于实时数据处理场景。

1.4 利用nc发送数据

  • bigdata1节点利用nc发送数据,执行命令:nc -lp 9999

1.5 启动应用,查看结果

  • 启动SparkStreamingWordCount对象,在bigdata1节点上输入数据,在控制台查看词频统计结果
  • 结果说明 :Spark Streaming 采用微批处理,每批次数据独立处理,批次间不共享状态或共同计数。默认情况下,批次间数据互不影响。如需跨批次状态管理,可使用 updateStateByKeymapWithState 实现累加计数等功能。这种设计确保了流数据处理的灵活性和高效性。

2. 编程模型的基本概念

3. 离散化数据流

4. 基本数据源

5. 基本DStream转换操作

6. DStream输出操作

相关推荐
goTsHgo4 个月前
Spark 任务与 Spark Streaming 任务的差异详解
大数据·分布式·spark streaming
夜夜流光相皎洁_小宁6 个月前
Apache Spark分布式计算框架架构介绍
spark streaming·apache spark·spark 架构·spark 运行时架构·spark 组件角色·spark 生态·spark 特点
程序员入门中10 个月前
在Spring Boot中使用Spark Streaming进行实时数据处理和流式计算
spring boot·后端·spark·spark streaming
Francek Chen1 年前
Spark编程实验四:Spark Streaming编程
大数据·分布式·spark·spark streaming