Kafka 实战
一、kafka集群的安装与搭建
1.1 kafka下载
下载地址:https://kafka.apache.org/downloads
1.2 服务器准备
准备三台服务器。
如果是虚拟主机,要分别配置好ip地址和主机名称。
三台主机分别关闭防火墙 ,命令: chkconfig iptables off
1.3 解压安装包
tar -zxvf kafka_2.11-1.0.0.tgz -C …/servers/
1.4 修改配置文件
找到配置文件目录
cd /export/servers/kafka_2.11-1.0.0/config
编辑配置文件
vim server.properties
配置文件修改如下:
# 注意:每个服务器的 broker.id不一样 ,三台服务器可以分别配置 0、1、2
broker.id=0
#处理网络请求的线程数量
num.network.threads=3
#用来处理磁盘IO的线程数量
num.io.threads=8
#发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
#接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
#请求套接字的最大缓冲区大小
socket.request.max.bytes=104857600
#kafka运行日志存放的路径
log.dirs=/export/servers/kafka_2.11-1.0.0/logs
#topic在当前broker上的分区个数
num.partitions=2
#用来恢复和清理data下数据的线程数量
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.flush.interval.messages=10000
log.flush.interval.ms=1000
#segment文件保留的最长时间,超时将被删除
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
#配置连接Zookeeper集群地址
zookeeper.connect=node01:2181,node02:2181,node03:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
#是否允许删除topic
delete.topic.enable=true
# 注意:每个服务器的 host.name不一样
host.name=node01
注意,三台服务的配置,有些参数不能一样: 如host.name 和 broker.id
broker.id不能重复。
1.5配置环境变量
vi /etc/profile
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
1.6启动集群
三台服务器,都完成 kafka的解压、修改配置文件、配置环境变量后。
每台服务器依次启动kafka,输入命令:
nohup bin/kafka-server-start.sh config/server.properties >/dev/null 2>&1 &
1.7kafka的命令行的使用
创建topic
./kafka-topics.sh --create --partitions 3 --replication-factor 2 --topic test
--zookeeper node01:2181,node02:2181,node03:2181
查看所有的topic
./kafka-topics.sh --list --zookeeper node01:2181,node02:2181,node03:2181
kafka的消息发送
./kafka-console-producer.sh --broker-list node01:9092,node02:9092,node03:9092 --topic test
kafka消息的消费
./kafka-console-consumer.sh --bootstrap-server node01:9092,node02:9092,node03:9092 --from-beginning --topic test
使用zk来连接集群
./kafka-console-consumer.sh --zookeeper node01:2181,node02:2181,node03:2181 --from-beginning --topic test
二、kafka的API使用
第一步:创建maven工程,导入jar包
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
第二步:kafka的生产者API
public class KafkaProducerStudy {
//通过javaAPI操作kafka的生产者,往test这个topic里面生产消息
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "node01:9092,node02:9092,node03:9092");
props.put("acks", "all"); //kafka的一个消息确认机制,确保消息的不丢失
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<String, String>(props);
for (int i = 0; i < 100; i++){
producer.send(new ProducerRecord<String, String>("test", "hello world"+i)); //ProducerRecord 使用两个形参,第一个形参是我们的topic主题,第二个参数就是我们需要发送的消息
}
producer.close();
}
}
第三步:kafka的消费者的API
自动管理offset:
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "node01:9092,node02:9092,node03:9092");
props.put("group.id", "test");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
consumer.subscribe(Arrays.asList("test"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
}
kafka的手动管理offset:
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "node01:9092,node02:9092,node03:9092");
props.put("group.id", "test");
props.put("enable.auto.commit", "false");//如果需要手动管理offset,一定要注意,这个配置要给false
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<String,String>(props);
consumer.subscribe(Arrays.asList("test"));
final int minBatchSize = 10;
List<ConsumerRecord<String, String>> buffer = new ArrayList <ConsumerRecord<String, String>>();
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);//拉取数据
for (ConsumerRecord<String, String> record : records) {
buffer.add(record);
}
if (buffer.size() >= minBatchSize) {
// insertIntoDb(buffer);实现自己的业务逻辑在这里
consumer.commitSync();//一批次的提交我们的offset
buffer.clear();
}
}
}
三、kafkaManager管理工具的使用
简介
kafka-manager是目前最受欢迎的kafka集群管理工具,最早由雅虎开源,用户可以在Web界面执行一些简单的集群管理操作。具体支持以下内容:
- 管理多个集群
- 轻松检查群集状态(主题,消费者,偏移,代理,副本分发,分区分发)
- 运行首选副本选举
- 使用选项生成分区分配以选择要使用的代理
- 运行分区重新分配(基于生成的分配)
- 使用可选主题配置创建主题(0.8.1.1具有与0.8.2+不同的配置)
- 删除主题(仅支持0.8.2+并记住在代理配置中设置delete.topic.enable = true)
- 主题列表现在指示标记为删除的主题(仅支持0.8.2+)
- 批量生成多个主题的分区分配,并可选择要使用的代理
- 批量运行重新分配多个主题的分区
- 将分区添加到现有主题
- 更新现有主题的配置
kafka-manager 项目地址:https://github.com/yahoo/kafka-manager
kafkaManager内容转自(https://www.cnblogs.com/frankdeng/p/9584870.html)
详细配置、启动操作,请阅读原文。
启动后,可以看到kafka运行中的情况: