大数据学习笔记——Kafka Offset Monitor监控及简单的Kafka项目搭建

  • Kafka Offset Monitor监控

    kafka Offset Monitor用来监控你的Kafka消费者和他们的偏移量。你能够看到每一个消费者组在它们正在消费的每一个topic组的每一个topic的偏移量。有助于理解消费的速度以及日志增长的速度。
    下载地址https://github.com/BangpengGao/kafka-offset-monitor。

  1. 安装
    github中可以选择下载源代码自行进行编译或直接在releases中下载已经编译好的程序jar包。
    PS:当采用已编译好的程序jar包时,要首先修改其中的前端页面代码,因为其中引入了google的部分依赖。需要将offsetapp/index.html中的
    
    
    

修改为

    
    
    

  1. 启动和配置
    #!/bin/bash
    java -Xms512M -Xmx512M -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m\
    	-cp KafkaOffsetMonitor-assembly-0.3.0-SNAPSHOT.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb\
    	--offsetStorage kafka\
    	--zk 127.0.0.1:2181\
    	--port 9001\
    	--dbName kafka\
    	--refresh 10.seconds\
    	--retain 7.days 1>/export/logs/kafkamonitor/stdout.log 2>/export/logs/kafkamonitor/stderr.log &

参数说明:

  • –offsetStorage,可选参数为zookeeper、kafka、storm,默认是zookeeper。
    PS:当前kafka将偏移量存储在kafka中,如果选择Zookeeper,将监测不到任何数据
  • –zk 集群服务器IP,多个采用英文逗号“,”隔开
  • –port 对外开发的端口号,用于监控界面的访问
  • –dbName 监控数据存储地址,默认当前路径下的offsetapp
  • –refresh 自动刷新间隔
  • –retain 日志保持时间及日志路径设置
  1. 查看
    监控首页与Consumer Groups界面相同
    大数据学习笔记——Kafka Offset Monitor监控及简单的Kafka项目搭建_第1张图片
    选择一个Consumer group,点进去之后的界面
    大数据学习笔记——Kafka Offset Monitor监控及简单的Kafka项目搭建_第2张图片
    Topics List界面
    大数据学习笔记——Kafka Offset Monitor监控及简单的Kafka项目搭建_第3张图片
    选择一个Topic,点击之后的界面
    大数据学习笔记——Kafka Offset Monitor监控及简单的Kafka项目搭建_第4张图片
    点击其中的已激活的消费者名称,进入如下界面
    大数据学习笔记——Kafka Offset Monitor监控及简单的Kafka项目搭建_第5张图片
    通过Visualizations下的Active Topic Consumers进入已激活的消费者统计界面,能详细看出,每一个Topic对应的激活的消费者组名称。
    大数据学习笔记——Kafka Offset Monitor监控及简单的Kafka项目搭建_第6张图片
  • Maven配置

    因为这只是一个简单的测试项目,Maven配置十分简单。以Spring Boot为基础,引入log模块lombok,spring-kafka以及spring-kafka-test框架。具体情况,请见下发代码块:

    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0modelVersion>
    	<parent>
    		<groupId>org.springframework.bootgroupId>
    		<artifactId>spring-boot-starter-parentartifactId>
    		<version>2.1.8.RELEASEversion>
    		<relativePath/> 
    	parent>
    	<groupId>com.kafkalearngroupId>
    	<artifactId>kafkalearnartifactId>
    	<version>0.0.1-SNAPSHOTversion>
    	<name>kafkalearnname>
    	<description>Demo project for Spring Bootdescription>
    
    	<properties>
    		<java.version>1.8java.version>
    	properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starterartifactId>
    		dependency>
    		<dependency>
    			<groupId>org.springframework.kafkagroupId>
    			<artifactId>spring-kafkaartifactId>
    		dependency>
    
    		<dependency>
    			<groupId>org.projectlombokgroupId>
    			<artifactId>lombokartifactId>
    			<optional>trueoptional>
    		dependency>
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-testartifactId>
    			<scope>testscope>
    		dependency>
    		<dependency>
    			<groupId>org.springframework.kafkagroupId>
    			<artifactId>spring-kafka-testartifactId>
    			<scope>testscope>
    		dependency>
    	dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.bootgroupId>
    				<artifactId>spring-boot-maven-pluginartifactId>
    			plugin>
    		plugins>
    	build>
    
    project>
    
    
  • 生产者

    生产者部分的代码非常简单,首先通过Properties创建好Producer的参数,比如:bootstrap.servers(kafka服务器地址及端口)、acks(请求设置确认)、retries(失败重试次数)、batch.size(批量的大小)、buffer.memory(缓冲池的大小)、key.serializer(key的序列化方式)、value.serializer(value的序列化方式)等。如果缺少哪部分的配置,在运行时会有报错提示。

    本文仅写了一个简单样例,向kafka服务器发送递增的Integer数字,其中key和value相同,代码如下:

    import lombok.extern.slf4j.Slf4j;
    import org.apache.kafka.clients.producer.KafkaProducer;
    import org.apache.kafka.clients.producer.Producer;
    import org.apache.kafka.clients.producer.ProducerRecord;
    
    import java.util.Properties;
    
    @Slf4j
    public class KfkProducer {
    
        private static final String TOPIC = "test";
    
        public static void main(String[] args) throws InterruptedException {
            Properties properties = new Properties();
            properties.put("bootstrap.servers", "localhost:9092");
            properties.put("acks", "all");
            properties.put("retries", 0);
            properties.put("batch.size", 16384);
            properties.put("linger.ms", 1);
            properties.put("buffer.memory", 33554432);
            properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            Producer producer = new KafkaProducer(properties);
    
            int send = 0;
            while (true) {
                producer.send(new ProducerRecord(TOPIC, Integer.toString(send), Integer.toString(send)));
                log.info("Message send successfully");
                Thread.sleep(1000 * 3);
                if (send == Integer.MAX_VALUE)
                    send = 0;
                else
                    send += 1;
            }
        }
    }
    
  • 消费者

    消费者部分也需要通过Properties进行参数配置,例如:bootstrap.servers(kafka服务器地址及端口)、group.id(消费者组,可用已有的或新建)、enable.auto.commit(是否自动提交)、auto.commit.intervals.ms(自动提交的时间)、session.timeout.ms(连接超时的时间)、key.serializer(key的序列化方式)、value.serializer(value的序列化方式)等。

    本文书写一个简单的样例,具体代码如下:

    import lombok.extern.slf4j.Slf4j;
    import org.apache.kafka.clients.consumer.ConsumerRecord;
    import org.apache.kafka.clients.consumer.ConsumerRecords;
    import org.apache.kafka.clients.consumer.KafkaConsumer;
    
    import java.util.Arrays;
    import java.util.Properties;
    
    @Slf4j
    public class KfkConsumer {
    
        private static final String TOPIC = "test";
    
        public static void main(String[] args) throws InterruptedException {
            Properties properties = new Properties();
            properties.put("bootstrap.servers", "10.163.202.9:9092");
            properties.put("group.id", "group.test");
            properties.put("enable.auto.commit", "true");
            properties.put("auto.commit.intervals.ms", "1000");
            properties.put("session.timeout.ms", "30000");
            properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
            properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    
            KafkaConsumer consumer = new KafkaConsumer(properties);
            consumer.subscribe(Arrays.asList(TOPIC));
            log.info("Message subscribe successfully!");
    
            int s = 0;
            while (true) {
                ConsumerRecords cons = consumer.poll(100);
                for (ConsumerRecord cr : cons) {
                    log.info("consumer record, key={}, content={}", cr.key(), cr.value());
                }
                Thread.sleep(3 * 1000);
            }
        }
    }
    

你可能感兴趣的:(Big,Data)