Spark Streaming流媒体引擎

news2024/9/20 18:36:40

Spark Streaming是Spark的上一代流媒体引擎。Spark Streaming不再有更新,它是一个遗留项目。Spark中有一个更新且更易于使用的流媒体引擎,称为结构化流媒体

概述

Spark Streaming是核心Spark API的扩展,支持实时数据流的可扩展、高吞吐量、容错流处理。数据可以从许多来源获取,如Kafka、Kinesis或TCP套接字,并且可以使用复杂的算法进行处理,这些算法用高级函数表示,如map、reduce、join和window。最后,可以将处理后的数据推送到文件系统、数据库和实时仪表板。事实上,您可以将Spark的机器学习和图形处理算法应用于数据流。
原理:Spark Streaming接收实时输入数据流,并将数据划分为多个批次,然后由Spark引擎进行处理,以批量生成最终的结果流。
在这里插入图片描述

离散流(DStreams)

离散流或DStream是Spark Streaming提供的基本抽象。它表示连续的数据流,或者是从源接收的输入数据流,要么是通过转换输入流生成的处理后的数据流。在内部,DStream由一系列连续的RDD表示,这是Spark对不可变的分布式数据集的抽象(有关更多详细信息,请参阅Spark编程指南)。DStream中的每个RDD都包含特定间隔的数据,如下图所示。
对数据流应用的任何操作都转换为对底层RDD的操作,这些底层的RDD转换是由Spark引擎计算的。DStream操作隐藏了大多数这些细节,并为开发人员提供了更高级别的API以方便使用

每个输入DStream(除了文件流)都与一个Receiver(Scala-doc,Java-doc)对象相关联,该对象从源接收数据并将其存储在Spark的内存中进行处理。

Input DStreams和Receivers

在Spark Streaming中,封装了输入数据流的两个主要组件:Input DStreams和Receivers。

Input DStreams是Spark Streaming用来表示从数据源接收输入数据的抽象。每个输入DStream都可以看作是一个连续的数据流,它由多个RDD组成,这些RDD代表在一段时间内接收到的数据。Spark Streaming支持多种类型的输入DStreams,如基于文件、基于套接字、基于Kafka等。

接收器(Receiver)是实际负责从数据源获取数据并将其传递给Spark Streaming的组件。在Spark Streaming中,接收器是在工作节点上运行的独立任务,用于从数据源接收数据并将其存储在分布式存储系统中(如HDFS)。一旦数据被接收器接收并存储,Spark Streaming就会周期性地将存储的数据转换为RDD,并将其交给Spark引擎进行处理。

当输入DStream启动时,它会自动配置并启动与之关联的接收器。接收器会以并行的方式从数据源中获取数据,并将其划分为一系列小的数据块。然后,这些数据块会被Spark Streaming的计算引擎处理,形成最终的结果。

总结来说,Input DStreams和Receivers是Spark Streaming中用于接收和处理输入数据的关键组件。Input DStreams代表连续的数据流,而Receivers负责从数据源接收数据,并将其传递给Spark Streaming进行处理。
两类内置流媒体源:

  • 基本源:StreamingContext API中直接可用的源。示例:文件系统和套接字连接;
  • 高级资源:Kafka、Kinesis等资源可以通过额外的实用程序类获得

在Spark中,目录的监控是由Spark Streaming和Structured Streaming提供的功能。下面分别说明这两种流处理的方式:

  1. Spark Streaming:对于Spark Streaming,可以使用textFileStream方法来监控一个目录中的文件,并将新增的文件作为新的输入源。它会周期性地检查目录中是否有新的文件出现,然后将新的文件内容作为DStream的一部分进行处理。这种监控方式是基于轮询的,Spark Streaming会定期轮询目录以检查是否有新的文件。

以下是一个使用Spark Streaming监控目录的示例代码片段:

import org.apache.spark.streaming.{StreamingContext, Seconds}
val ssc = new StreamingContext(sparkConf, Seconds(1))

val directory = "/path/to/directory"
val lines = ssc.textFileStream(directory)
lines.foreachRDD { rdd =>
  // Process the RDD
}

ssc.start()
ssc.awaitTermination()
  1. Structured Streaming:对于Structured Streaming,可以使用readStream方法来监控一个目录中的数据,并将新增的数据作为新的输入源。类似于Spark Streaming,这种监控方式也是基于轮询的,Structured Streaming会定期轮询目录以检查是否有新的数据。

