个人笔记。
Kafka只提供了topic,如果想实现queue的模式,那么需要通过consumergroup的方式。如果所有的consumer都在一个group,那么这个topic的消息只会被这个group里面的一个consumer消费。
如果想实现发布-订阅的模式,则每个consumer设置不同的group即可。
消息的分区有序
每个消费者对应一个分区,则每个分区的消费只有一个消费者消费,则可以保证有序,同时又有多个分区,还可以达到负载均衡的目的。
分区数等于消费者数量
分区数小于消费者数,会导致消费者被闲置。
分区数大于消费者数
kafka说明
整合spring一起使用时,配置的并发数即对应的consumer, 即消费线程,不是部署的机器
spring:
kafka:
listener:
concurrency: 10
Kafka持续收集日志(当然也可以使用flume,它支持的source很多)
tail -F /tmp/test.txt |./kafka-console-producer.sh --broker-list localhost:9092 --topic connect-test
用tail –F,这样当log新建的时候依然可用,然后加上pipeline,发送到指定的topic
简单整合kafka和storm
<storm.version>1.0.1</storm.version>
<kafka.version>0.10.0.0</kafka.version>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>${storm.version}</version>
<!-- <scope>provided</scope> -->
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-kafka</artifactId>
<version>${storm.version}</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>${kafka.version}</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>${kafka.version}</version>
</dependency>
Topology
TopologyBuilder builder = new TopologyBuilder();
ZkHosts hosts = new ZkHosts("127.0.0.1:2181");
SpoutConfig sc = new SpoutConfig(hosts, "connect-test", "/kafkaSpoutOffset", "StormStarter-1");
sc.scheme = new StringMultiSchemeWithTopic();
sc.zkServers = Arrays.asList("127.0.0.1");
sc.zkPort = 2181;
//最开始并没有设置上面的2个属性,导致每次重启,kafkaSpout都会从最开始来消费消息,原来需要配置额外再陪一下zk来存储offset, 而SpoutConfig的第三个参数也是对应的offset的path,之前一直以为的kafka broker的zk path来着。记录一下。
builder.setSpout("logSender", new KafkaSpout(sc), 1);
builder.setBolt("logSpliter", new SeperateLogBolt(), 1).shuffleGrouping("logSender");
//SeperateLogBolt对log过滤,拿到log的message。
builder.setBolt("logAnasysis", new AnalyseLogBolt(), 1).shuffleGrouping("logSpliter");
//AnalyseLogBolt就是对最终的log message进行分析并将结果写入存储。
Config conf = new Config();
conf.setDebug(true);
if (args != null && args.length > 0) {
conf.setNumWorkers(3);
StormSubmitter.submitTopologyWithProgressBar(args[0], conf, builder.createTopology());
} else {
conf.setMaxTaskParallelism(3);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("string-demo", conf, builder.createTopology());
TimeUnit.MINUTES.sleep(30L);
cluster.shutdown();
}