Spark Streaming:Spark的实时流计算API

你好,我是程序员贵哥。

今天我要与你分享的内容是“Spark Streaming”。

通过上一讲的内容,我们深入了解了Spark SQL API。通过它,我们可以像查询关系型数据库一样查询Spark的数据,并且对原生数据做相应的转换和动作。

但是,无论是DataFrame API还是DataSet API,都是基于批处理模式对静态数据进行处理的。比如,在每天某个特定的时间对一天的日志进行处理分析。

在第二章中你已经知道了,批处理和流处理是大数据处理最常见的两个场景。那么作为当下最流行的大数据处理平台之一,Spark是否支持流处理呢?

答案是肯定的。

早在2013年,Spark的流处理组件Spark Streaming就发布了。之后经过好几年的迭代与改进,现在的Spark Streaming已经非常成熟,在业界应用十分广泛。

今天就让我们一起揭开Spark Streaming的神秘面纱,让它成为我们手中的利器。

Spark Streaming的原理

Spark Streaming的原理与微积分的思想很类似。

在大学的微积分课上,你的老师一定说过,微分就是无限细分,积分就是对无限细分的每一段进行求和。它本质上把一个连续的问题转换成了无限个离散的问题。

比如,用微积分思想求下图中阴影部分S的面积。

我们可以把S无限细分成无数个小矩形,因为矩形的宽足够短,所以它顶端的边近似是一个直线。这样,把容易计算的矩形面积相加,就得到不容易直接计算的不规则图形面积。

你知道,流处理的数据是一系列连续不断变化,且无边界的。我们永远无法预测下一秒的数据是什么样。Spark Streaming用时间片拆分了无限的数据流,然后对每一个数据片用类似于批处理的方法进行处理,输出的数据也是一块一块的。如下图所示。

Spark Streaming提供一个对于流数据的抽象DStream。DStream可以由来自Apache Kafka、Flume或者HDFS的流数据生成,也可以由别的DStream经过各种转换操作得来。讲到这里,你是不是觉得内容似曾相识?

没错,底层DStream也是由很多个序列化的RDD构成,按时间片(比如一秒)切分成的每个数据单位都是一个RDD。然后,Spark核心引擎将对DStream的Transformation操作变为针对Spark中对 RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。

之前的DataFrame和DataSet也是同样基于RDD,所以说RDD是Spark最基本的数据抽象。就像Java里的基本数据类型(Primitive Type)一样,所有的数据都可以用基本数据类型描述。

也正是因为这样,无论是DataFrame,还是DStream,都具有RDD的不可变性、分区性和容错性等特质。

所以,Spark是一个高度统一的平台,所有的高级API都有相同的性质,它们之间可以很容易地相互转化。Spark的野心就是用这一套工具统一所有数据处理的场景。

由于Spark Streaming将底层的细节封装起来了,所以对于开发者来说,只需要操作DStream就行。接下来,让我们一起学习DStream的结构以及它支持的转换操作。

DStream

下图就是DStream的内部形式,即一个连续的RDD序列,每一个RDD代表一个时间窗口的输入数据流。

对DStream的转换操作,意味着对它包含的每一个RDD进行同样的转换操作。比如下边的例子。

sc = SparkContext(master, appName) ssc = StreamingContext(sc, 1) lines = sc.socketTextStream("localhost", 9999) words = lines.flatMap(lambda line: line.split(" "))

首先,我们创建了一个lines的DStream,去监听来自本机9999端口的数据流,每一个数据代表一行文本。然后,对lines进行flatMap的转换操作,把每一个文本行拆分成词语。

本质上,对一个DStream进行flatMap操作,就是对它里边的每一个RDD进行flatMap操作,生成了一系列新的RDD,构成了一个新的代表词语的DStream。

正因为DStream和RDD的关系,RDD支持的所有转换操作,DStream都支持,比如map、flatMap、filter、union等。这些操作我们在前边学习RDD时都详细介绍过,在此不做赘述。

此外,DStream还有一些特有操作,如滑动窗口操作,我们可以一起探讨。

滑动窗口操作

任何Spark Streaming的程序都要首先创建一个StreamingContext的对象,它是所有Streaming操作的入口。

比如,我们可以通过StreamingContext来创建DStream。前边提到的例子中,lines这个DStream就是由名为sc的StreamingContext创建的。

StreamingContext中最重要的参数是批处理的时间间隔,即把流数据细分成数据块的粒度。

这个时间间隔决定了流处理的延迟性,所以,需要我们根据需求和资源来权衡间隔的长度。上边的例子中,我们把输入的数据流以秒为单位划分,每一秒的数据会生成一个RDD进行运算。

有些场景中,我们需要每隔一段时间,统计过去某个时间段内的数据。比如,对热点搜索词语进行统计,每隔10秒钟输出过去60秒内排名前十位的热点词。这是流处理的一个基本应用场景,很多流处理框架如Apache Flink都有原生的支持。所以,Spark也同样支持滑动窗口操作。

