Storm,Spark和Flink简介 联系与区别

vllm continue batching 核心一句话:传统推理里的 batch 通常是一个补齐后的二维矩阵[B, L_max];vLLM 的 continuous batchingbatch 改造成“每一轮 GPU forward 临时拼出来的一批 token”。限制本轮有多少条序列参与,限制本轮实际喂给模型多少个 token。它们就是 continuous batching 调度器的两个方向盘。 阅读详情

storm、spark streaming、flink是三个最著名的分布式流处理框架,并且都是开源的分布式系统,具有低延迟、可扩展和容错性诸多优点,允许你在运行数据流代码时,将任务分配到一系列具有容错能力的计算机上并行运行,都提供了简单的API来简化底层实现的复杂程度。

1、Apache Storm

   Storm是一个免费并开源的分布式实时计算系统。利用Storm可以很容易做到可靠地处理无限的数据流,像Hadoop批量处理大数据一样,Storm可以实时处理数据。

Storm 很简单,可用于任意编程语言。Apache Storm 采用 Clojure 开发。Storm 有很多应用场景,包括实时数据分析、联机学习、持续计算、分布式 RPC、ETL 等。

主节点 nimbus  从节点 supervisor

用户提交作业给nimbus, nimbus把任务分配给supervisor,这些提交的任务就是topology(拓扑)

运行的作业分为两种 spout 和 bolt。

Storm是流式的处理既stream,stream的内容是tuple(元组)

Spout生产tuple(元组)发送给bolt处理,bolt处理过的tuple也可以再次发送给其他的tuple处理,最后存入容器。

  • Nimbus

Storm集群的Master节点,负责分发用户代码,指派给具体的Supervisor节点上的Worker节点,去运行Topology对应的组件

  • Supervisor

Storm集群的从节点,负责管理运行在Supervisor节点上的每一个Worker进程的启动和终止。

  • Worker

运行具体处理组件逻辑的进程。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。

  • Task

worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。

  • ZooKeeper

用来协调Nimbus和Supervisor,如果Supervisor因故障出现问题而无法运行Topology,Nimbus会第一时间感知到,并重新分配Topology到其它可用的Supervisor上运行

  • Topology

Storm中运行的一个实时应用程序的名称。将 Spout、 Bolt整合起来的拓扑图。定义了 Spout和 Bolt的结合关系、并发数量、配置等等。

  •  Spout

在一个topology中获取源数据流的组件。通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。

  •  Bolt

接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。

  •  Tuple

一次消息传递的基本单元,理解为一组消息就是一个Tuple。

  •  Stream

Tuple的集合。表示数据的流向。

Storm处理的是每次传入的一个事件,并且Storm处理一个事件是可以达到亚秒级的。在Storm中,当每条单独的记录通过系统时必须被跟踪,所以Storm能够至少保证每条记录将被处理一次,但是在从错误中恢复过来时候允许出现重复记录,这意味着可变状态可能不正确地被更新两次。

2、Spark Streaming

Spark流是对于Spark核心API的拓展,从而支持对于实时数据流的可拓展,高吞吐量和容错性流处理。数据可以由多个源取得,例如:Kafka,Flume,Twitter,ZeroMQ,Kinesis或者TCP接口,同时可以使用由如map,reduce,join和window这样的高层接口描述的复杂算法进行处理。最终,处理过的数据可以被推送到文件系统,数据库和HDFS。Spark Streaming是一个粗粒度的框架【也就是只能对一批数据指定处理方法】,核心是采用微批次(Mcro-batch)架构。和Storm采用的以条处理的不同。

Spark Streaming会运行接收器来不断的接收输入的数据流,然后根据程序配置的时间,将时间范围内的所有数据打成一个RDD,发送给Spark Core去进行处理。依次来打成对数据流的计算。在saprkStreaming中,如果入水口的速度大于出水口的速度,那么势必导致水管爆裂,Spark Streaming也存在这个问题,内部采用背压机制来进行处理,会通过ReceiverRateController来不断计算RDD的处理速度和RDD的生成速度,来通过令牌桶机制进行速度控制。只要是控制令牌的生成周期。

Spark Streaming 运行时的角色(standalone 模式)主要有:

  • Master:主要负责整体集群资源的管理和应用程序调度;

  • Worker:负责单个节点的资源管理,driver 和 executor 的启动等;

  • Driver:用户入口程序执行的地方,即 SparkContext 执行的地方,主要是 DAG 生成、stage 划分、task 生成及调度;

  • Executor:负责执行 task,反馈执行状态和执行结果。

