kafka简介
Kafka是分布式发布-订阅消息系统,最初由LinkedIn公司开发,之后成为之后成为Apache基金会的一部分,由Scala和Java编写。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。
它与传统系统相比,有以下不同:
它被设计为一个分布式系统,易于向外扩展;
它同时为发布和订阅提供高吞吐量;
它支持多订阅者,当失败时能自动平衡消费者;
它将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序
基础概念
Broker:Kafka集群包含一个或多个服务器,这些服务器就是Broker
Topic:每条发布到Kafka集群的消息都必须有一个Topic
Partition:是物理概念上的分区,为了提供系统吞吐率,在物理上每个Topic会分成一个或多个Partition,每个Partition对应一个文件夹
Producer:消息产生者,负责生产消息并发送到Kafka Broker
Consumer:消息消费者,向kafka broker读取消息并处理的客户端。
Consumer Group:每个Consumer属于一个特定的组,组可以用来实现一条消息被组内多个成员消费等功能。
安装kafka
1、下载包,可以网页下载也可以直接命令下载
wget http://mirror.bit.edu.cn/apache/kafka/1.0.0/kafka_2.11-1.0.0.tgz //命令下载
2、解压到指定文件夹如/opt下
tar -zxvf kafka_2.11-1.0.0.tgz -C /opt
这是解压后/opt/kafka_2.11-1.0.0目录下的文件结构,bin下面是kafka的相关脚本,config是kafka的配置文件
3、进入到config修改配置文件,修改服务端配置文件server.properties
vi server.properties
broker.id=1 //broker唯一标识,每个服务器各不相同
port=9092 //kafka端口号,默认9092
host.name=116.62.50.230 //服务器ip
log.dirs=/home/kafka/logs //kafka日志输出路径
zookeeper.connect=118.178.125.153:2181,116.62.50.230:2181 //集群zk的地址
功能验证
1、启动服务,先启动zk服务(这里不详述),再启动kakfa
进入/opt/kafka_2.11-1.0.0目录下,运行下面命令
bin/kafka-server-start.sh config/server.properties
执行完使用jps命令查看服务是否启动
如果进程中有Kafka则说明启动成功,如果没有,可能是zk没启动、jdk版本过低、端口没有开放等问题
2、创建topic
bin/kafka-topics.sh –create –zookeeper localhost:2181 –replication-factor 1 –partitions 1 –topic test3
3、查看topic
bin/kafka-topics.sh –list –zookeeper localhost:2181
4、生产者发送消息到topic
执行bin/kafka-console-producer.sh –broker-list localhost:9092 –topic test3
发送消息可能报错,原因是kafka配置文件中host.name配成ip,需要改成对应ip
bin/kafka-console-producer.sh –broker-list 116.62.50.230:9092 –topic test3
5、消费者读取消息
bin/kafka-console-consumer.sh –zookeeper localhost:2181 –topic test3 –from-beginning
6、删除topic
bin/kafka-topics.sh –delete –zookeeper localhost:2181 –topic test3 //删除
bin/kafka-topics.sh –describe –zookeeper localhost:2181 –topic test3//查看topic是否删除
java实现生产者和消费者
1、引入jar包
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>1.0.0</version>
</dependency>
这里artifactId和version和kafka的版本对应,如kafka_2.11-1.0.0.tgz
2、生产者
Properties props = new Properties();
props.put("bootstrap.servers", "118.17.15.13:9092,112.62.33.211:9092");
props.put("client.id", "TestKafka");
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<String, String>(props);
for (int i = 0; i < 100; i++)
producer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i), "kafka"+Integer.toString(i)));
producer.close();
3、消费者
Properties props = new Properties();
props.put("bootstrap.servers", "118.17.15.13:9092,112.62.33.211:9092");
props.put("group.id", "test-consumer-group");
props.put("enable.auto.commit", "true");
props.put("session.timeout.ms", "30000");
props.put("auto.offset.reset", "earliest");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
consumer.subscribe(Arrays.asList("my-topic"));
ConsumerRecords<String, String> records = consumer.poll(1000);
for (ConsumerRecord<String, String> record : records)
System.out.println(record.value());
4、经验
遇到问题:可以生成,但是无法消费,原因可能如下
kafka的config配置文件,consumer.properties文件里的group.id=test-consumer-group需要改成一致;确保生产者实例化Properties配置文件设置正确,少了几个也是无法消费;不同的版本以及引用jar包也是不一样,需要一致;注意配置文件ip地址、端口等;请求数据时超时时间设置太短如consumer.poll(100)。