1、说明

仅列出一些较少用到的API,常用API比较简单,参考官网即可

1、Streams API

依赖:

<dependency>

    <groupId>org.apache.kafka</groupId>

    <artifactId>kafka-streams</artifactId>

    <version>2.2.0</version>

</dependency>

stream入门示例:

http://kafka.apache.org/22/documentation/streams/

 

stream javadoc:

http://kafka.apache.org/22/javadoc/index.html?org/apache/kafka/streams/KafkaStreams.html

1.1 流介绍

参考

  1. 什么是流计算:一般流式计算会与批量计算相比较。在流式计算模型中,输入是持续的,可以认为在时间上是无界的,也就意味着,永远拿不到全量数据去做计算。同时,计算结果是持续输出的,也即计算结果在时间上也是无界的。流式计算一般对实时性要求较高,同时一般是先定义目标计算,然后数据到来之后将计算逻辑应用于数据。同时为了提高计算效率,往往尽可能采用增量计算代替全量计算。批量处理模型中,一般先有全量数据集,然后定义计算逻辑,并将计算应用于全量数据。特点是全量计算,并且计算结果一次性全量输出。
  2. 为什么要有Kafka Stream。

当前已经有非常多的流式处理系统,最知名且应用最多的开源流式处理系统有Spark Streaming和Apache Storm。Apache Storm发展多年,应用广泛,提供记录级别的处理能力,当前也支持SQL on Stream。而Spark Streaming基于Apache Spark,可以非常方便与图计算,SQL处理等集成,功能强大,对于熟悉其它Spark应用开发的用户而言使用门槛低。另外,目前主流的Hadoop发行版,如MapR,Cloudera和Hortonworks,都集成了Apache Storm和Apache Spark,使得部署更容易。

既然Apache Spark与Apache Storm拥用如此多的优势,那为何还需要Kafka Stream呢?笔者认为主要有如下原因。

第一,Spark和Storm都是流式处理框架,而Kafka Stream提供的是一个基于Kafka的流式处理类库。框架要求开发者按照特定的方式去开发逻辑部分,供框架调用。开发者很难了解框架的具体运行方式,从而使得调试成本高,并且使用受限。而Kafka Stream作为流式处理类库,直接提供具体的类给开发者调用,整个应用的运行方式主要由开发者控制,方便使用和调试。

 

第二,虽然Cloudera与Hortonworks方便了Storm和Spark的部署,但是这些框架的部署仍然相对复杂。而Kafka Stream作为类库,可以非常方便的嵌入应用程序中,它对应用的打包和部署基本没有任何要求。更为重要的是,Kafka Stream充分利用了Kafka的分区机制和Consumer的Rebalance机制,使得Kafka Stream可以非常方便的水平扩展,并且各个实例可以使用不同的部署方式。具体来说,每个运行Kafka Stream的应用程序实例都包含了Kafka Consumer实例,多个同一应用的实例之间并行处理数据集。而不同实例之间的部署方式并不要求一致,比如部分实例可以运行在Web容器中,部分实例可运行在Docker或Kubernetes中。

 

第三,就流式处理系统而言,基本都支持Kafka作为数据源。例如Storm具有专门的kafka-spout,而Spark也提供专门的spark-streaming-kafka模块。事实上,Kafka基本上是主流的流式处理系统的标准数据源。换言之,大部分流式系统中都已部署了Kafka,此时使用Kafka Stream的成本非常低。

 

第四,使用Storm或Spark Streaming时,需要为框架本身的进程预留资源,如Storm的supervisor和Spark on YARN的node manager。即使对于应用实例而言,框架本身也会占用部分资源,如Spark Streaming需要为shuffle和storage预留内存。

 

第五,由于Kafka本身提供数据持久化,因此Kafka Stream提供滚动部署和滚动升级以及重新计算的能力。

 

第六,由于Kafka Consumer Rebalance机制,Kafka Stream可以在线动态调整并行度。

2、connector API

如果要将 Kafka 连接到数据存储系统,或者外部系统连接到kafka,可以使用 Connect,因为这些系统不是你开发的。Connect 可以用于从外部数据存储系统读取数据,或者将数据推送到外部存储系统。如果你要连接的数据存储系统没有相应的连接器,那么可以考虑使用客户端 API 或Connect API 开发一个应用程序。我们建议首选 Connect

javadoc:http://kafka.apache.org/22/javadoc/index.html?org/apache/kafka/connect

使用示例:http://kafka.apachecn.org/documentation.html#connect_overview

kafka connector特性:

  1. Kafka connectors常用框架
  2. 分布式和独立模式
  3. REST 接口
  4. 自动offset管理
  5. 默认是分布式和可伸缩的
  6. 流和批处理整合

2.1 运行connect(window中启动不了)

connect-distributed ../../config/connect-distributed.properties ../../config/connect-file-sink.properties ../../ config/connect-file-source.properties

 

connect的几个配置参数:

  1. bootstrap.servers :该参数列出了将要与 Connect 协同工作的 broker 服务器,连接器将会向这些 broker 写入数据或者从它们那里读取数据
  2. group.id :具有相同 group.id 的 worker 属于同一个 Connect 集群
  3. key. converter 和 value.converter: Connect 可以处理存储在 Kafka 里的不同格式的数据 。 这两个参数分别指定了消息的键和值所使用的转换器。默认使用 Kafka 提供的JSONConverter ,当然也可以配置成 Confluent Schema Registry 提供的 AvroConverter
  1. AdminClient API

3、 AdminClint Api

用于管理和检查topic和broker,acl及其他kafka对象。

依赖:

<dependency>

    <groupId>org.apache.kafka</groupId>

    <artifactId>kafka-clients</artifactId>

    <version>2.2.0</version>

</dependency>

javadoc:

http://kafka.apache.org/22/javadoc/index.html?org/apache/kafka/clients/admin/AdminClient.html