从统计热点词这个例子,你可以看出滑动窗口操作有两个基本参数:

  • 窗口长度(window length):每次统计的数据的时间跨度,在例子中是60秒;
  • 滑动间隔(sliding interval):每次统计的时间间隔,在例子中是10秒。

显然,由于Spark Streaming流处理的最小时间单位就是StreamingContext的时间间隔,所以这两个参数一定是它的整数倍。

最基本的滑动窗口操作是window,它可以返回一个新的DStream,这个DStream中每个RDD代表一段时间窗口内的数据,如下例所示。

windowed_words = words.window(60, 10)

windowed_words代表的就是热词统计例子中我们所需的DStream,即它里边每一个数据块都包含过去60秒内的词语,而且这样的块每10秒钟就会生成一个。

此外,Spark Streaming还支持一些“进阶”窗口操作。如countByWindow、reduceByWindow、reduceByKeyAndWindow和countByValueAndWindow,在此不做深入讨论。

Spark Streaming的优缺点

讲了这么多Spark Streaming,不管内部实现也好,支持的API也好,我们还并不明白它的优势是什么,相比起其他流处理框架的缺点是什么。只有明白了这些,才能帮助我们在实际工作中决定是否使用Spark Streaming。

首先,Spark Streaming的优点很明显,由于它的底层是基于RDD实现的,所以RDD的优良特性在它这里都有体现。

比如,数据容错性,如果RDD 的某些分区丢失了,可以通过依赖信息重新计算恢复。

再比如运行速度,DStream同样也能通过persist()方法将数据流存放在内存中。这样做的好处是遇到需要多次迭代计算的程序时,速度优势十分明显。

而且,Spark Streaming是Spark生态的一部分。所以,它可以和Spark的核心引擎、Spark SQL、MLlib等无缝衔接。换句话说,对实时处理出来的中间数据,我们可以立即在程序中无缝进行批处理、交互式查询等操作。这个特点大大增强了Spark Streaming的优势和功能,使得基于Spark Streaming的应用程序很容易扩展。

而Spark Streaming的主要缺点是实时计算延迟较高,一般在秒的级别。这是由于Spark Streaming不支持太小的批处理的时间间隔。

在第二章中,我们讲过准实时和实时系统,无疑Spark Streaming是一个准实时系统。别的流处理框架,如Storm的延迟性就好很多,可以做到毫秒级。

小结

Spark Streaming,作为Spark中的流处理组件,把连续的流数据按时间间隔划分为一个个数据块,然后对每个数据块分别进行批处理。

在内部,每个数据块就是一个RDD,所以Spark Streaming有RDD的所有优点,处理速度快,数据容错性好,支持高度并行计算。

但是,它的实时延迟相比起别的流处理框架比较高。在实际工作中,我们还是要具体情况具体分析,选择正确的处理框架。

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

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

相关文章

20 个超实用 CTF 练习平台,让你从菜鸟进阶大神!零基础入门到精通,看这篇就够!

在网络安全领域,CTF(Capture The Flag)和渗透测试是每个技术爱好者梦寐以求的技能。但很多人会问:“我该怎么入门?去哪里练习?” 别急,今天我们就为大家整理了20个超实用的CTF和渗透测试练习平台…

亲测好用专科生必看TOP9AI论文平台测评

亲测好用专科生必看TOP9AI论文平台测评 专科生专属AI论文平台测评:选对工具事半功倍 随着AI技术在学术领域的广泛应用,越来越多的专科生开始借助智能写作工具提升论文效率。然而,面对市场上五花八门的AI论文平台,如何选择真正适合…

基于STM32F407设计的汽车仪表系统

摘 要 当前,随着科技的发展,汽车功能的日益增多,汽车仪表系统也变得愈发多元化。传统的机械式指针仪表因为其繁琐的布线方式和点对点的通信方式,已不能满足当前行业的需求。因此,研究一款功能多样,结构简单…

COMSOL玩转锂枝晶:四种生长模式实操指南

comsol锂枝晶模型 四合一 1雪花枝晶 2单点形核 3多点形核 4形状形核 包含相场、浓度场和电场三种物理场(雪花枝晶除外),其中单枝晶定向生长另外包含对应的参考文献。锂枝晶模拟可不止调参画图这么简单,今天咱们用COMSOL实现四种典…

收藏这份AI客服构建指南:有赞从0到1的实践经验与思考

有赞分享了AI客服系统从0到1的完整实践历程。项目始于黑客马拉松,初期选用Dify平台快速验证,后采用混合架构应对性能挑战。文章详细阐述了模型选择、Workflow设计、上下文管理、知识工程等关键技术环节,并分享了评测优化和协作管理的经验。核…

网络安全小白自学指南:不用拜师学艺,求人不如靠自己

前言: 趁着今天下班,我花了几个小时整理了下,非常不易,希望大家可以点赞收藏支持一波,谢谢。 我的经历: 我19年毕业,大学专业是物联网工程,我相信很多人在象牙塔里都很迷茫&…

建议收藏:大模型时代程序员新机遇:6大高薪岗位技能要求全解析

