文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java中Kafka如何使用

2023-06-25 16:29

关注

这篇文章将为大家详细讲解有关java中Kafka如何使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

前言

官方文档:http://kafka.apache.org/

中文文档:https://kafka.apachecn.org/

Apache Kafka是分布式发布-订阅消息系统。

Apache Kafka与传统消息系统相比,有以下不同:

1 简单介绍

java中Kafka如何使用

首先是一些概念:

Kafka作为一个集群,运行在一台或者多台服务器上.Kafka 通过 topic 对存储的流数据进行分类。每条记录中包含一个key,一个value和一个timestamp(时间戳)。

Kafka有四个核心的API:

The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。

The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。

The Streams API 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。

The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。

支持的语言(除了Java之外的)

java中Kafka如何使用

常见概念

1 Topics和日志

让我们首先深入了解下Kafka的核心概念:提供一串流式的记录— topic

Topic 就是数据主题,是数据记录发布的地方,可以用来区分业务系统。Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。

对于每一个topic, Kafka集群都会维持一个分区日志,如下所示:

java中Kafka如何使用

每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的commit log文件。分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。

Kafka 集群保留所有发布的记录—无论他们是否已被消费—并通过一个可配置的参数——保留期限来控制. 举个例子, 如果保留策略设置为2天,一条记录发布后两天内,可以随时被消费,两天过后这条记录会被抛弃并释放磁盘空间。Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题.

java中Kafka如何使用

日志中的 partition(分区)有以下几个用途。第一,当日志大小超过了单台服务器的限制,允许日志进行扩展。每个单独的分区都必须受限于主机的文件限制,不过一个主题可能有多个分区,因此可以处理无限量的数据。第二,可以作为并行的单元集—关于这一点,更多细节如下

2 分布式

日志的分区partition (分布)在Kafka集群的服务器上。每个服务器在处理数据和请求时,共享这些分区。每一个分区都会在已配置的服务器上进行备份,确保容错性.

每个分区都有一台 server 作为 “leader”,零台或者多台server作为 follwers 。leader server 处理一切对 partition (分区)的读写请求,而follwers只需被动的同步leader上的数据。当leader宕机了,followers 中的一台服务器会自动成为新的 leader。每台 server 都会成为某些分区的 leader 和某些分区的 follower,因此集群的负载是平衡的。

3 生产者

生产者可以将数据发布到所选择的topic中。生产者负责将记录分配到topic的哪一个 partition(分区)中。可以使用循环的方式来简单地实现负载均衡,也可以根据某些语义分区函数(例如:记录中的key)来完成。下面会介绍更多关于分区的使用。

4 消费者

消费者使用一个 消费组 名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上。

如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.

如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.

java中Kafka如何使用

如图,这个 Kafka 集群有两台 server 的,四个分区(p0-p3)和两个消费者组。消费组A有两个消费者,消费组B有四个消费者。

通常情况下,每个 topic 都会有一些消费组,一个消费组对应一个"逻辑订阅者"。一个消费组由许多消费者实例组成,便于扩展和容错。这就是发布和订阅的概念,只不过订阅者是一组消费者而不是单个的进程。

在Kafka中实现消费的方式是将日志中的分区划分到每一个消费者实例上,以便在任何时间,每个实例都是分区唯一的消费者。维护消费组中的消费关系由Kafka协议动态处理。如果新的实例加入组,他们将从组中其他成员处接管一些 partition 分区;如果一个实例消失,拥有的分区将被分发到剩余的实例。

Kafka 只保证分区内的记录是有序的,而不保证主题中不同分区的顺序。每个 partition 分区按照key值排序足以满足大多数应用程序的需求。但如果你需要总记录在所有记录的上面,可使用仅有一个分区的主题来实现,这意味着每个消费者组只有一个消费者进程。

保证

high-level Kafka给予以下保证:

生产者发送到特定topic partition 的消息将按照发送的顺序处理。 也就是说,如果记录M1和记录M2由相同的生产者发送,并先发送M1记录,那么M1的偏移比M2小,并在日志中较早出现一个消费者实例按照日志中的顺序查看记录.对于具有N个副本的主题,我们最多容忍N-1个服务器故障,从而保证不会丢失任何提交到日志中的记录.

关于保证的更多细节可以看文档的设计部分。

2 下载安装

Kafka依赖于Zookeeper,而Zookeeper又依赖于Java,因此在使用Kafka之前要安装jdk1.8的环境和启动zookeeper服务器。

下载或安装地址:

