Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么对Spark Streaming micro batch(当使用kafka作为源时)有这么多批评?_Apache Spark_Spark Structured Streaming - Fatal编程技术网

Apache spark 为什么对Spark Streaming micro batch(当使用kafka作为源时)有这么多批评?

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成批轮询主题,以减少网络负担(

既然任何卡夫卡消费者实际上都是成批消费,那么为什么会有那么多关于Spark Streaming micro batch(当使用卡夫卡作为其来源时)的批评,例如,与卡夫卡Streams(将自身营销为真正的流媒体)相比

我的意思是:很多批评都围绕着Spark Streaming微批处理体系结构。通常,人们会说卡夫卡流是一个真正的“实时”工具,因为它一个接一个地处理事件

它确实一个接一个地处理事件,但据我所知,它使用(几乎与其他所有库/框架一样)消费者API。消费者API成批轮询主题,以减少网络负担(间隔是可配置的)。因此,消费者会采取如下措施:

while(true){
ConsumerRecords记录=consumer.poll(100);
/////处理**批**记录
对于(消费者记录:记录){
/////流程**一个接一个**
}
}
因此,尽管说Spark是正确的:

  • 由于其微批量最小间隔将延迟限制为最多100 ms,因此可能具有更高的延迟(请参阅Spark Structured Streaming DOCs)
  • 分组处理记录(作为RDD的数据流或结构化流中的数据帧)
  • 但是:

  • 可以通过RDD/行在Spark-just循环中逐个处理记录
  • 卡夫卡流实际上是对成批记录进行轮询,但会逐一处理,因为它在后台实现了消费者API
  • 我要澄清的是,我不是从“粉丝方面”提问(因此,这是一个观点问题),相反,我真的在尝试从技术上理解它,以便理解流媒体生态系统中的语义


    感谢这件事中的每一条信息。

    免责声明:我参与了Apache Storm(这是一个众所周知的流式框架,处理“逐记录”,尽管也有trident API),现在参与了Apache Spark(“微批处理”)

    流媒体技术的主要关注点之一是“吞吐量与延迟”。从延迟的角度来看,“一个记录一个记录”处理显然是一个赢家,但“一个接一个地做每件事”的成本是巨大的,每一件小事都会成为巨大的开销。(假设系统的目标是每秒处理100万条记录,那么处理上的任何额外开销都会被复用100万条。)实际上,也有相反的批评,“按记录读取”的吞吐量比“微批处理”的吞吐量差。为了解决这一问题,流式框架在其“内部”逻辑中添加了批处理,但在某种程度上减少了对延迟的影响。(如配置批的大小,以及强制刷新批的超时)

    我认为这两者之间的主要区别在于任务是否“连续”运行,以及它们是否构成“管道”

    在流式框架中,当应用程序启动时,所有必要的任务都会进行物理规划并一起启动,除非应用程序终止,否则它们永远不会终止。源任务不断地将记录推送到下游任务,下游任务处理记录并推送到下一个下游任务。这是以管道方式完成的。Source不会停止推送记录,除非没有可推送的记录。(有背压和分布式检查点,但让我们把细节放在一边,重点放在概念上。)

    在流媒体框架中,如果要进行“微批量”,则必须为每个微批量确定“批量”的边界。在Spark中,计划(例如,该批次将从源和流程中读取多少记录)通常由驾驶员端完成,任务是基于所决定的批次进行物理计划的。这种方法为最终用户提供了一个重要的任务——批处理的“适当”大小是多少,以实现他们目标的吞吐量/延迟。太小的批次会导致糟糕的吞吐量,因为规划批次需要非常高的成本(很大程度上取决于来源)。批量过大会导致延迟变差。此外,“阶段”的概念适用于批处理工作负载(我看到Flink在批处理工作负载中采用了阶段),而不适用于流式工作负载,因为这意味着一些任务应该等待其他任务的“完成”,而不是管道

    当然,我不认为这样的批评意味着微批量“无法使用”。当您的实际工作负载能够承受几分钟(甚至几十分钟)的延迟时,您真的需要担心延迟吗?可能不会。你会想关注学习曲线的成本(很可能是Spark only vs Spark&other,但Kafka stream only或Flink only肯定是可能的)和维护成本。此外,如果您有一个需要聚合的工作负载(可能是通过窗口),那么来自框架的延迟限制就不那么重要了,因为您可能会将窗口大小设置为分钟/小时

    微批处理也有好处——如果存在大量空闲,运行空闲任务的资源就会被浪费,这适用于“记录到记录”流式框架。它还允许对特定的微批次执行流式处理无法执行的批处理操作。(尽管您应该记住,它只适用于“当前”批次。)

    我认为没有什么灵丹妙药——Spark一直在领导“批处理工作负载”,因为它最初是用来处理MapReduce的问题的,因此总体架构针对批处理工作负载进行了优化。其他流式框架从“流式原生”开始,因此在流式工作负载上应该具有优势,但在批处理工作负载上则不太理想。统一批处理和流式处理是一种新趋势,有时一个(或几个)框架可能会在两种工作负载上都提供最佳性能,但我不确定现在是时候了

    编辑:如果您的工作负载目标是“端到端恰好一次”,则延迟将绑定到