大数据之Kafka的分区数与多线程消费探讨

本文深入探讨Kafka的分区概念及其与多线程消费的关系。通过实例代码展示,解释了如何实现多线程消费,强调了`num.partitions`设置的重要性,并分析了不同线程池大小、分区数与消费效果之间的联系。同时,文章还讨论了发送端的分区策略对消费的影响,指出正确配置能有效提升消费效率。
摘要由CSDN通过智能技术生成

典型的high-level Consumer的API如下:

这是典型的kafka消费端消费数据的代码,但可以看出这是十分典型的单线程消费。不能直接用在生产实践中。

 Properties props = new Properties();            props.put("zookeeper.connect", "xxxx:2181");            props.put("zookeeper.connectiontimeout.ms", "1000000");            props.put("group.id", "test_group");          props.put("zookeeper.session.timeout.ms", "40000");          props.put("zookeeper.sync.time.ms", "200");          props.put("auto.commit.interval.ms", "1000");
        ConsumerConfig consumerConfig = new ConsumerConfig(props);            ConsumerConnector consumerConnector = Consumer.createJavaConsumerConnector(consumerConfig);

        Map<String, Integer> topicCountMap = new HashMap<String, Integer>();            topicCountMap.put("test", new Integer(1));            //key--topic            Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap =                   consumerConnector.createMessageStreams(topicCountMap);          KafkaStream<byte[], byte[]> stream = consumerMap.get("test").get(0);          ConsumerIterator<byte[], byte[]> it = stream.iterator();          StringBuffer sb = new StringBuffer();          while(it.hasNext()) {              try {                  String msg = new String(it.next().message(), "utf-8").trim();                  System.out.println("receive:" + msg);              } catch (UnsupportedEncodingException e) {                  e.printStackTrace();              }          }

首先,最好理解kafka的基本原理和一些基本概念:

 

这张图比较清晰地描述了“分区”的概念,对于某一个topic的消息来说,我们可以把这组消息发送给若干个分区,就相当于一组消息分发一样。

分区、Offset、消费线程、group.id的关系

1)一组(类)消息通常由某个topic来归类,我们可以把这组消息“分发”给若干个分区(partition),每个分区的消息各不相同;

2)每个分区都维护着他自己的偏移量(Offset),记录着该分区的消息此时被消费的位置;

3)一个消费线程可以对应若干个分区,但一个分区只能被具体某一个消费线程消费;

4)group.id用于标记某一个消费组,每一个消费组都会被记录他在某一个分区的Offset,即不同consumer group针对同一个分区,都有“各自”的偏移量。 

说完概念,必须要注意的一点是,如果你对大数据开发感兴趣,想系统学习大数据的话,可以加入大数据技术学习交流扣群:522数字189数字307获取学习资源必须确认卡夫卡的server.properties里面的一个属性num.partitions必须被设置成大于1的值,否则消费端再怎么折腾,也用不了多线程哦。我这里的环境下,该属性值被设置成10了。

重构一下上述经典的消费端代码:​​​​​​​

public class KafakConsumer implements Runnable {
  
  private ConsumerConfig consumerConfig;  private static String topic="blog";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值