没有合适的资源?快使用搜索试试~ 我知道了~
首页KafkaStream分布式流式处理的新贵-Kafka设计解析(七)
KafkaStream分布式流式处理的新贵-Kafka设计解析(七)
1.2k 浏览量
更新于2023-05-30
评论
收藏 1.04MB PDF 举报
本文是系列文章的第4篇,第一篇"第二篇第三篇第四篇第五篇第六篇《Kafka设计解析》系列上一篇《Kafka高性能架构之道——Kafka设计解析(六)》从宏观架构到具体实现分析了Kafka实现高性能的原理。本文介绍了KafkaStream的架构和并发模型,同时分析了KafkaStream如何解决流式计算的关键问题。一般流式计算会与批量计算相比较在流式计算模型中,输入是持续的,在时间上是无界的。这也就意味着,永远拿不到全量数据集进行计算。同时,计算结果会持续输出,也即计算结果在时间上也是无界的。流式计算一般对实时性要求比较高,同时一般是先定义目标计算,然后数据到达后将计算逻辑应用于数据之上。同时为
资源详情
资源评论
资源推荐

KafkaStream分布式流式处理的新贵分布式流式处理的新贵-Kafka设计解析(七)设计解析(七)
本文是系列文章的第4篇,
第一篇 "Kafka设计解析(一)- Kafka背景及架构介绍"
第二篇 "Kafka设计解析(二)- Kafka High Availability (上)
第三篇 Kafka设计解析(三)- Kafka High Availability (中)
第四篇 Kafka设计解析(四)- Kafka High Availability (下)
第五篇 Kafka设计解析(五)- Kafka Consumer设计解析
第六篇 Kafka设计解析(六)- Kafka性能测试方法及Benchmark报告
《Kafka设计解析》系列上一篇《Kafka高性能架构之道——Kafka设计解析(六)》从宏观架构到具体实现分析了Kafka实现
高性能的原理。本文介绍了Kafka Stream的架构和并发模型,同时分析了Kafka Stream如何解决流式计算的关键问题。
什么是流式计算
一般流式计算会与批量计算相比较
在流式计算模型中,输入是持续的,在时间上是无界的。这也就意味着,永远拿不到全量数据集进行计算。同时,计算结果会
持续输出,也即计算结果在时间上也是无界的。
流式计算一般对实时性要求比较高,同时一般是先定义目标计算,然后数据到达后将计算逻辑应用于数据之上。同时为了提高
计算效率,一般尽可能(对于可合并的计算)采用增量计算代替全量计算。
批量处理模型中,一般先有全量数据集,然后将计算逻辑应用于该全量数据集。特点是全量计算,并且计算结果一次性全量输
出,在时间上是有界的。
Kafka Stream是什么
Kafka Stream是Kafka从0.10.*引入的一个新的特性。它提供了对存于Kafka内的数据进行分布式流式处理以和分析的能力。
Kafka Stream的特点如下:
除了Kafka外,不依赖于任何外部系统
Kafka Stream是一个非常简单并且轻量级的类库,可以非常方便地将它嵌入任意Java程序中,也可以任意方式进行打包以及
部署
同时提供底层的处理单元Processor(类似于Storm提供的bolt和spout),以及高层抽象的DSL(类似于Spark的
group/reduce/map)