对于编码完成的 Spark Core 任务在生成到最终执行结束主要包括以下几个部分:

  • 构建 DGA 图;

  • 划分 stage;

  • 生成 taskset;

  • 调度 task。

3、Flink

Flink是原生的流处理系统,提供high level的API。Flink也提供 API来像Spark一样进行批处理,但两者处理的基础是完全不同的。Flink把批处理当作流处理中的一种特殊情况。在Flink中,所有 的数据都看作流,是一种很好的抽象,因为这更接近于现实世界。

Flink系统的架构与Spark类似,是一个基于Master-Slave风格的架构。

当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给 JobManager, JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。 TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。

 

Client 为提交 Job 的客户端,可以是运行在任何机器上(与 JobManager 环境连通即可)。提交 Job 后,Client 可以结束进程 (Streaming的任务),也可以不结束并等待结果返回。

 

JobManager 主要负责调度 Job 并协调 Task 做 checkpoint,职责上很像 Storm 的 Nimbus。从 Client 处接收到 Job 和 JAR 包 等资源后,会生成优化后的执行计划,并以 Task 的单元调度到各个 TaskManager 去执行。

 

TaskManager 在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。从 JobManager 处接收需要 部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。

 

JobManager

JobManager是Flink系统的协调者,它负责接收Flink Job,调度组成Job的多个Task的执行。同时,JobManager还负责收集Job 的状态信息,并管理Flink集群中从节点TaskManager。JobManager所负责的各项管理功能,它接收到并处理的事件主要包括:

 

RegisterTaskManager

在Flink集群启动的时候,TaskManager会向JobManager注册,如果注册成功,则JobManager会向TaskManager回复消息 AcknowledgeRegistration。

 

SubmitJob

Flink程序内部通过Client向JobManager提交Flink Job,其中在消息SubmitJob中以JobGraph形式描述了Job的基本信息。

 

CancelJob

请求取消一个Flink Job的执行,CancelJob消息中包含了Job的ID,如果成功则返回消息CancellationSuccess,失败则返回消息 CancellationFailure。

 

UpdateTaskExecutionState

TaskManager会向JobManager请求更新ExecutionGraph中的ExecutionVertex的状态信息,更新成功则返回true。

 

RequestNextInputSplit

运行在TaskManager上面的Task,请求获取下一个要处理的输入Split,成功则返回NextInputSplit。

 

JobStatusChanged

ExecutionGraph向JobManager发送该消息,用来表示Flink Job的状态发生的变化,例如:RUNNING、CANCELING、 FINISHED等。

 

TaskManager

TaskManager也是一个Actor,它是实际负责执行计算的Worker,在其上执行Flink Job的一组Task。每个TaskManager负责管理 其所在节点上的资源信息,如内存、磁盘、网络,在启动的时候将资源的状态向JobManager汇报。TaskManager端可以分成两个 阶段:

 

注册阶段

TaskManager会向JobManager注册,发送RegisterTaskManager消息,等待JobManager返回AcknowledgeRegistration,然 后TaskManager就可以进行初始化过程。

 

可操作阶段

该阶段TaskManager可以接收并处理与Task有关的消息,如SubmitTask、CancelTask、FailTask。如果TaskManager无法连接 到JobManager,这是TaskManager就失去了与JobManager的联系,会自动进入“注册阶段”,只有完成注册才能继续处理Task 相关的消息。

 

Client

当用户提交一个Flink程序时,会首先创建一个Client,该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处 理,所以Client需要从用户提交的Flink程序配置中获取JobManager的地址,并建立到JobManager的连接,将Flink Job提交给 JobManager。Client会将用户提交的Flink程序组装一个JobGraph, 并且是以JobGraph的形式提交的。一个JobGraph是一个 Flink Dataflow,它由多个JobVertex组成的DAG。其中,一个JobGraph包含了一个Flink程序的如下信息:JobID、Job名称、配 置信息、一组JobVertex等。

在基于Yarn层面的架构上,

基于yarn层面的架构类似spark on yarn模式,都是由Client提交App到RM上面去运行,然后RM分配第一个container去运行 AM,然后由AM去负责资源的监督和管理。需要说明的是,Flink的yarn模式更加类似spark on yarn的cluster模式,在cluster模式 中,dirver将作为AM中的一个线程去运行,在Flink on yarn模式也是会将JobManager启动在container里面,去做个driver类似 的task调度和分配,YARN AM与Flink JobManager在同一个Container中,这样AM可以知道Flink JobManager的地址,从而 AM可以申请Container去启动Flink TaskManager。待Flink成功运行在YARN集群上,Flink YARN Client就可以提交Flink Job到 Flink JobManager,并进行后续的映射、调度和计算处理。

