前言:kafka比rabbitmq好用,真香(懒是阻碍学习的第一要素)
参考原文:https://blog.csdn.net/u010889616/article/details/80641922
一、zookeeper准备(单机配置)
1.下载地址: https://zookeeper.apache.org/releases.html
2. 启动:./zkServer.sh start | ./zkServer.sh start-foreground 后台 关闭 ./skServer.sh stop
3.配置文件:zoo_sample.cfg 看网上教材要改成zoo.cfg,但实测不改也是默认配置文件
4.java环境:找不到java环境的话,在zkServer.sh开头加上地址
export JAVA_HOME=/usr/bin/java
export PATH=$JAVA_HOME/bin:$PATH
二、kafka准备
1.下载地址:https://kafka.apache.org/downloads
2.配置修改
broker.id=1
listeners=PLAINTEXT://ip:9092
advertised.listeners=PLAINTEXT://host_ip:9092
3.启动:bin/kafka-server-start.sh config/server.properties ,停止有stop.sh
4.创建topic:bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
5.查看topic:bin/kafka-topics.sh --list --zookeeper localhost:2181
6.发送消息:bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
7.接受消息:
老版本:./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test
新版本:./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
三、python3 测试脚本:使用kafka-python | pip install kafka-python
from kafka import KafkaConsumer
import time
def start_consumer():
consumer = KafkaConsumer('test', bootstrap_servers = 'ip:9092')
for msg in consumer:
print(msg)
print("topic = %s" % msg.topic) # topic default is string
print("partition = %d" % msg.offset)
print("value = %s" % msg.value.decode()) # bytes to string
print("timestamp = %d" % msg.timestamp)
print("time = ", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime( msg.timestamp/1000 )) )
if __name__ == '__main__':
start_consumer()
四、让我修改一下啊
kafka的新版本早已集成了zookeeper的部分功能,不需要再另外启动了
from:https://blog.csdn.net/futudeniaodan/article/details/86561755
1.启动zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
2.启动kafka
bin/kafka-server-start.sh config/server.properties
五、update
· python 3.7 对某个关键词的修改导致新的kafka-python无法正常接收,调整比较复杂,不如直接降python版本
· java版本的一些坑
1.apache.kafka 没有log包导致的报错
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
</dependencies>
2.我使用的是本地的WSL启动kafka,如果提示地址问题,配置一些host文件,127和主机名对应起来
import java.util.Properties;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
public class ProducerDemo {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "127.0.0.1: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");
Producer<String, String> producer = new KafkaProducer<>(props);
for (int i = 0; i < 10; i++)
producer.send(new ProducerRecord<>("test", Integer.toString(i), Integer.toString(i)));
producer.close();
}
}
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
public class CustomerDemo {
public static void main(String[] args) throws InterruptedException {
Properties properties = new Properties();
properties.put("bootstrap.servers", "127.0.0.1:9092");
properties.put("group.id", "hello");
//session.timeout.ms:消费者在被认为死亡之前可以与服务器断开连接的时间,默认是3s 。
properties.put("session.timeout.ms", "30000");
//消费者是否自动提交偏移量,默认值是true,避免出现重复数据和数据丢失,可以把它设为 false。
properties.put("enable.auto.commit", "false");
properties.put("auto.commit.interval.ms", "1000");
//auto.offset.reset:消费者在读取一个没有偏移量的分区或者偏移量无效的情况下的处理
//earliest:在偏移量无效的情况下,消费者将从起始位置读取分区的记录。
//latest:在偏移量无效的情况下,消费者将从最新位置读取分区的记录
properties.put("auto.offset.reset", "earliest");
properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// max.partition.fetch.bytes:服务器从每个分区里返回给消费者的最大字节数
//fetch.max.wait.ms:消费者等待时间,默认是500。
// fetch.min.bytes:消费者从服务器获取记录的最小字节数。
// client.id:该参数可以是任意的字符串,服务器会用它来识别消息的来源。
// max.poll.records:用于控制单次调用 call () 方住能够返回的记录数量
//receive.buffer.bytes和send.buffer.bytes:指定了 TCP socket 接收和发送数据包的缓冲区大小,默认值为-1
KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);
kafkaConsumer.subscribe(Arrays.asList("test"));
while (true) {
ConsumerRecords<String, String> records = kafkaConsumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
System.out.printf("offset = %d, value = %s", record.offset(), record.value());
System.out.println("=====================>");
}
}
}
}