文章详细解析了程序员转行大模型的6大方向:NLP工程师、计算机视觉工程师、大模型算法工程师、部署工程师和产品经理。每个方向都阐述了其市场前景和具体技能要求,包括编程能力、数学基础、专业知识和实践经验。文章强调,程序员应根据自身兴趣…

全网最全8个AI论文写作软件,助你轻松搞定本科毕业论文!

全网最全8个AI论文写作软件,助你轻松搞定本科毕业论文! AI 工具,让论文写作不再焦虑 在当前的学术环境中,越来越多的本科生开始借助 AI 工具来辅助论文写作。这些工具不仅能够帮助学生快速生成内容,还能有效降低 AIGC&…

【零基础必学】LangChain+PDF RAG系统实战教程:手把手教你从零搭建可收藏的智能知识库

本文详细介绍如何使用LangChain框架结合Streamlit前端,从零构建基于PDF文档的RAG知识库系统。系统支持多PDF上传,自动完成文本提取、分块、向量化,构建FAISS检索数据库,用户可基于上传文档内容提问,系统调用DeepSeek模…

使用安全版数据库开启ssl加密后jdbc写法

文章目录文档用途详细信息文档用途 本文用于指导使用安全版数据库开启ssl加密后jdbc连接串写法。 默认写法会提示拒绝ssl连接,虽然可以通过关闭ssl等方法解决,但是在等保测评和数据库安全上会有隐患。 详细信息 jdbc写法如下: jdbc.urlj…

Claude Skills深度解析:大模型智能体架构与Gemini 3对比分析

Claude Skills是智能体可动态加载的"能力模块",包含逻辑与执行脚本;Agent SDK是智能体的"操作系统",提供运行环境。与Gemini 3相比,两者功能相似但实现路径不同,Anthropic采用模块化"渐进式披…

【收藏】2026年AI大模型最全学习资源包,助力Java开发者转型AI高薪岗

本文提供2026年AI大模型全面学习资源包,涵盖系统学习路线图、GeekAGI知识库、1200AI工具与框架、主流应用教程、开源项目案例、300道大厂面试真题及行业研究报告。资源由资深AI专家精心整理,适配初学者入门及进阶开发者提升,扫码即可免费获取…

大模型产品经理成长全攻略:零基础到精通的完整路径_大模型产品经理学习路线

本文详细介绍了大模型产品经理的五大学习阶段:基础知识、大模型技术、产品管理、实战经验和持续提升。文章指出大模型行业岗位缺口47万,初级工程师平均薪资28K,提供90天四阶段学习计划(初阶应用、高阶应用、模型训练、商业闭环&am…

大模型必备:LLM工具调用技术演进(Function Call→MCP→Agent Skills),建议收藏

LLM工具调用历经从Function Call到MCP再到Agent Skills的演进。Function Call解决了可靠性,MCP解决了标准化问题,而Agent Skills则提供轻量化、可组合的专业能力模块,解决LLM专业领域技能匮乏问题。Skills与MCP协同工作,Skills负责…

KNN算法详解

KNN算法 KNN算法简介 【理解】KNN算法思想 K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别KNN算法思想:如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别&…

手把手AI论文工具全攻略:9款神器精准控率无压力操作指南

同学们,还在为论文发愁吗?从开题报告到文献综述,从数据分析到格式排版,每一步都感觉压力山大?别担心,AI时代已经为我们送来了强大的“学术神器”。今天,我将化身你的专属论文助教,为…

卡尔曼滤波做轨迹跟踪 鲁棒卡尔曼滤波做野值剔除后的预测 扩展卡尔曼滤波对GPS数据进行状态估计滤波

卡尔曼滤波做轨迹跟踪 鲁棒卡尔曼滤波做野值剔除后的预测 扩展卡尔曼滤波对GPS数据进行状态估计滤波 轨迹跟踪这活儿听起来玄乎,其实咱们每天都在用——手机导航里那个蓝色小圆点,背后八成藏着卡尔曼滤波的数学魔法。今天咱们扯点实在的,用P…

2026年PLC厂家推荐:2026年度权威评测与市场格局排名解析

摘要 在工业4.0与智能制造转型的宏观趋势下,可编程逻辑控制器作为自动化系统的“大脑”,其选型决策直接关系到生产线的可靠性、灵活性与长期数字化升级潜力。当前,企业决策者面临的核心焦虑在于:如何在技术路线日趋多元、开放与封…

国外学术论文怎么找:实用检索技巧与资源平台推荐

刚开始做科研的时候,我一直以为: 文献检索就是在知网、Google Scholar 里反复换关键词。 直到后来才意识到,真正消耗精力的不是“搜不到”,而是—— 你根本不知道最近这个领域发生了什么。 生成式 AI 出现之后,学术检…

langchain 使用 MessagesPlaceholder 实现会话上下文

第一步:创建带历史消息占位符的提示词模板from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderprompt ChatPromptTemplate.from_messages([SystemMessage(content"你是3DM的一个技术专家,擅长解决各种Web开发中的技术问题…