Kafka Streams 剖析
1.概述
Kafka Streams 是一个用来处理流式数据的库,属于Java类库,它并不是一个流处理框架,和Storm,Spark Streaming这类流处理框架是明显不一样的。那这样一个库是做什么的,能应用到哪些场合,如何使用。笔者今天就给大家来一一剖析这些内容。
2.内容
首先,我们研究这样一个库,需要知道它是做什么的。Kafka Streams是一个用来构建流处理应用的库,和Java的那些内置库一样,以一种分布式的容错方式来处理一些事情。当前,业界用于流处理的计算框架包含有:Flink,Spark,Storm等等。Kafka Streams处理完后的结果可以回写到Topic中,也可以外接其他系统进行落地。包含以下特性:
- 事件区分:记录数据发生的时刻
- 时间处理:记录数据被流处理应用开始处理的时刻,如记录被消费的时刻
- 开窗
- 状态管理:本身应用不需要管理状态,如若需要处理复杂的流处理应用(分组,聚合,连接等)
Kafka Streams使用是很简单的,这一点通过阅读官方的示例代码就能发现,另外它利用Kafka的并发模型来完成负载均衡。
2.1 优势
在Kafka集群上,能够很便捷的使用,亮点如下图所示:

- 能够设计一些轻量级的Client类库,和现有的Java程序整合
- 不需要额外的Kafka集群,利用现有的Kafka集群的分区实现水平扩展
- 容错率,高可用性
- 多平台部署,支持Mac,Linux和Windows系统
- 权限安全控制
2.2 Sample
Kafka Streams是直接构建与Kafka的基础之上的,没有了额外的流处理集群,Table和一些有状态的处理完全整合到了流处理本身。其核心代码非常的简介。简而言之,就和你写Consumer或Producer一样,但是Kafka Streams更加的简洁。
2.3 属性
| 名称 | 描述 | 类型 | 默认值 | 级别 |
| application.id | 流处理标识,对应一个应用需要保持一致,用作消费的group.id | string | 高 | |
| bootstrap.servers | 用来发现Kafka的集群节点,不需要配置所有的Broker | list | 高 | |
| replication.factor | 复制因子 | int | 1 | 高 |
| state.dir | 本地状态存储目录 | string | /tmp/kafka-streams | 高 |
| cache.max.bytes.buffering | 所有线程的最大缓冲内存 | long | 10485760 | 中 |
| client.id | 客户端逻辑名称,用于标识请求位置 | string | "" | 中 |
| default.key.serde | 对Key序列化或反序列化类,实现于Serde接口 | class | org.apache.kafka.common.serialization.Serdes$ByteArraySerde | 中 |
| default.value.serde | 对Value序列化或反序列化类,实现与Serde接口 | class | org.apache.kafka.common.serialization.Serdes$ByteArraySerde | 中 |
| ... | ... | ... | ... | ... |
这里只是列举了部分Kafka Streams的属性值,更多的详情可参考Kafka Streams Configs。
3.示例
下面,我们可以通过一个示例代码,来熟悉Kafka Streams的运行流程,如下所示:
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KStreamBuilder;
import org.apache.kafka.streams.kstream.KTable; import java.util.Arrays;
import java.util.Properties; public class WordCountApplication { public static void main(final String[] args) throws Exception {
Properties config = new Properties();
config.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount_topic_appid");
config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka1:9092,kafka2:9092,kafka3:9092");
config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass()); KStreamBuilder builder = new KStreamBuilder();
KStream<String, String> textLines = builder.stream("TextLinesTopic");
KTable<String, Long> wordCounts = textLines
.flatMapValues(textLine -> Arrays.asList(textLine.toLowerCase().split("\\W+")))
.groupBy((key, word) -> word)
.count("Counts");
wordCounts.to(Serdes.String(), Serdes.Long(), "WordsWithCountsTopic"); KafkaStreams streams = new KafkaStreams(builder, config);
streams.start();
} }
从代码中,我们可以看出Kafka Streams为上层流定义了两种基本抽象:
- KStream:可以从一个或者多个Topic源来创建
- KTable:从一个Topic源来创建
这两者的区别是,前者比较像传统意义上的流,可以把每一个K/V看成独立的,后者的思想更加接近与Map的概念。同一个Key输入多次,后者是会覆盖前者的。而且,KStream和KTable都提供了一系列的转换操作,每个操作可以产生一个或者多个KStream和KTable对象,所有这些转换的方法连接在一起,就形成了一个复杂的Topology。由于KStream和KTable是强类型,这些转换都被定义为通用函数,这样在使用的时候让用户指定输入和输出数据类型。
另外,无状态的转换不依赖于处理的状态,因此不需要状态仓库。有状态的转换则需要进行存储相应的状态用于处理和生成结果。例如,在进行聚合操作的时候,一个窗口状态用于保存当前预定义收到的值,然后转换获取累计的值,再做计算。
在处理完后,对于结果集用户可以持续的将结果回写到Topic,也可以通过KStream.to() 或者 KTable.to() 方法来实现。
4.总结
通过对Kafka Streams的研究,它的优势可以总结为以下几点。首先,它提供了轻量级并且易用的API来有效的降低流数据的开发成本,之前要实现这类处理,需要使用Spark Streaming,Storm,Flink,或者自己编写Consumer。其次,它开发的应用程序可以支持在YARN,Mesos这类资源调度中,使用方式灵活。而对于异步操作,不是很友好,需要谨慎处理;另外,对SQL语法的支持有限,需要额外开发。
5.结束语
这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉。
Kafka Streams 剖析的更多相关文章
- 1.3 Quick Start中 Step 8: Use Kafka Streams to process data官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 8: Use Kafka Streams to process data ...
- Confluent Platform 3.0支持使用Kafka Streams实现实时的数据处理(最新版已经是3.1了,支持kafka0.10了)
来自 Confluent 的 Confluent Platform 3.0 消息系统支持使用 Kafka Streams 实现实时的数据处理,这家公司也是在背后支撑 Apache Kafka 消息框架 ...
- [翻译]Kafka Streams简介: 让流处理变得更简单
Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...
- 浅谈kafka streams
随着数据时代的到来,数据的实时计算也越来越被大家重视.实时计算的一个重要方向就是实时流计算,目前关于流计算的有很多成熟的技术实现方案,比如Storm.Spark Streaming.flink等.我今 ...
- 初探kafka streams
1.启动zookeeper zkServer.cmd 2.启动kafka kafka-server-start.bat d:\soft\tool\Kafka\kafka_2.12-2.1.0\conf ...
- Kafka Streams简介: 让流处理变得更简单
Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...
- 手把手教你写Kafka Streams程序
本文从以下四个方面手把手教你写Kafka Streams程序: 一. 设置Maven项目 二. 编写第一个Streams应用程序:Pipe 三. 编写第二个Streams应用程序:Line Split ...
- Kafka Streams演示程序
本文从以下六个方面详细介绍Kafka Streams的演示程序: Step 1: 下载代码 Step 2: 启动kafka服务 Step 3: 准备输入topic并启动Kafka生产者 Step 4: ...
- 大全Kafka Streams
本文将从以下三个方面全面介绍Kafka Streams 一. Kafka Streams 概念 二. Kafka Streams 使用 三. Kafka Streams WordCount 一. ...
随机推荐
- HDU5727 Necklace(二分图匹配)
Problem Description SJX has 2*N magic gems. N of them have Yin energy inside while others have Yang ...
- PyCharm 去掉自动保存功能
PyCharm 4.5.4 环境配置 1.去掉"自动保存功能" pycharm默认是自动保存的,习惯自己按 ctrl + s 的可以进行如下设置: 菜单File -> Set ...
- 案例:Oracle报错ASM磁盘组不存在或没有mount
案例:Oracle报错ASM磁盘组不存在或没有mount 环境:RHEL 6.5 + Oracle Standby RAC 11.2.0.4 我做Standby RAC实验时,在恢复控制文件时,报错无 ...
- Head First 设计模式 第6章 命令模式
第6章 命令模式 在本章,我们将把封装带到一个全新的境界,把方法调用封装起来.没错,通过方法调用,我们可以把运算块包装成型.所以,调用此运算的对象不需要关心运算是如何进行的,只要知道如何使用包装成型的 ...
- MySQL grant命令使用
MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant sele ...
- C/C++ 知识点---存储区
C/C++ 知识点---存储区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储 ...
- android下网络通信流程
新版本android中进行socket编程有了新的要求和规定,在主线程中不能进行socket的创建和通信.所以一般都在线程中使用socket编程 这样在线程中使用就需要出现子线程与主线程交互的问题. ...
- Fortran调用C语言小计
先简单记录下问题,以后再给续解决方案 1,关于fortran中module的使用 2,没有参数可以正常调用,当需要传递参数时,由于两者语言的差异,字符串结束符号不同,应该注意 3,关于调用C函数时,调 ...
- volatile可见性的一些认识
一.前言 volatile的关键词的使用在JVM内存模型中已是老生常谈了,这篇文章主要结合自己对可见性的一些认识和一些直观的例子来谈谈volatile.文章正文大致分为三部分,首先会介绍一下happe ...
- 第3天:CSS浮动、定位、表格、表单总结
今天学的是浮动.定位.表格.表单等内容,这些是CSS中最容易混淆的知识,有许多小技巧在写代码过程中需要注意.下面是主要知识点: 一.float浮动1.块元素在一行显示2.内联元素支持宽高3.默认内容撑 ...