云计算大数据之 Java 操作 Kafka
版权声明:
本文为博主学习整理原创文章,如有不正之处请多多指教。
未经博主允许不得转载。https://blog.csdn.net/qq_42595261/article/details/83377837
Kafka常用命令
启动zookeeper服务(笔者存放路径为/root/abc)
nohup zookeeper-server-start.sh /root/abc/kafka_2.11-0.10.0.1/config/zookeeper.properties &
启动kafka服务
nohup kafka-server-start.sh /root/abc/kafka_2.11-0.10.0.1/config/server.properties &
创建主题(副本数在后面进行修改)
kafka-topics.sh --create --zookeeper localhost:2181 --topic mytopic --partitions 1 --replication-factor 1
查看所有的主题信息
kafka-topics.sh --describe --zookeeper localhost:2181
查看指定主题信息
kafka-topics.sh --describe --zookeeper localhost:2181,localhost2:2181,localhost3:2181 --topic mytopic1
生成数据
kafka-console-producer.sh --broker-list localhost:9092 --topic mytopic
消费数据
kafka-console-consumer.sh --zookeeper localhost:2181 --topic mytopic
停止kafka
bin/kafka-server-stop.sh
停止zookeeper
bin/zookeeper-server-stop.sh
描述topic
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
删除topic(慎用,只会删除zookeeper中的元数据,消息文件须手动删除)
bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic topicname
删除topic中存储的内容在config/server.properties中找到如下的位置
# A comma seperated list of directories under which to store log files
log.dirs=/tmp/kafka-logs
查看topic某分区偏移量最大(小)值
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic hive-mdatabase-hostsltable --time -1 --broker-list node86:9092 --partitions 0
注: time为-1时表示最大值,time为-2时表示最小值
增加topic分区数
为topic t_cdr 增加10个分区
bin/kafka-topics.sh --zookeeper node01:2181 --alter --topic t_cdr --partitions 10
查看topic消费进度
这个会显示出consumer group的offset情况, 必须参数为--group, 不指定--topic,默认为所有topic
Displays the: Consumer Group, Topic, Partitions, Offset, logSize, Lag, Owner for the specified set of Topics and Consumer Group
bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker
Example,
bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --group pv
Group Topic Pid Offset logSize Lag Owner
pv page_visits 0 21 21 0 none
pv page_visits 1 19 19 0 none
pv page_visits 2 20 20 0 none
史上最全KafKa原理介绍:
Zookeeper单节点安装
1、解压zookeeper
tar -zxvf zookeeper-3.4.9.tar.gz
2、重命名 zoo_sample.cfg 为 zoo.cfg
vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/logs
clientPort=2181
配置解析:
tickTime: zookeeper中使用的基本时间单位, 毫秒值.
dataDir: 数据目录. 可以是任意目录.
dataLogDir: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同的设置.
clientPort: 监听client连接的端口号.
启动:
zookeeper_home/bin/zkServer.sh start
查看服务: jps
5321 QuorumPeerMain
5338 Jps
查看运行状态:
zookeeper_home/bin/zkServer.sh status
zookeeper集群安装
需要在三台服务器上安装zookeeper,向在某一台上安装好之后通过scp的方式发送到其它主机
进入到conf目录:/usr/local/apps/zookeeper-3.4.9/conf
修改配置文件名称:mv zoo_sample.cfg zoo.cfg
修改zk的数据目录:dataDir=/opt/zookeeper/data
tickTime=2000
dataDir=/opt/zookeeper/data / / 此路径为新建路径,需提前新建
clientPort=2181
initLimit=10
syncLimit=5
server.1=master:2888:3888
server.2=node1:2888:3888
server.3=node2:2888:3888
在数据目录下,创建一个myid文件。内容为server.后的这个编号
如下面的操作。在keduox02主机上需要在数据目录中创建一个myid文件,内容为2
java 操作 KafKa
新建maven项目之前需要先安装该关系依赖
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.10</artifactId>
<version>0.10.0.0</version>
</dependency>
java操作生产者
Properties props = new Properties();
//指定连接的服务器集群
props.put("bootstrap.servers", "localhost1:9092,localhost2:9092,localhost3:9092");
//key和value进行序列化
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "all");
props.put("buffer.memory", 33554432);
//实例化生产者对象
//Producer<String, String> producer = new KafkaProducer(props);
KafkaProducer producer = new KafkaProducer(props);
for (int i = 0; i < 100; i++) {
//向生产者中写入数据
String key = "key"+i;
String data = "hello data"+key;
producer.send(new ProducerRecord("mytopic1",key,data));
System.out.println("key "+key+"value "+data);
}
producer.close();
java操作消费者
//连接服务器的地址
Properties props = new Properties();
props.put("bootstrap.servers", "localhost1:9092,localhost2:9092,localhost3:9092");
props.put("group.id", "group001");
//如果value合法,则自动提交偏移量
props.put("enable.auto.commit", "true");
//设置多久一次更新被消费消息的偏移量
props.put("auto.commit.interval.ms", "1000");
//设置会话响应的时间,超过这个时间kafka可以选择放弃消费或者消费下一条消息
props.put("session.timeout.ms", "30000");
//自动重置offset
props.put("auto.offset.reset","earliest");
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<>(props);
consumer.subscribe(Arrays.asList("mytopic1"));
while (true) {
//读取数据的超时时间
ConsumerRecords<String, String> records = consumer.poll(100);
//遍历拿到的数据
for (ConsumerRecord<String, String> record : records)
System.out.println(record.value());
}
错误解决
代码没错,直接运行,能运行成功,但是生产者无法将数据写入topic中,消费者也无法从topic中拿到数据。需要在kafka的server.properties中新增配置项。解决办法网址链接:
https://blog.csdn.net/zhaominpro/article/details/79068141
我 是 有 底 线 的