Flink有高吞吐 & 低延迟、支持 Event Time 和乱序事件、状态计算的 exactly-once 语义、高度灵活的流式窗口、带反压的连续流模型、容错性、内存管理、迭代和增量迭代等特性和优点。

 

4、三者对比

如果你想要的是一个允许增量计算的高速事件处理系统,Storm会是最佳选择。

如果你必须有状态的计算,恰好一次的递送,并且不介意高延迟的话,那么可以考虑Spark Streaming,特别如果你还计划图形操作、机器学习或者访问SQL的话,Apache Spark的stack允许你将一些library与数据流相结合(Spark SQL,Mllib,GraphX),它们会提供便捷的一体化编程模型。尤其是数据流算法(例如:K均值流媒体)允许Spark实时决策的促进。


Flink支持增量迭代,具有对迭代自动优化的功能,在迭代式数据处理上,比Spark更突出,Flink基于每个事件一行一行地流式处理,真正的流式计算,流式计算跟Storm性能差不多,支持毫秒级计算,而Spark则只能支持秒级计算。

 

LLM推理性能优化:深入理解Prefill与Decode阶段及KV-Cache 在大型语言模型(LLM)推理过程中,Prefill(预填充)和Decode(解码)是两个核心且性能特征迥异的阶段。Prefill阶段负责处理完整的输入提示,其计算复杂度与序列长度的平方成正比,属于计算密集型操作,主要瓶颈在于GPU的算力。而Decode阶段则负责自回归地生成输出词元,其性能高度依赖内存带宽,属于内存密集型操作。理解这两阶段的差异对于优化LLM应用至关重要,例如在聊天机器人或RAG系统中,能帮助精准定位性能瓶颈。KV-Cache作为连接两阶段的关键技术,通过缓存注意力机制中的Key和Value 阅读详情

相关推荐

从Static BatchingChunked-Prefills:大模型推理调度演进史(含性能对比图)

本文系统梳理了大模型推理调度从Static Batching到Continuous Batching,再到Chunked-Prefills的演进历程。重点剖析了Chunked-Prefills分块预填充机制如何通过将长提示词计算切块并穿插调度,有效解决预填充阶段对解码阶段的干扰问题,从而在保障高吞吐的同时实现更稳定、更低的Token间延迟,为优化线上服务成本与性能提供了关键技术路径。

qsc90123456的博客 185

Static Batching、Continuous BatchingChunked Prefill Batching

本文总结了推理引擎请求调度策略演进过程。从最早的静态批处理(存在资源浪费)到连续批处理(减少资源浪费但增加延迟),再到最新的分块预填充批处理(将prompt分块处理,同时执行解码和预填充)。重点介绍了vLLM的实现方式:每个推理周期混合处理256个解码token和1792个预填充token,通过分块处理prompt来提高GPU利用率,平衡TTFT和TPOT延迟。这些调度策略演进显著提升了推理引擎的性能和资源利用率。

码上的艺术 214

汇总药用数据库(Pubchem,bingdingDB,Chembl,ExcapeDB)数据

记载一下如何汇总4大数据库的数据

recher_He1107的博客 3368

大模型推理批处理全解析:从静态到连续批处理的调度演进

在大模型推理服务中,批处理是影响GPU利用率与单位Token成本的核心机制。静态批处理、动态批处理与连续批处理分别代表请求级到迭代级调度的演进静态批处理将请求攒成固定批次,存在padding与长序列拖尾问题;动态批处理通过队列与超时触发攒批,但仍以整批为调度单位;连续批处理则在每个decode step动态调整批次,短请求及时退出、新请求即时补入,大幅提升吞吐并降低延迟。理解这些差异,能帮助开发者根据业务形态选择合适的推理框架,如vLLM、TensorRT-LLM等,并合理配置KV cache与显存参数,

weixin_34234721的博客 275

批处理与动态批策略:Static、Dynamic、Continuous Batching 与 LLM Serving 调度(分层式精讲)

批处理与动态批策略的核心不是找到一个万能 batch size,而是让系统在真实负载下稳定地产生有效吞吐。先定义 SLO-> 再分析 prompt/output 长度和到达率-> 再设置 token budget、queue delay、KV block 策略-> 再决定静态批、动态批、连续批或 cache-aware batching-> 最后用 goodput、p99、OOM、fairness 做验收。

AI浩 510

LLM推理性能优化:三种Batching策略原理与实战对比

在LLM推理服务中,批处理策略是决定GPU利用率与吞吐量的关键因素。静态批处理、动态批处理与连续批处理分别代表从粗粒度到细粒度的调度演进:从固定整批同步,到窗口内成批执行,再到按token级别动态插入和释放序列。连续批处理能有效减少显存空洞,提升高并发场景下的资源效率,已被vLLM、TensorRT-LLM等主流框架广泛采用。理解不同策略对KV cache、请求排队和延迟的影响,有助于在实际的RAG、Agent及本地部署中快速定位性能瓶颈。本文梳理三种策略的原理与调度过程,结合显存观察方法和并发基准测试,为

weixin_34245749的博客 414

大模型推理优化:Chunked Prefill技术原理与Nano-vLLM源码解析

在大语言模型推理中,KV Cache是存储注意力机制中键值对的核心数据结构,用于加速自回归生成。其原理是在Prefill阶段为提示词序列生成并缓存键值对,Decode阶段直接复用,避免重复计算。这项技术的核心价值在于显著降低推理延迟和计算开销。然而,长序列提示词会导致KV Cache显存占用激增,引发内存不足和推理卡顿。Chunked Prefill技术通过将长序列分块处理,增量构建KV Cache,有效控制了显存峰值。该技术已集成于vLLM、LightLLM等高性能推理框架,并在Nano-vLLM中通过极

weixin_30542079的博客 386

第16篇-Continuous-Batching与调度优化

GPU 的并行计算能力极强,处理一个请求和处理多个请求的计算开销差异不大(只要不超出显存和算力)。因此,推理引擎会将多个请求组成一个批次(Batch),一次性送入 GPU 计算,分摊固定的调度开销,提升整体吞吐量。这种"攒一批一起算"的策略就是批处理(Batching)。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;细化调度粒度解决阶段冲突。

m0_68987304的博客 454

大模型推理连续批处理:动态 Batching 与调度算法的工程深潜

大模型推理服务的效率瓶颈不在单个请求的处理速度,而在于如何让 GPU 在高并发下保持高利用率。连续批处理(Continuous Batching)是 vLLM、TGI、TensorRT-LLM 等推理引擎的核心技术,它通过动态调度实现了请求级别的弹性批处理,将吞吐量提升数倍至数十倍。

yonggeit的博客 64

LLM推理批处理机制详解:静态、动态与连续批处理的选型与调优

批处理是提升深度学习推理性能的核心手段,尤其在LLM(大语言模型)推理场景中,GPU利用率和延迟表现直接取决于批处理策略的选择。LLM解码阶段受显存带宽制约,单请求推理时计算单元大量空闲,而通过合理的批处理将多个请求合并,可显著提升吞吐。静态批处理实现简单但存在木桶效应和padding浪费;动态批处理通过队列调度改善批次间等待,但无法解决批次内慢请求拖累问题;连续批处理(迭代级调度)在每一轮解码动态调整请求集合,成为生产级推理服务的优选。理解三种机制的原理、代价与适用场景,有助于在vLLM、TensorRT

weixin_34224941的博客 362

LLM推理优化:深入理解Prefill与Decode阶段的核心差异与性能调优

在大语言模型(LLM)推理过程中,Prefill(预填充)和Decode(解码)是两个关键的计算阶段,直接影响模型的推理效率与资源消耗。Prefill阶段负责并行处理整个输入提示词,计算复杂度与提示词长度的平方相关,属于计算密集型任务,主要生成并存储KV Cache。Decode阶段则逐个生成输出词元,计算复杂度与已生成序列长度线性相关,属于内存带宽密集型任务,需要频繁读取和扩展KV Cache。理解这两个阶段对于优化LLM推理服务至关重要,尤其是在处理长提示词和高并发请求时。在实际应用中,通过监控GPU利

weixin_30785593的博客 390

Continuous Batching:让 GPU 一刻不停

文章摘要: 本文分析了静态批处理(Static Batching)在LLM推理中的核心问题——因请求长度差异导致GPU利用率骤降,并提出动态批处理(Continuous Batching)的解决方案。静态批处理因需等待所有请求完成,造成短请求空等资源浪费,而动态批通过迭代级调度实现请求的实时进出,类比"回转寿司"模式。文章详细拆解了调度循环机制,指出Prefill与Decode阶段的计算特性差异是工程难点,并介绍Chunked Prefill等技术实现混合调度,最后对比了vLLM、SGLang等框架的不同实

Briwisdom的博客 385

Attention机制背后的时空博弈:KV Cache与Continuous Batching的协同进化论

