kafka示例

前言: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("=====================>");
            }
        }

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值