Kafka 生产消费实例

来源:互联网 发布:免费车销软件 编辑:程序博客网 时间:2024/04/30 11:00
  • 环境准备
    • 创建topic
  • 命令行模式
    • 执行生产者消费者实例
  • 客户端模式
    • 运行消费者生产者

1. 环境准备

说明:kafka集群环境我比较懒直接使用公司现有的环境。安全起见,所有的操作都是在自己用户下完成的,若是自己的kafka环境,完全可以使用kafka管理员的用户。创建topic时需要在kafka管理员的用户下完成。

1.登录到kafka集群中节点,并切换到kafka管理员用户下

ssh 172.16.150.xx 22su - kafka

2.创建topic

创建topic命令:kafka-topics --zookeeper bdap-nn-1.cebbank.com,bdap-mn-1.cebbank.com,bdap-nn-2.cebbank.com:2181/kafka --create --topic topicname --partitions 4 --replication-factor 3查询topic命令:kafka-topics --zookeeper bdap-nn-1.cebbank.com,bdap-mn-1.cebbank.com,bdap-nn-2.cebbank.com:2181/kafka –list

注意创建topic时会指定分区数,zookerper集群名及topicname要换成自己的,topicname不要重复

3.给我自己的用户创建读写topic的权限

写权限:kafka-acls --authorizer-properties zookeeper.connect=bdap-nn-1.cebbank.com,bdap-mn-1.cebbank.com,bdap-nn-2.cebbank.com:2181/kafka --add --allow-principal User:xx --operation Write --operation Describe --topic topicname读权限:kafka-acls --authorizer-properties zookeeper.connect=bdap-nn-1.cebbank.com,bdap-mn-1.cebbank.com,bdap-nn-2.cebbank.com:2181/kafka --add  --allow-principal User:xx --operation READ --topic topicname --group "*"

2. 命令行

1.需要切换到自己用户下
2.将kafka用户目录下的producer.properties、consumer.properties拷贝到自己目录下

执行消费者实例

kafka-console-consumer --zookeeper bdap-nn-1.cebbank.com,bdap-mn-1.cebbank.com,bdap-nn-2.cebbank.com:2181/kafka -consumer.config /home/username/consumer.properties --topic topicname --new-consumer --bootstrap-server bdap-nn-1.cebbank.com:9092 --from-beginning

执行生产者实例

kafka-console-producer --broker-list bdap-nn-1.cebbank.com:9092, bdap-mn-1.cebbank.com:9092,bdap-nn-2.cebbank.com:9092 --topic topicname --producer.config /home/username/producer.properties

生产消费者实例启动后,在生产者窗口中输入任意字符后,消费者窗口能接收到,则实例运行完成。

命令行的实例很简单,就一个收发功能,只是让我们先认识一下kafka的生产消费形式。实际项目中都是在代码中实现生产消费的。

3. 客户端

消费者代码