JDK1.8://www.yisu.com/article/229780.htm:
https://www.yisu.com/article/229783.htm:
https://kafka.apachecn.org/downloads.html

好,下面我们开始进行安装

[root@iZ2ze4m2ri7irkf6h7n8zoZ local]# tar -zxf kafka_2.11-1.0.0.tgz[root@iZ2ze4m2ri7irkf6h7n8zoZ local]# mv kafka_2.11-1.0.0 kafka-2.11

3 基本使用

3.1 启动Kafka

首先检查下自己的jdk 是否安装:

[root@iZ2ze4m2ri7irkf6h7n8zoZ local]# java -versionjava version "1.8.0_144"Java(TM) SE Runtime Environment (build 1.8.0_144-b01)Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

启动Zookeeper:

[root@iZ2ze4m2ri7irkf6h7n8zoZ zookeeper-3.5.9]# lsbin  conf  docs  lib  LICENSE.txt  NOTICE.txt  README.md  README_packaging.txt[root@iZ2ze4m2ri7irkf6h7n8zoZ zookeeper-3.5.9]# cd conf/[root@iZ2ze4m2ri7irkf6h7n8zoZ conf]# lsconfiguration.xsl  log4j.properties  zoo_sample.cfg[root@iZ2ze4m2ri7irkf6h7n8zoZ conf]# cp zoo_sample.cfg zoo.cfg[root@iZ2ze4m2ri7irkf6h7n8zoZ conf]# cd ../bin/[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# lsREADME.txt    zkCli.cmd  zkEnv.cmd  zkServer.cmd            zkServer.sh          zkTxnLogToolkit.shzkCleanup.sh  zkCli.sh   zkEnv.sh   zkServer-initialize.sh  zkTxnLogToolkit.cmd[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./zkServer.zkServer.cmd  zkServer.sh   [root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./zkServer.sh startZooKeeper JMX enabled by defaultUsing config: /usr/local/zookeeper-3.5.9/bin/../conf/zoo.cfgStarting zookeeper ... STARTED

启动Kafka:

[root@iZ2ze4m2ri7irkf6h7n8zoZ kafka-2.11]# lsbin  config  libs  LICENSE  NOTICE  site-docs[root@iZ2ze4m2ri7irkf6h7n8zoZ kafka-2.11]# cd config/[root@iZ2ze4m2ri7irkf6h7n8zoZ config]# lsconnect-console-sink.properties    connect-file-source.properties  log4j.properties        zookeeper.propertiesconnect-console-source.properties  connect-log4j.properties        producer.propertiesconnect-distributed.properties     connect-standalone.properties   server.propertiesconnect-file-sink.properties       consumer.properties             tools-log4j.properties[root@iZ2ze4m2ri7irkf6h7n8zoZ config]# cd ../bin/[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-server-start.sh ../config/server.properties [2021-11-20 10:21:10,326] INFO KafkaConfig values: ......[2021-11-20 10:21:12,423] INFO Kafka version : 1.0.0 (org.apache.kafka.common.utils.AppInfoParser)[2021-11-20 10:21:12,423] INFO Kafka commitId : aaa7af6d4a11b29d (org.apache.kafka.common.utils.AppInfoParser)[2021-11-20 10:21:12,424] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)

3.2 简单测试使用

新建和查看topic