以下是一个使用Structured Streaming监控目录的示例代码片段:

import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().getOrCreate()

val directory = "/path/to/directory"
val df = spark.readStream.text(directory)
val query = df.writeStream.format("console").start()

query.awaitTermination()

这个示例将会从指定目录中读取文本文件,然后通过console输出源将内容显示在控制台上。输出源可以根据需求进行修改,比如写入文件、写入到Kafka等。

无论是使用Spark Streaming还是Structured Streaming,监控目录时需要注意文件的命名规则和文件格式,以确保数据按照预期被输入到流处理任务中。

各种转换操作

在Spark Streaming中,DStream是一个连续的数据流抽象,可以应用各种转换操作进行实时处理和分析。以下是一些常见的DStream转换操作:

  1. map(func):应用一个函数到DStream中的每个元素,并返回一个新的DStream,其中包含转换后的结果。

  2. flatMap(func):应用一个函数到DStream中的每个元素,并返回一个包含所有转换后结果的新DStream。

  3. filter(func):过滤DStream中的元素,只保留满足条件的元素。

  4. union(otherStream):将当前DStream与另一个DStream合并,生成包含两个DStream元素的新DStream。

  5. count():返回一个新的DStream,其中每个批次的元素是当前批次的元素数量。

  6. reduce(func):将当前DStream中每个批次的元素使用给定的函数进行聚合操作,返回一个新的DStream,其中每个批次仅包含一个聚合结果。

  7. window(windowDuration, slideDuration):创建一个滑动窗口,用于对窗口内的元素进行批处理操作。每个窗口都包含指定的窗口时长的元素,并且以指定的滑动间隔进行移动。

  8. join(otherStream):将当前DStream中的元素与另一个DStream中的元素进行连接操作,生成一个新的DStream,其中每个元素是两个流中匹配的元素对。

  9. foreachRDD(func):将一个RDD操作应用于DStream中的每个RDD,可以用于实现自定义的输出操作或将数据存储到外部系统中。

这些是常见的DStream转换操作,还有其他更高级的操作可以使用,例如窗口操作、状态操作、累加器等。根据实际需求,选择适当的转换操作来对DStream进行处理和转换。

接收到的数据是以微批次(micro-batches)的形式处理的

在Spark Streaming中,接收到的数据是以微批次(micro-batches)的形式处理的。Spark Streaming将实时数据流划分为一系列小的时间窗口,每个窗口称为一个微批次。每个微批次都由一些时间段内到达的数据组成。

接收到的数据在每个微批次内按时间顺序进行处理。具体而言,对于每个微批次,Spark Streaming会将接收到的数据收集到一个RDD(Resilient Distributed Dataset)中,然后应用在DStream上定义的转换操作。

有几种不同的语义来处理接收到的数据:

  1. At-least-once:在这种语义下,Spark Streaming保证至少处理一次数据。它使用WAL(Write-Ahead Log)机制来记录接收到的数据,以便在故障恢复时进行重播,确保数据不会丢失。这种语义可以保证数据的可靠性,但可能会导致某些数据重复处理。

  2. At-most-once:在这种语义下,Spark Streaming只处理数据一次,不保证重复数据的处理。这比较适用于实时处理对数据丢失更敏感的场景,但可能会导致一些数据丢失。

  3. Exactly-once:这是最严格的语义,要求保证每条数据仅被处理一次,且不丢失。实现确切一次语义较为复杂,需要使用外部的数据存储系统(如Apache Kafka)和事务支持。Spark Streaming提供了与Kafka集成的功能,可以实现近似的确切一次语义。

值得注意的是,Spark Streaming的语义是基于微批次的处理,因此无法提供实时流处理系统(如Apache Flink或Apache Storm)所提供的低延迟。每个微批次的处理延迟取决于微批次的窗口大小和处理任务的复杂性,可能在几十毫秒到几秒之间。

选择适当的语义取决于应用的需求和容忍的数据处理保证级别。如果数据的准确性非常重要,可以使用At-least-once或Exactly-once语义。如果对数据处理的延迟更敏感,可以选择At-most-once语义。

输出批次的数据