package kafka.consumer;import java.util.Arrays;import java.util.Properties;import org.apache.kafka.clients.consumer.ConsumerRecord;import org.apache.kafka.clients.consumer.ConsumerRecords;import org.apache.kafka.clients.consumer.KafkaConsumer;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class MyKafkaConsumer {    private static final Logger log = LoggerFactory.getLogger(MyKafkaConsumer.class);    public static void main(String[] args) throws InterruptedException {        //kerberos配置,无认证时,不需要引入         System.setProperty("java.security.krb5.conf","D:/krb5.conf");         System.setProperty("java.security.auth.login.config","D:/lsz_jaas.conf");         Properties props = new Properties();         log.info("**********************************************");         props.put("security.protocol", "SASL_PLAINTEXT");         props.put("sasl.kerberos.service.name", "kafka");         props.put("bootstrap.servers", "172.16.150.xx:9092,172.16.150.xx1:9092,172.16.150.xx2:9092");         //消费者分组,如果一个topic有4个分区,并且一个消费者分组有2个消费者。         //每个消费者消费2个分组         props.put("group.id", "kafka_lsz_1");         //自动提交偏移量,改为false为手动控制偏移量         props.put("enable.auto.commit", "true");         props.put("auto.commit.interval.ms", "1000");//增大poll的间隔,可以为消费者提供更多的时间去处理返回的消息,缺点是此值越大将会延迟组重新平衡         props.put("session.timeout.ms", "30000");         props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");         props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");        // props.put("auto.offset.reset", "earliest");         KafkaConsumer<byte[], byte[]> consumer = new KafkaConsumer<byte[], byte[]>(props);         consumer.seekToBeginning();         consumer.subscribe(Arrays.asList("lsztopic3"));         /**自动提交偏移量*/         while (true) {             //消费者订阅topic后,调用poll方法,加入到组。             //要留在组中,必须持续调用poll方法             ConsumerRecords<byte[], byte[]> records = consumer.poll(100);             for (ConsumerRecord<byte[], byte[]> record : records) {                System.out.println(record.topic()+" --- "+ record.partition());                System.out.printf("offset = %d, key = %s", record.offset(),record.key()+"     \r\n");            }                  }    }}

生产者

package kafka.producer;import java.util.Properties;import org.apache.kafka.clients.producer.Callback;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.ProducerRecord;import org.apache.kafka.clients.producer.RecordMetadata;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class consume {  private static final Logger LOG = LoggerFactory.getLogger(MyKafkaProducer.class);  private static final String TOPIC = "lsztopic3";  public static void main(String[] args) throws Exception {    System.setProperty("java.security.krb5.conf","D:/krb5.conf");    System.setProperty("java.security.auth.login.config","D:/lsz_jaas.conf");    Properties props = new Properties();    props.put("bootstrap.servers", "172.16.150.xx:9092,172.16.150.xx1:9092,172.16.150.xx2:9092");    props.put("producer.type", "async");    // 重试次数    props.put("message.send.max.retries", "3");    // 异步提交的时候(async),并发提交的记录数    props.put("batch.num.messages", "200");    //缓存池大小    props.put("batch.size", "16384");    // 设置缓冲区大小,默认10KB    props.put("send.buffer.bytes", "102400");    props.put("request.required.acks", "1");    props.put("security.protocol", "SASL_PLAINTEXT");    props.put("sasl.kerberos.service.name", "kafka");    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");   // props.put("partitioner.class", "kafka.producer.KafkaCustomPartitioner");    KafkaProducer<String,String> kafkaProducer = new KafkaProducer<String,String>(props);    String key = "";    String value = "";    ProducerRecord<String,String> records = new ProducerRecord<String,String>(TOPIC,key,value);    kafkaProducer.send(records,new Callback(){        public void onCompletion(RecordMetadata metadata, Exception e) {            if(e != null)                e.printStackTrace();            System.out.println("The offset of the record we just sent is: "+metadata.partition() +"  "+ metadata.offset());        }    });    //Thread.sleep(5000);   kafkaProducer.close();  }}

当然,客户端的生产者启动后,命令行消费者同样可以收到消息。不过如果使用kerberos认证后,一定要注意客户端和服务端的时间,kerberos有个时间检验,若两端时间不一致,则消费者收不到消息。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有虫子爬进耳朵怎么办 虫子死在耳朵里怎么办 早上起床口苦口臭怎么办 耳朵被耳屎堵了怎么办 油耳朵被堵住了怎么办 棉签掏耳朵堵了怎么办 耳朵被气堵住了怎么办 掏耳朵发炎了疼怎么办 掏耳朵掏深了疼怎么办 耳朵里进了虫子怎么办? 耳朵里飞进小虫怎么办 一只耳朵听力差怎么办 62岁耳朵有点聋怎么办 一支耳朵有点聋怎么办 80岁老人耳朵聋怎么办 被nlp课程洗脑了怎么办 手上张了个鸡眼怎么办 手上长了个鸡眼怎么办 6岁儿童手指脱皮怎么办 手指骨折后关节僵硬怎么办 手指外伤后关节肿大僵硬怎么办 胳膊骨折了手肿怎么办 耳朵被肘了耳鸣怎么办 耳朵鼓膜外显的怎么办 耳膜破了怎么办为好 耳朵的鼓膜破了怎么办 被打耳鼓膜穿孔怎么办 两只耳朵嗡嗡响怎么办 耳朵长了个脓包怎么办 胸一个大一个小怎么办 把耳朵掏出血了怎么办 掏耳朵戳出血了怎么办 耳朵戳伤流血了怎么办 耳朵挖破出血了怎么办 耳朵让耳屎堵了怎么办 手被牙齿划破了怎么办 耳朵掏伤了很痛怎么办 掏伤耳朵发炎了怎么办 耳朵被掏发炎了怎么办 打的耳洞化脓了怎么办 打了耳洞流脓了怎么办