本文深入探讨了KV Cache与Continuous Batching在大模型推理中的协同优化策略,揭示了它们在时间和空间维度上的博弈关系。通过分析Attention机制的计算本质,展示了KV Cache如何以空间换时间提升效率,以及Continuous Batching如何动态重组资源优化性能。文章还提供了实践中的工程挑战解决方案和未来演进方向,为性能优化提供了重要参考。

mac99的博客 890

LLM Serving 为什么越做越像操作系统:Continuous Batching、KV Cache 与请求调度系统拆解

如果说训练系统的核心资源常常是参数、梯度和优化器状态,那么推理系统的核心资源往往就是 KV Cache。输入不同长度请求流设计一个简单调度器模拟静态 batch 和 continuous batching统计平均延迟、吞吐、资源利用率调度策略会直接改变系统形态平均值和尾延迟经常不是一个方向看似简单的“插队”会影响公平性这类实验特别适合写进简历或面试项目里,因为它能体现你不是只会调用框架,而是理解系统本质。LLM Serving 的关键难点,从来都不只是“模型推理得够快”,而是。

qq_37854244的博客 371

Prefill提速:如何将长上下文首Token延迟降低47倍

大模型推理性能优化,业内常聚焦于Token生成阶段的解码速度,却往往忽视用户感知最强烈的首Token延迟。在RAG检索增强、Agent多轮记忆等长上下文应用中,输入序列动辄数万Token,此时推理瓶颈已从逐字生成的Decode阶段转移至一次性计算整个Prompt的Prefill阶段。Prefill作为Transformer推理的必经步骤,其计算量随输入长度线性增长,直接决定TTFT的高低,并影响KV Cache的显存占用与调度效率。针对该问题,业界已形成分块预填充、前缀缓存、上下文并行、算子融合与量化等系统

weixin_34221036的博客 418

【vLLM专栏】连续批处理与调度器:高并发下的吞吐优化策略

本文深入解析了vLLM中连续批处理与调度器的核心技术原理与实现细节。文章系统阐述了动态批处理从传统静态批处理的瓶颈突破到连续批处理的迭代级调度思想,详细分析了抢占式调度、延迟与吞吐权衡策略以及分块预填充等关键算法。通过对调度器架构设计、内存管理策略和多GPU并行调度的剖析,揭示了vLLM在高并发场景下实现10-20倍吞吐量提升的技术奥秘,为开发者提供了从原理理解到实战调优的完整指南。

m0_50709695的博客 688

连续批处理如何把推理 GPU 的空转时间填满

自回归解码会让静态批处理陷入“陪跑最慢序列”的空转。文章从推理压测中的常见现象切入,拆解连续批处理如何把调度粒度降到单步,让短请求即时退出、新请求即时补位,并说明 selective batching、PagedAttention 与 chunked prefill 的配合和取舍。

wfzgsm的专栏 331

Day46|Continuous Batching:GPU 吃满了,用户为什么还在等?

Day46|Continuous Batching:GPU 吃满了,用户为什么还在等?

weixin_57616691的博客 530

避开云端风险:私有化 AI 数字人一体机,政企线下服务新方案

<think>我们根据内容生成≤150字的摘要。需要概括核心:数据安全需求,私有化部署优势,本地知识库,交互能力,运维成本,应用前景。注意字数。</think>数字化建设中,政企选型关注数据安全。AI数字人一体机私有化部署将算力、知识库、渲染全部内置,断网可用,知识库本地管控,杜绝外泄。支持多轮对话、形象定制,运维无需持续付费,适合内网展厅、政务大厅等场景,是安全可控的稳妥选择。

yuanyuekejiSZR的博客 236

从Delta Delay到Timing Window:详解数字芯片后端时序差异的那些坑

本文深入剖析了数字芯片后端设计中,模块级与系统级时序分析结果不一致的核心原因。重点解释了Delta Delay如何导致模块级分析的乐观假设,以及Timing Window(时序窗口)差异如何通过影响串扰噪声计算,在顶层集成时引发新的时序违例,尤其是保持时间问题。文章为工程师提供了从约束建模到签核策略的系统性应对方案。

beer8的博客 463

VF1MWL1MW.zip_pscad 储能_pscad负载模型_储能 pscad_储能模型_电网 储能

这是pSCAD环境下的储能仿真模型,包含1MW的负载,对于为电网储能模型搭建有着很好的借鉴

上一篇: java网络编程与多线程
下一篇: Storm的安装
yann.bai
博客等级 码龄10年 289粉丝 102原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值