在Spark Streaming中,DStream是一个连续的数据流抽象,可以应用各种输出操作来将处理结果发送到外部系统或执行其他特定操作。以下是一些常见的DStream输出操作:

  1. print():将DStream中每个批次的数据打印到控制台。这对于调试和快速查看处理结果非常有用。

  2. saveAsTextFiles(prefix, [suffix]):将每个批次的数据以文本文件的形式保存到指定的目录中。可提供前缀和后缀参数来自定义文件名。

  3. saveAsObjectFiles(prefix, [suffix]):将每个批次的数据以序列化对象的形式保存到指定的目录中。同样可提供前缀和后缀参数。

  4. foreachRDD(func):对DStream中每个RDD应用一个自定义函数。可以在这个函数中执行特定的操作,如将数据存储到外部数据库、发送到消息队列等。需要注意的是,这个函数必须是幂等的,因为RDD可以在故障恢复时被重新计算。

  5. foreach(func):对DStream中每个批次的数据应用一个自定义函数。与foreachRDD不同的是,这个函数直接应用于DStream的每个元素,而不是RDD。

  6. saveToHadoopFiles(prefix, [suffix]):将每个批次的数据以Hadoop文件格式保存到指定的目录中。

  7. foreachPartition(func):对DStream中每个RDD的每个分区应用一个自定义函数。这对于批量处理每个分区的数据非常有用,在处理大规模数据时可以提高性能。

这些输出操作允许将Spark Streaming处理的结果发送到外部系统、存储到文件中,或执行自定义的操作。根据需求选择合适的输出操作,以满足数据处理的要求和目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术分享 | App测试时常用的adb命令你都掌握了哪些呢?

adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具,可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

Python Geoplotlib 可视化地理数据的综合指南

Geoplotlib: Exploring the World with Python Python Geoplotlib 可视化地理数据的综合指南 Geoplotlib是一个强大的Python库,用于可视化地理数据。它提供了一种简单直观的方法来创建地图并在其上绘制地理数据。 Geoplotlib 建立在 matplotlib 和 numpy…

有哪些常用的设计素材资源网站?

设计师要想在瞬息万变的设计世界中紧跟潮流,就需要不断探索和访问流行的UI设计网站,看看什么是时尚。UI设计网站也是寻求可能解决方案、脚本和设计反馈的好地方。Behance对很多设计师来说并不陌生,是Adobe的UI设计网站。然而,2022…

蓝桥杯单片机第九届国赛 真题+代码

iic.c /* # I2C代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础&#xff0c;根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求&#xff0c;进行代码调试和修改。 */ #include <STC1…

【Vue3】局部组件和全局组件

1. 局部组件 Card.vue <template><div class"card"><header><div>标题</div><div>副标题</div></header><section>内容</section></div> </template><script setup lang"ts"…

Jenkins集成SonarQube保姆级教程

Jenkins是自动化部署平台&#xff0c;一个粗眉大眼的糙汉子&#xff01; SonarQube是代码扫描平台&#xff0c;一个眉目清秀的小女子&#xff01; 有一天&#xff0c;上天交给我一个任务&#xff0c;去撮合撮合他们&#xff01; 我抬头看了看天&#xff0c; 不&#xff0c;…

第五章 传输层

第五章 传输层 5.1 运输层的功能 运输层功能&#xff1a; 运输层为应用进程之间提供 端到端的逻辑通信&#xff08;但网络层是为主机之间提供逻辑通信&#xff09;。 运输层还要对收到的报文进行差错检测。 运输层提供面向连接和无连接的服务 ​ 从通信和信息处理的角度看…

Jsp+Ssh+Mysql实现的简单的企业物资信息管理系统项目源码附带视频指导运行教程

由jspssh&#xff08;springstruts2mysql&#xff09;实现的企业物资信息管理系统&#xff0c;系统功能比较简单&#xff0c;实现了基本的管理员、操作员等用户管理、物品分类管理、物品管理、入库管理、出库管理、库存预警、客户管理、供应商管理等基本功能需要的可以联系我分…

Linux工具【1】(编辑器vim、编译器gcc与g++)

vim详解 引言vimVim的三种模式及模式切换普通模式下操作底行模式下操作 gcc与ggcc的使用&#xff08;g类似&#xff09;预编译编译汇编链接静态库与动态库 总结 引言 vim&#xff08;vi improved&#xff09;编辑器是从 vi 发展出来的一个文本编辑器。 代码补全、编译及错误跳…