通过具有容错性的state store实现可靠的状态操作(如windowed join和aggregation)
支持Exactly Once(正好一次)处理语义
具备记录级(也即行级)的数据处理能力,从而将延迟降低到毫秒级别
充分利用Kafka分区机制以实现Scale Out(水平扩展)并提供顺序性保证
支持基于事件时间的窗口操作(Spark Streaming暂不支持事件时间),并且可处理晚到的数据(late arrival of records)
Kafka Stream定位及优势
当前已经有多种分布式流式处理系统,最知名且应用最多的开源流式处理系统当属Twitter开源的Apache Storm和UC berkeley
的Spark Streaming。。。。
Apache Storm经过多年发展,应用广泛,并且同样提供记录级(行级)的处理能力,延迟也在毫秒级。目前已支持SQL on
Stream。
Spark Streaming基于Apache Spark,且非常便于与SQL处理和图计算等集成,功能强大,对于熟悉其它Spark应用开发的用
户而言使用门槛非常低
另外,目前主流的Hadoop发行版,如Cloudera,Hortonworks和MapR,都集成了Spark和Storm,使得部署与运维这些系统
非常方便。。。。。。。
既然Apache Storm与Apache Spark拥用如此多优点,那为何还需要Kafka Stream呢?笔者认为主要有如下原因。。。。。。
。
第一,Spark和Storm都是流式处理框架,而Kafka Stream提供的是一个基于Kafka的流式处理类库。框架要求开发者按照指定
的方式去开发逻辑部分,并按照指定的方法部署。开发者很难了解框架的内部处理方式,从而使得调试和运维成本较高,且使
用受限。而Kafka Stream作为流式处理类库,直接提供具体的类给开发者调用,整个应用的运行和部署方式完成由开发者决
定,极大地方便了使用和调试。应用程序与类库及框架的关系如下图所示。
第二,主流的分布式流式处理系统,基本都支持以Kafka作为其数据源。例如Spark提供专门的spark-streaming-kafka模块,而
Storm也具有专门的kafka-spout。事实上,Kafka可以说是当前业界主流的分布式流式处理系统的标准数据源,大部分典型的
流式系统中都已部署了Kafka,此时使用Kafka Stream的使用和维护成本非常低。。。。。。。
第三,虽然Hortonworks与Cloudera方便了Spark和Storm的部署,但这些框架的部署和运维仍相对复杂。相反,Kafka
Stream作为类库,可以非常方便地被嵌入到已有的应用程序中,它对应用的打包方式及部署方式基本上没有任何要求。。。
。。。
第四,由于Kafka本身提供数据持久化,因此Kafka Stream具有在线滚动升级和滚动部署及重新计算的能力。。
第五,Kafka Stream充分利用了Consumer的Rebalance机制和Kafka的分区机制,使得Kafka Stream可以非常方便地进行水
平扩展。具体来说,每个运行Kafka Stream的应用实例都包含了一个Kafka Consumer实例,多个同一应用的不同实例间并行
处理目标数据集。而不同实例之间的部署方式并不必完全一致,比如部分实例运行在Web容器中,部分实例可以运行在
Docker或Kubernetes等虚拟化容器中。
第六,Kafka具有Consumer Rebalance机制,因此可在线动态调整并行度而不需要重启
第六,使用Spark Streaming或Storm时,需要为框架本身的进程预留资源,如Spark on YARN的node manager和Storm的
supervisor。对应用程序,框架本身也会占用部分资源,如Spark Streaming需要为shuffle和storage预留内存。。。。。。。

Kafka Stream整体架构
Kafka Stream的整体架构图如下。
目前(Kafka 0.11.0.0)Kafka Stream的数据源只能是Kafka(如上图所示)。但是处理结果并不一定要如上图所示输出到
Kafka。实际上GlobalKTable和KTable及KStream的实例化都须指定Topic(如下所示)。
另外,上图中的Producer和Consumer不需由开发者在Kafka Stream应用中显示地实例化,而是由Kafka Stream根据参数隐式
实例化,从而降低了使用Kafka的门槛。开发者只需专注于开发核心业务逻辑,也即上图中Task内的部分。
Processor Topology
基于Kafka Stream的流式应用的业务逻辑全部由一个被称为Processor Topology的组件执行。它与Spark Streaming的DAG和
Storm的Topology类似,都定义了数据在各个处理单元(在Kafka Stream中被称作Processor)间的流动方式,也即定义了数
据的处理逻辑
下面是一个Processor的示例,该Processor实现了Word Count功能,且每秒输出一次计算结果。
剩余11页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0