Kfaka Stream使用总结

一、简介

1. 什么是kafka stream?

​ Kafka Stream是Apache Kafka从0.10版本引入的一个新特性。它是一个用于处理和分析存储在Kafka中的数据,并将得到的数据写回Kafka的客户端程序库

2.kafka stream的特点

  1. 依赖少.除kafka外,无其他依赖。
  2. 提供了一个简单而轻量的jar包,可以很方便的嵌入到java程序中,方便打包与部署。
  3. 基于Kafka的分区机制和Rebalance机制,实现水平扩展和在线动态调整并行度。
  4. 提供记录级的处理能力,从而实现毫秒级的低延迟。
  5. 支持通过状态存储stateStore实现状态操作以及支持基于事件时间的窗口操作。
  6. 提供高级别(DSL)、低级别(processor)两套操作API。

3.核心概念

3.1.拓扑(Topology)

拓扑为kafka stream处理的逻辑图谱,由来源,一个个逻辑处理器节点,流的流向以及流的输出构成.kafka stream提供两种方式来构建拓扑:

①kafka stream DSL(高级别)提供了常用的数据转化操作,如:filter,map,count等.

②processor(低级别) 允许开发者自己定义处理逻辑,以及基于状态仓库(stateStore)做计算.

image
3.2.时间

kafka stream中时间的概念:

  • 事件时间: 当一个数据记录发生的时间点,也就是数据被创建的时间。
  • 处理时间: 数据记录被流处理的时间,也即是数据被kafka stream消费的时间.
  • 摄取时间: 数据记录被kafka broker存储在topic分区的时间.

kafka stream在0.10后允许实现org.apache.kafka.streams.processor.TimestampExtractor接口,基于该接口,可根据业务需求自定义执行不同的时间.

当kafka stream处理完数据写回到kafka中时,kafka stream将分配时间戳给新的消息.分配规则有上下文决定:

  • 当通过处理一些输入记录(例如,在process()函数调用中触发的context.forward())生成新的输出记录时,输出记录时间戳直接从输入记录时间戳继承。
  • 当通过周期性函数(如punctuate())生成新的输出记录时。输出记录时间戳被定义为流任务的当前内部时间(通过context.timestamp()获取)。
  • 对于聚合操作,生成的聚合更新的记录时间戳将被最新到达的输入记录触发更新。
3.3.状态

一些流处理程序不需要状态,也就是每条消息处理独立于其他的消息处理,如:过滤字符,文本打标签等.而另一些流处理程序是需要状态的,如:网站PV量的计算等,kafka stream提供了状态存储功能,流处理程序可以用来存储和查询数据.kafka stream默认将数据存储在本地RocksDB数据库中.

3.4.分区(Partition)和任务(Task)

Kafka分区数据的消息层用于存储和传输。Kafka Streams分区数据用于处理。基于kafka topic分区的并行性模型,kafka stream使用了分区和任务的概念.

Kafka Streams根据输入流分区创建固定数量的Task,其中每个Task分配一个输入流的topic. 分区对Task的分配不会改变,因此每个Task是应用程序并行性的固定单位。然后,Task可以基于分配的分区实现自己的处理器拓扑.如果某个Stream的输入Topic有多个(比如2个Topic,1个Partition数为4,另一个Partition数为3),则总的Task数等于Partition数最多的那个Topic的Partition数。这是因为Kafka Stream使用了Consumer的Rebalance机制,每个Partition对应一个Task。

并行模式下的分布:

image.png

3.5 数据抽象

  1. KStream: data as record stream,KStream为一个insert队列,新数据不断增加进来.
  2. KTable: data as change log stream,KTable为一个update队列,新数据和已有数据有相同的key,则用新数据覆盖原有原来的数据.

流表二元性

  • 流作为表: 一个流可以认为是一个表的变更日志,其中在流中的每个的数据记录捕获表的状态变化。因此,流其实是一个伪装的表,并且可以通过从开始到结束重放变更日志来很容地重构表。
  • 表作为流: 表可以认为是在流中的每个key的最新value的一个时间点的快照(流的数据记录是k-v键值对)。因此,表也可以认为是伪装的流,它可以通过对表中每个k-v进行迭代而容易的转换成流。

二、架构

image.png

如图所示,kafka stream支持接收多个topic中传来的数据,并且通过kafka的rebalance机制,各个程序之间支持水平扩展。kafka stream从kafka中获取数据,并且内置了consumer和producer。通过内置的consumer接收到kafka中的数据,处理后再通过内置的producer将数据返回到kafka中。

三、为什么选择Kafka Stream?

1. 使用成本低

与Spark和Storm等流式处理框架相比,kafka stream提供的是一个基于kafka的流式处理类库。且kafka stream作为流式处理类库,直接提供具体的类和接口给开发者,整个程序处理逻辑全都由开发者自己控制,方便开发和调试。

2.轻量易部署

由于kafka stream是作为类库嵌入程序中,使得kafka stream打包部署非常方便。并且kafka stream利用了kafka 的分区机制和consumer的rebalance机制,使得kafka stream程序可以非常方便的进行水平扩展,并且可以在线动态调整并行度。

3.性能

Kafka Stream的并行模型中,最小粒度为Task,而每个Task包含一个特定子Topology的所有Processor,使得所有处理逻辑都在同一线程内完成。这一特点跟Storm的Topology完全不一样。Storm的Topology的每一个Task只包含一个Spout或Bolt的实例。因此Storm的一个Topology内的不同Task之间需要通过网络通信传递数据,而Kafka Stream的Task包含了完整的子Topology,所以Task之间不需要传递数据,也就不需要网络通信。这一点降低了系统复杂度,也提高了处理效率。

四、缺点

  • 暂不支持异步操作.所以在处理逻辑中避免使用高开销的操作,否则整个处理线程将会阻塞.
  • 不支持像spark streaming那样使用SQL完成实时的日志数据统计.
  • 数据来源单一,只支持kafka作为数据来源.

应用示例

疑问解答

  1. Task和线程之间的关系
  • kafka stream通过props.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG,2);属性可以设置并行的线程数.
  • Task的数量由Topic的分区数决定,取监听的topic中最大的分区数作为Task的数量,Task和Thread之间的分配由线程数决定.若有4个Task,但是只有一个Thread,则4个Task位于同一线程中串行.若有4个Task,和4个Thread,则每个Task独享一个线程,并行处理.若Task数大于Thread数,则有kafka stream自行做分配.若Task数小于线程数,则会出现某些线程不能执行Task的情况.
  1. 当某一实例处理数据时宕机了,数据是否会丢失

    分区与任务的分配永远不改变,当应用实例执行任务失败时,则其被分配的任务将自动在其他实例中被创建,并从相同的流分区重新消费.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容