SparkStreaming---入门

文章目录

1.SparkStreaming简介

1.1 流处理和批处理

流处理和批处理是两种不同的数据处理方式,它们在处理数据的方式和特点上有所不同。

流处理(Stream Processing)是一种数据处理方式,它实时地处理数据流 ,即将源源不断的数据按照特定的规则进行实时处理。

批处理(Batch Processing)是一种数据处理方式,它将一段时间内的数据收集起来,然后一次性地进行处理。

1.2 实时和离线

实时和离线是数据处理中的两种不同方式,它们在处理速度和数据类型上有所区别。

实时处理是指数据处理的速度能够满足实时要求,通常是指对数据进行的处理能够在相应的时间内产生结果 ,并且结果能够及时反馈给用户或应用系统。实时处理通常用于需要快速响应的应用场景,如实时监控、实时交易等。

离线处理则是指数据处理的速度相对较慢,通常需要较长时间才能完成,而且不需要实时反馈结果。离线处理通常用于处理大规模的数据集,如数据分析、机器学习等。离线处理可以在非实时环境中进行,例如在晚上或者周末等时间进行批量数据处理。

实时一般来说以毫秒为单位,不可与流处理混为一谈,而离线相对来说是以时、天为单位。

1.3 SparkStreaming是什么

Spark Streaming是构建在Spark上的实时计算框架,扩展了Spark处理大规模流式数据的能力。但是SparkStreaming不能做到真正意义上的实时计算,实际上它是一种准实时(秒,分钟),微批次的数据处理框架。 它将连续不断的数据按固定的时间间隔进行切分 ,使其变为一个个连续的批次,进而按顺序对每一个批次进行处理。一般情况下,每一个批次都会很小,这就是微批次。Spark Streaming的目的是为了进行实时数据分析,但因为一批数据量比较小,又达不到离线的范畴,所以称为准实时。

SparkStreaming用于流式数据的处理,Spark Streaming 支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等等。结果也能保存在很多地方,如 HDFS,数据库等。

1.4 SparkStreaming架构图

和 Spark 基于 RDD 的概念很相似,Spark Streaming 使用离散化流(discretized stream)作为抽象表示,叫作 DStream。 DStream 是随时间推移而收到的数据的序列。在内部,每个时间区间收到的数据都作为 RDD 存在,而 DStream 是由这些 RDD 所组成的序列(因此得名"离散化")。所以简单来讲,DStream 就是对 RDD 在实时数据处理场景的一种封装。

在SparkStreaming中,会有一个专门接收器来接受从数据源输入的数据,并且将这些数据封装成离散化流(DStream)。之后的操作就是对DStream进行处理的。简单来讲,DStream就是对一系列RDD的封装。

2.背压机制

Spark 1.5 以前版本,用户如果要限制 Receiver 的数据接收速率 ,可以通过设置静态配制参数"spark.streaming.receiver.maxRate"的值来实现,此举虽然可以通过限制接收速率,来适配当前的处理能力,防止内存溢出,但也会引入其它问题。比如:producer 数据生产高于 maxRate,当前集群处理能力也高于 maxRate,这就会造成资源利用率下降等问题。为了更好的协调数据接收速率与资源处理能力,1.5 版本开始 Spark Streaming 可以动态控制数据接收速率来适配集群数据处理能力。背压机制(即 Spark Streaming Backpressure): 根据JobScheduler 反馈作业的执行信息来动态调整 Receiver 数据接收率。通过属性"spark.streaming.backpressure.enabled"来控制是否启用 backpressure 机制,默认值false,即不启用。

3.DStream案例实操

需求:实现WordCount 案例

使用 netcat 工具向 9999 端口不断的发送数据,通过 SparkStreaming 读取端口数据并统计不同单词出现的次数
Netcat(简称nc)是一款强大的命令行网络工具,用来在两台机器之间建立TCP/UDP连接,并通过标准的输入输出进行数据的读写。 netcat下载地址https://eternallybored.org/misc/netcat/

  def main(args: Array[String]): Unit = {
    //1.初始化 Spark 配置信息
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("StreamWordCount")
    //2.初始化 SparkStreamingContext
    //处理区间为3s一次
    val ssc = new StreamingContext(sparkConf, Seconds(3))
    //3.通过监控端口创建 DStream,读进来的数据为一行行
    val lines = ssc.socketTextStream("localhost", 9999)
    //将每一行数据做切分,形成一个个单词
    val words = lines.flatMap(_.split(" "))

    val wordMap = words.map(word => (word, 1))

    val resultData = wordMap.reduceByKey(_ + _)

    resultData.print()

    //启动SparkStreamingContext
    ssc.start()
    //等待接收数据
    ssc.awaitTermination()
  }
相关推荐
Aloudata2 分钟前
NoETL 自动化指标平台如何保障数据质量和口径一致性?
大数据·数据分析·数据质量·noetl
SelectDB技术团队43 分钟前
Apache Doris 创始人:何为“现代化”的数据仓库?
大数据·数据库·数据仓库·数据分析·doris
Suwg2091 小时前
《手写Mybatis渐进式源码实践》实践笔记(第七章 SQL执行器的创建和使用)
java·数据库·笔记·后端·sql·mybatis·模板方法模式
丁总学Java1 小时前
优化 invite_codes 表的 SQL 创建语句
java·数据库·sql
冰镇毛衣2 小时前
4.5 数据表的外连接
数据库·sql·mysql
原点安全3 小时前
“鼎和财险一体化数据安全管控实践”入选信通院金融领域优秀案例
大数据·人工智能·金融
Apache Flink3 小时前
探索Flink动态CEP:杭州银行的实战案例
大数据·单例模式·flink
AdSet聚合广告3 小时前
穿山甲等广告联盟依据哪些维度给APP、小程序结算广告变现收益
大数据·小程序
赛逸展张胜4 小时前
CES Asia是一个关于什么的展会?
大数据·人工智能·科技
树莓集团4 小时前
树莓集团:数字化产业园建设运营推动数字经济
大数据·云计算·媒体