C# 定时器封装版

一、概述 在 Winform 等平台开发中&#xff0c;经常会用到定时器的功能&#xff0c;但项目定时器一旦写多了&#xff0c;容易使软件变卡&#xff0c;而且运行时间长了会造成软件的闪退&#xff0c;这个可能是内存溢出造成的&#xff0c;具体原因我也没去深究&#xff0c;另一个…

2023年五大团队任务管理跟踪软件排行榜揭晓

企业对高效生产力的需求让团队任务管理跟踪软件在现代商业环境中变得越来越重要&#xff0c;然而市场上存在众多的任务管理工具&#xff0c;选择合适的工具对于提高工作效率和实现组织目标至关重要。本文章将提供一个客观的团队任务管理跟踪软件排行榜&#xff0c;帮助读者根据…

springboot创建并配置环境(二) - 配置基础环境

文章目录 一、介绍二、配置系统属性和环境变量三、配置自定义属性命令行参数四、作为应用配置信息 一、介绍 在上一篇文章&#xff1a;springboot创建并配置环境(一) - 创建环境中我们探讨了springboot是如何根据当前应用程序类型去创建对应的环境实例的。接下来探讨如何去配置…

java上传和解压任意压缩包

java上传zip文件并解压读取_java上传压缩包解压_梓隽的博客-CSDN博客 添加依赖 <dependency><groupId>com.github.junrar</groupId><artifactId>junrar</artifactId><version>7.4.1</version></dependency><dependency&g…

无涯教程-jQuery - hide( speed, callback)方法函数

hide(speed&#xff0c;[callback])方法使用优美的动画隐藏所有匹配的元素&#xff0c;并在完成后触发可选的回调。 hide( speed, [callback] ) - 语法 selector.hide( speed, [callback] ); 这是此方法使用的所有参数的描述- speed - 代表三个预定义速度("slow…

四. 点云着色(真彩点云)方案

前面内容&#xff1a; 一. 器件选型心得&#xff08;系统设计&#xff09;--1_goldqiu的博客-CSDN博客 一. 器件选型心得&#xff08;系统设计&#xff09;--2_goldqiu的博客-CSDN博客 二. 多传感器时间同步方案&#xff08;时序闭环&#xff09;--1 三. 多传感器标定方案&…

【业务功能篇57】Springboot + Spring Security 权限管理 【上篇】

4.权限管理模块开发 4.1 权限管理概述 4.1.1 权限管理的意义 后台管理系统中&#xff0c;通常需要控制不同的登录用户可以操作的内容。权限管理用于管理系统资源&#xff0c;分配用户菜单、资源权限&#xff0c;以及验证用户是否有访问资源权限。 4.1.2 RBAC权限设计模型 …

【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal

【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal 第六章 小程序事件绑定、动态提示Toast、对话框 Modal 文章目录 【微信小程序创作之路】- 小程序事件绑定、动态提示Toast、对话框 Modal前言一、事件是什么&#xff1f;二、小程序中常用事件三、事件传…

iOS--多线程原理

进程、线程与队列 进程的定义 进程是指在系统中正在运行的一个应用程序&#xff0c;如微信、支付宝app都是一个进程每个进程之间是独立的&#xff0c;每个进程均运行在齐专用的且受保护的内存 线程的定义 线程是进程的基本执行单元&#xff0c;一个进程的所有任务都在线程中…

【牛客网】链表的回文结构

思路1&#xff1a;找到中间节点&#xff0c;从中间节点向后反转链表 寻找链表的中间节点和反转链表的程序已经讲解过 寻找链表的中间节点&#xff1a;CSDN 反转链表&#xff1a;CSDN 然后从头节点和中间节点依次向后比较节点的值 &#x1f4d6;Note: 后半段链表反转后&#xff…

每天100w次登陆请求, 8G 内存该如何设置JVM参数?

一、新系统上线如何规划容量&#xff1f; 1.套路总结 任何新的业务系统在上线以前都需要去估算服务器配置和JVM的内存参数&#xff0c;这个容量与资源规划并不仅仅是系统架构师的随意估算的&#xff0c;需要根据系统所在业务场景去估算&#xff0c;推断出来一个系统运行模型&…