4.1、准备3台虚拟机
192.168.140.128 kafka01
192.168.140.129 kafka02
192.168.140.130 kafka03
4.2、初始化环境
1)安装jdk、安装zookeeper
2)安装目录
安装包存放的目录:/export/software
安装程序存放的目录:/export/servers
数据目录:/export/data
日志目录:/export/logs
mkdir -p /export/servers/ mkdir -p /export/software / mkdir -p /export/data / mkdir -p /export/logs / |
本例:使用root用户
1) 验证环境
a) jdk环境
java -version
b) zookeeper环境
启动zookeeper,查看zkServer.sh status
4.3、搭建Kafka集群
4.3.1、准备安装包
由于kafka是scala语言编写的,基于scala的多个版本,kafka发布了多个版本。
其中2.11是推荐版本。
4.3.2、下载安装包及解压
tar -zxvf kafka_2.11-1.0.0.tgz -C /export/servers/ cd /export/servers/ rm -rf /export/servers/kafka rm -rf /export/logs/kafka/ rm -rf /export/data/kafka mv kafka_2.11-1.0.0 kafka |
1) 解压文件
2) 删除之前的安装记录
3) 重命名
4.3.3、查看目录及修改配置文件
4.3.3.1查看目录---ll
4.3.3.2修改配置文件
进入配置目录,查看server.properties文件
cat server.properties |grep -v "#"
通过以上命令,查看到了默认的配置文件,对默认的文件进行修改。
修改三个地方
1) Borker.id
2) 数据存放的目录,注意目录如果不存在,需要新建下。
3) zookeeper的地址信息
#broker 的全局唯一编号,不能重复 broker.id=0 #用来监听链接的端口,producer 或 consumer 将在此端口建立连接 port=9092 #处理网络请求的线程数量 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/logs/kafka #topic 在当前 broker 上的分片个数 num.partitions=2 #用来恢复和清理 data 下数据的线程数量 num.recovery.threads.per.data.dir=1 #segment 文件保留的最长时间,超时将被删除 log.retention.hours=168 #滚动生成新的 segment 文件的最大时间 log.roll.hours=168 #日志文件中每个 segment 的大小,默认为 1G log.segment.bytes=1073741824 #周期性检查文件大小的时间 log.retention.check.interval.ms=300000 #日志清理是否打开 log.cleaner.enable=true #broker 需要使用 zookeeper 保存 meta 数据 zookeeper.connect=192.168.52.106:2181,192.168.52.107:2181,192.168.52.108:2181 #zookeeper 链接超时时间 zookeeper.connection.timeout.ms=6000 #partion buffer 中,消息的条数达到阈值,将触发 flush 到磁盘 log.flush.interval.messages=10000 #消息 buffer 的时间,达到阈值,将触发 flush 到磁盘 log.flush.interval.ms=3000 #删除 topic 需要 server.properties 中设置 delete.topic.enable=true 否则只是标记删除 delete.topic.enable=true #此处的 host.name 为本机 IP(重要),如果不改,则客户端会抛出:Producer connection to localhost:9092 unsuccessful 错误! host.name=kafka01 |
|
4.3.4、分发配置文件及修改brokerid
将修改好的配置文件,分发到node02,node03上。
先在node02、node03上删除以往的安装记录
rm -rf /export/servers/kafka rm -rf /export/logs/kafka/ rm -rf /export/data/kafka |
分发安装包
scp -r /export/servers/kafka/ node02:/export/servers/ scp -r /export/servers/kafka/ node03:/export/servers/ |
修改node02上的broker.id
vi /export/servers/kafka/config/server.properties
broker.id=1
|
修改node03上的broker.id
vi /export/servers/kafka/config/server.properties broker.id=2
|
4.3.4、启动集群
cd /export/servers/kafka/bin ./kafka-server-start.sh /export/servers/kafka/config/server.properties |
5、操作集群的两种方式
需求:订单系统,需要发送消息。 后面后3个程序需要接受这个消息,并做后续的处理。
5.1、使用控制台运行
1) 创建一个订单的topic。
bin/kafka-topics.sh --create --zookeeper node01:2181 --replication-factor 1 --partitions 1 --topic order |
2) 编写代码启动一个生产者,生产数据
bin/kafka-console-producer.sh --broker-list node01:9092 --topic order |
3) 编写代码启动给一个消费者,消费数据
bin/kafka-console-consumer.sh --zookeeper node01:2181 --from-beginning --topic order |
5.2、使用Java api运行
1)java工程-maven,依赖。
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.11.0.1</version> </dependency> |
1) 编写代码-写生产者的代码
/** * 订单的生产者代码 */ public class OrderProducer { public static void main(String[] args) throws InterruptedException { /* 1、连接集群,通过配置文件的方式 * 2、发送数据-topic:order,value */ Properties props = new Properties(); props.put("bootstrap.servers", "node01:9092"); props.put("acks", "all"); 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"); KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props); for (int i = 0; i < 1000; i++) { // 发送数据 ,需要一个producerRecord对象,最少参数 String topic, V value kafkaProducer.send(new ProducerRecord<String, String>("order", "订单信息!"+i)); Thread.sleep(100); } } } |
2) 编写代码-写消费者的代码
/** * 消费订单数据--- javaben.tojson */ public class OrderConsumer { public static void main(String[] args) { // 1\连接集群 Properties props = new Properties(); props.put("bootstrap.servers", "node01: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> kafkaConsumer = new KafkaConsumer<String, String>(props); // 2、发送数据 发送数据需要,订阅下要消费的topic。 order kafkaConsumer.subscribe(Arrays.asList("order")); while (true) { ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(100);// jdk queue offer插入、poll获取元素。 blockingqueue put插入原生,take获取元素 for (ConsumerRecord<String, String> record : consumerRecords) { System.out.println("消费的数据为:" + record.value()); } } } } |