[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic ymxCreated topic "ymx".[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-topics.sh --list --zookeeper localhost:2181ymx

生产者发送消息:

[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic ymx>Hello Kafka!>Hello Ymx!>Hello Kafka and Ymx!>

消费者消费消息:

[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic ymx --from-beginningHello Kafka!Hello Ymx!Hello Kafka and Ymx!

3.3 搭建多代理集群

3.3.1 开始搭建

首先要copy下配置文件

[root@iZ2ze4m2ri7irkf6h7n8zoZ config]# cp server.properties server-01.properties [root@iZ2ze4m2ri7irkf6h7n8zoZ config]# cp server.properties server-02.properties [root@iZ2ze4m2ri7irkf6h7n8zoZ config]# vim server-01.properties ####  内容开始  ####broker.id=1                  #  21行左右,broker的唯一标识(同一个集群中)listeners=PLAINTEXT://:9093  #  31行左右,放开,代表kafka的端口号log.dirs=/tmp/kafka-logs-01  #  60行左右,用逗号分隔的目录列表,在其中存储日志文件  ####  内容结束  ####[root@iZ2ze4m2ri7irkf6h7n8zoZ config]# vim server-02.properties ####  内容开始  ####broker.id=2                  #  21行左右,broker的唯一标识(同一个集群中)listeners=PLAINTEXT://:9094  #  31行左右,放开,代表kafka的端口号log.dirs=/tmp/kafka-logs-02  #  60行左右,用逗号分隔的目录列表,在其中存储日志文件  ####  内容结束  ####

根据配置文件启动Kafka(同一主机下)

[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-server-start.sh ../config/server-01.properties

报错信息:

[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-server-start.sh ../config/server-01.properties Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)## There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.# An error report file with more information is saved as:# /usr/local/kafka-2.11/bin/hs_err_pid4036.log

原因:物理机或虚拟机内存不足,不足以保证Kafka启动或运行时需要的内容容量

解决方式

增加物理机或虚拟机的内存

减少Kafka启动所需内容的配置,将要修改的文件为kafka-server-start.sh

export KAFKA_HEAP_OPTS="-Xmx512M -Xms256M" #29行左右
3.3.2 使用

解决好之后我们开始启动:

[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-server-start.sh ../config/server-01.properties [2021-11-20 10:58:33,138] INFO KafkaConfig values:
[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-server-start.sh ../config/server-02.properties [2021-11-20 10:59:04,187] INFO KafkaConfig values:

ps:看下我们的阿里云服务器的状况

java中Kafka如何使用

[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic mr-yanCreated topic "mr-yan".[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-topics.sh --describe --zookeeper localhost:2181 --topic mr-yanTopic:mr-yan    PartitionCount:1        ReplicationFactor:3     Configs:        Topic: mr-yan   Partition: 0    Leader: 1       Replicas: 1,0,2 Isr: 1,0,2

进行集群环境下的使用:

[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic mr-yan>Hello Kafkas!  >Hello Mr.Yan   >
[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic mr-yanHello Kafkas!Hello Mr.Yan
3.3.3 验证容错性

首先我们停掉一个Kafka的Broker:

[root@iZ2ze4m2ri7irkf6h7n8zoZ ~]# ps -ef|grep server-01.propertiesroot     19859 28247  1 10:58 pts/3    ../config/server-01.propertiesroot     23934 16569  0 11:12 pts/11   00:00:00 grep --color=auto server-01.properties[root@iZ2ze4m2ri7irkf6h7n8zoZ ~]# kill -9 28247[root@iZ2ze4m2ri7irkf6h7n8zoZ ~]# ps -ef|grep server-01.propertiesroot     32604 16569  0 11:13 pts/11   00:00:00 grep --color=auto server-01.properties[root@iZ2ze4m2ri7irkf6h7n8zoZ ~]# cd /usr/local/kafka-2.11/bin/[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-topics.sh --describe --zookeeper localhost:2181 --topic mr-yanTopic:mr-yan    PartitionCount:1        ReplicationFactor:3     Configs:        Topic: mr-yan   Partition: 0    Leader: 0       Replicas: 1,0,2 Isr: 0,2

查看生产者和消费者的变化,并再次使用,发现仍可以进行使用

[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic mr-yan>Hello Kafkas!  >Hello Mr.Yan   >[2021-11-20 11:12:28,881] WARN [Producer clientId=console-producer] Connection to node 1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)>Hello Kafkas too!>Hello Mr.Yan too!>
[root@iZ2ze4m2ri7irkf6h7n8zoZ bin]# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic mr-yanHello Kafkas!Hello Mr.Yan[2021-11-20 11:12:28,812] WARN [Consumer clientId=consumer-1, groupId=console-consumer-22158] Connection to node 1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)[2021-11-20 11:12:29,165] WARN [Consumer clientId=consumer-1, groupId=console-consumer-22158] Connection to node 1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)Hello Kafkas too!Hello Mr.Yan too!

4 小总结

主题,分区,副本的概念

Kafka是根据主题(topic)进行消息的传递,但是又有分区和副本的概念,下面来分别解释下:

分区:kafka对每一条消息的key做一个hashcode运算,然后将得到的数值对分区数量进行模运算就得到了这条消息所在分区的数字。副本:同一分区的几个副本之间保存的是相同的数据,副本之间的关系是“一主多从”,其中的主(leader)则负责对外提供读写操作的服务,而从(follower)则负责与主节点同步数据,当主节点宕机,从节点之间能重新选举leader进行对外服务。

kafka会保证同一个分区内的消息有序,但是不保证主题内的消息有序。

java中Kafka如何使用

关于“java中Kafka如何使用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