Apache spark 为什么对Spark Streaming micro batch(当使用kafka作为源时)有这么多批评?
既然任何卡夫卡消费者实际上都是成批消费,那么为什么会有那么多关于Spark Streaming micro batch(当使用卡夫卡作为其来源时)的批评,例如,与卡夫卡Streams(将自身营销为真正的流媒体)相比 我的意思是:很多批评都围绕着Spark Streaming微批处理体系结构。通常,人们会说卡夫卡流是一个真正的“实时”工具,因为它一个接一个地处理事件 它确实一个接一个地处理事件,但据我所知,它使用(几乎与其他所有库/框架一样)消费者API。消费者API成批轮询主题,以减少网络负担(间隔是可配置的)。因此,消费者会采取如下措施:Apache spark 为什么对Spark Streaming micro batch(当使用kafka作为源时)有这么多批评?,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,既然任何卡夫卡消费者实际上都是成批消费,那么为什么会有那么多关于Spark Streaming micro batch(当使用卡夫卡作为其来源时)的批评,例如,与卡夫卡Streams(将自身营销为真正的流媒体)相比 我的意思是:很多批评都围绕着Spark Streaming微批处理体系结构。通常,人们会说卡夫卡流是一个真正的“实时”工具,因为它一个接一个地处理事件 它确实一个接一个地处理事件,但据我所知,它使用(几乎与其他所有库/框架一样)消费者API。消费者API成批轮询主题,以减少网络负担(
while(true){
ConsumerRecords记录=consumer.poll(100);
/////处理**批**记录
对于(消费者记录:记录){
/////流程**一个接一个**
}
}
因此,尽管说Spark是正确的:
感谢这件事中的每一条信息。免责声明:我参与了Apache Storm(这是一个众所周知的流式框架,处理“逐记录”,尽管也有trident API),现在参与了Apache Spark(“微批处理”) 流媒体技术的主要关注点之一是“吞吐量与延迟”。从延迟的角度来看,“一个记录一个记录”处理显然是一个赢家,但“一个接一个地做每件事”的成本是巨大的,每一件小事都会成为巨大的开销。(假设系统的目标是每秒处理100万条记录,那么处理上的任何额外开销都会被复用100万条。)实际上,也有相反的批评,“按记录读取”的吞吐量比“微批处理”的吞吐量差。为了解决这一问题,流式框架在其“内部”逻辑中添加了批处理,但在某种程度上减少了对延迟的影响。(如配置批的大小,以及强制刷新批的超时) 我认为这两者之间的主要区别在于任务是否“连续”运行,以及它们是否构成“管道” 在流式框架中,当应用程序启动时,所有必要的任务都会进行物理规划并一起启动,除非应用程序终止,否则它们永远不会终止。源任务不断地将记录推送到下游任务,下游任务处理记录并推送到下一个下游任务。这是以管道方式完成的。Source不会停止推送记录,除非没有可推送的记录。(有背压和分布式检查点,但让我们把细节放在一边,重点放在概念上。) 在流媒体框架中,如果要进行“微批量”,则必须为每个微批量确定“批量”的边界。在Spark中,计划(例如,该批次将从源和流程中读取多少记录)通常由驾驶员端完成,任务是基于所决定的批次进行物理计划的。这种方法为最终用户提供了一个重要的任务——批处理的“适当”大小是多少,以实现他们目标的吞吐量/延迟。太小的批次会导致糟糕的吞吐量,因为规划批次需要非常高的成本(很大程度上取决于来源)。批量过大会导致延迟变差。此外,“阶段”的概念适用于批处理工作负载(我看到Flink在批处理工作负载中采用了阶段),而不适用于流式工作负载,因为这意味着一些任务应该等待其他任务的“完成”,而不是管道 当然,我不认为这样的批评意味着微批量“无法使用”。当您的实际工作负载能够承受几分钟(甚至几十分钟)的延迟时,您真的需要担心延迟吗?可能不会。你会想关注学习曲线的成本(很可能是Spark only vs Spark&other,但Kafka stream only或Flink only肯定是可能的)和维护成本。此外,如果您有一个需要聚合的工作负载(可能是通过窗口),那么来自框架的延迟限制就不那么重要了,因为您可能会将窗口大小设置为分钟/小时 微批处理也有好处——如果存在大量空闲,运行空闲任务的资源就会被浪费,这适用于“记录到记录”流式框架。它还允许对特定的微批次执行流式处理无法执行的批处理操作。(尽管您应该记住,它只适用于“当前”批次。) 我认为没有什么灵丹妙药——Spark一直在领导“批处理工作负载”,因为它最初是用来处理MapReduce的问题的,因此总体架构针对批处理工作负载进行了优化。其他流式框架从“流式原生”开始,因此在流式工作负载上应该具有优势,但在批处理工作负载上则不太理想。统一批处理和流式处理是一种新趋势,有时一个(或几个)框架可能会在两种工作负载上都提供最佳性能,但我不确定现在是时候了 编辑:如果您的工作负载目标是“端到端恰好一次”,则延迟将绑定到