Kafka 核心技术与实战
胡夕
Apache Kafka Committer,老虎证券技术总监
52815 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
结束语 (1讲)
Kafka 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

41 | Kafka Streams DSL开发实例

count
peek
print
map
filter
SessionWindows.with
TimeWindows.of
有状态算子
无状态算子
会话窗口
滑动时间窗口
固定时间窗口
事件处理时间
事件发生时间
流表二元性
时间窗口实例
常见操作算子
KafkaStreams
KTable
KStream
StreamsBuilder
Properties对象
时间窗口
时间
流表二元性
操作算子
处理节点
拓扑结构
开放讨论
小结
开发API
运行WordCount实例
关键概念
Kafka Streams背景介绍
Kafka Streams DSL开发实例

该思维导图由 AI 生成,仅供参考

你好,我是胡夕。今天我要和你分享的主题是:Kafka Streams DSL 开发实例。
DSL,也就是 Domain Specific Language,意思是领域特定语言。它提供了一组便捷的 API 帮助我们实现流式数据处理逻辑。今天,我就来分享一些 Kafka Streams 中的 DSL 开发方法以及具体实例。

Kafka Streams 背景介绍

在上一讲中,我们提到流处理平台是专门处理无限数据集的引擎。就 Kafka Streams 而言,它仅仅是一个客户端库。所谓的 Kafka Streams 应用,就是调用了 Streams API 的普通 Java 应用程序。只不过在 Kafka Streams 中,流处理逻辑是用拓扑来表征的。
一个拓扑结构本质上是一个有向无环图(DAG),它由多个处理节点(Node)和连接节点的多条边组成,如下图所示:
图中的节点也称为处理单元或 Processor,它封装了具体的事件处理逻辑。Processor 在其他流处理平台也被称为操作算子。常见的操作算子包括转换(map)、过滤(filter)、连接(join)和聚合(aggregation)等。后面我会详细介绍几种常见的操作算子。
大体上,Kafka Streams 开放了两大类 API 供你定义 Processor 逻辑。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka Streams DSL开发实例介绍了Kafka Streams中的DSL开发方法以及具体实例。文章首先介绍了Kafka Streams的背景和API分类,重点介绍了DSL的使用方法。DSL提供了便捷的API,类似于SQL,用于定义流处理逻辑。文章还介绍了流处理应用的两类:有状态的和无状态的应用。此外,文章还介绍了流、表、流表二元性、时间和时间窗口等关键概念。流表二元性在流处理领域内的应用是Kafka框架成功的重要原因之一。时间概念包括事件发生时间和事件处理时间,而时间窗口机制则是将流数据沿着时间线切分的过程,Kafka Streams同时支持固定时间窗口、滑动时间窗口和会话窗口。这些概念和技术特点使得读者能够快速了解Kafka Streams DSL开发的基本原理和应用方法。 在WordCount实例中,通过完整的代码和详细的解释,展示了Kafka Streams DSL如何实现单词计数。文章还介绍了Kafka Streams提供的丰富的API,包括常见的操作算子和时间窗口API。常见的操作算子包括无状态算子如filter、map和调试用的print和peek,以及有状态操作算子如count和聚合操作。时间窗口API支持固定时间窗口、滑动时间窗口和会话窗口,通过简单的代码修改就能实现处理逻辑的修改。总体来说,Kafka Streams DSL实现WordCount的方式简单而强大,通过提供丰富而便捷的开箱即用操作算子,简化用户的开发成本,采用类似于搭积木的方式快捷地构建实时计算应用。 总结:本文深入介绍了Kafka Streams DSL的开发方法和实例,涵盖了流处理应用的关键概念、常见操作算子和时间窗口API。通过WordCount实例的详细解释,读者能够快速掌握DSL的使用方式和丰富的API功能。文章还提出了开放讨论,鼓励读者深入学习更高级的用法,如固定时间窗口的应用。这篇文章对于想要快速了解Kafka Streams DSL开发的读者来说是一份宝贵的参考资料。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kafka 核心技术与实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • leige
    stream和table都会有对应的topic吧,老师?他们的本质区别是什么?

    作者回复: 在topic层面,它们的区别反映在cleanup.policy上:stream是non-compact的topic;table是compact的topic

    2019-12-09
    5
  • 明翼
    单词计数里面的groupBy算子里面的key和value不太明白,不太明确那,为什么最后还要count计数

    作者回复: groupBy之后才能进行各种aggregation操作,比如count。groupBy要指定根据什么进行group,这就是key

    2019-09-09
    4
  • What for
    有几个疑惑详情老师赐教: 1、demo 是一个可以单机跑的 Java 进程,运行时会有几个线程工作? 2、如果输入 topic 有 3 个分区,在计算过程中 consumer 会在 3 个不同的线程里分别起 1 个消费 1 个分区还是说有其他的配置项可以调整? 3、遇到 shuffle 时下游的计算计算分区还是就统一汇总计算?如果 shuffle 下游有分区怎么确定分区策略以及写入输出 topic 的时候会有几个 producer?

    作者回复: 1. 不知道你说的是哪个Java进程。比如对Broker进程而言,线程数可能会有很多,大约十几个。如果想了解都有哪些线程,不妨用JConsole去查看下 2. Java Consumer使用单线程获取所有分区数据,至于拿到消息之后是否分多个线程由用户决定。对于Kafka Streams而言,由参数num.stream.threads而定 3. 这个因你使用什么operator而定。

    2020-02-04
    2
  • lmtoo
    第一个例子没有时间窗口的情况下,统计的是什么?最终单词的计数,还是某个时间段的计数

    作者回复: 截止到程序运行时

    2019-09-07
    2
    2
  • hunterlodge
    老师,我们领导提出了这样一些需求:1. 可以根据消息中的字段查询消息内容,这样可以用来诊断消息确实写入了kafka;2. 可以对某些消息重放;3. 可以对某些消息打标记从而控制消息的消费。我调研了一圈,第一点貌似可以用confluent的ksql做到,但是需要引入ksql server等复杂性,第二点也可以基于ksql来复制消息到重放队列(这样每一个topic都会存在一个重放topic)。第三点暂时还没有很好的思路。求助老师更好的方案,谢谢!

    作者回复: 第三点使用Interceptor试试呢?

    2019-11-27
    1
  • hunterlodge
    老师,我有几个疑问: 1. 如果客户端应用重启了,KTable及写入的KStream在重启前的状态就都清楚了对吗?如果是的话,重启后,单词计数要重新对队列中的所有数据从头到尾再次计算,对吗? 2. 在没有指定时间窗口的情况下,应用读取队列消息的周期是什么呢?Stream API也是通过poll方式读取队列数据吗? 3. “所以,事件的 Key 也必须要携带时间窗口的信息。”,这里携带时间窗口信息是指什么呢?能举个例子吗? 谢谢!

    作者回复: 1. 不需要,它会记录消费位移的 2. 也是通过poll的,因为本质上就是consume-process-produce的流程 3. “事件的 Key 也必须要携带时间窗口的信息” 这句话是指因为引入了时间窗口,所以key中带了时间窗口的信息,比如窗口开始时间,结束时间等

    2019-11-12
    1
  • 曾轼麟
    老师有个疑问,如果按照这个事例,我使用kafka普通client的batch方式消费,搭载JAVA8的lambda不是实现更快捷吗?而且我中间还能自己通过代码写入各种数据库或者其它持久化方式?lambda本身也支持map—reduce的方式计算,而且consumer group本身也是一种负载均衡的思路

    作者回复: 如果你自己写java代码肯定是可以的,不过这样你就要自行处理负载均衡、故障转移等问题了啊

    2019-09-10
    1
  • icejoywoo
    count之前加上.windowedBy(TimeWindows.of(Duration.ofMinutes(5))),应该就可以了吧

    作者回复: 是的:)

    2019-09-07
    2
    1
  • 张丽娜
    这个章节,老师讲的东西,我竟然听懂了,感谢老师耐心的讲解啊。

    作者回复: 感谢您的鼓励:)

    2020-03-05
  • 达文西
    感觉打开了新世界的大门,虽然暂时在业务上用不上
    2019-11-27
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部