搭建Kafka源码环境并测试

文章目录

  • 一、前言
  • 二、环境准备
  • 三、环境搭建
    • 3.1 JDK 环境搭建
    • 3.2 Scala 环境搭建
      • 3.2.1 配置 Scala 环境变量
      • 3.2.2 验证
    • 3.3 Gradle 环境搭建
      • 3.3.1 配置 Gradle 环境变量
      • 3.3.2 验证
    • 3.4 Zookeeper 环境搭建
      • 3.4.1 配置 Zookeeper 环境变量
      • 3.4.2 验证
    • 3.5 Kafka 源码搭建
      • 3.5.1 导入 Kafka 源码至 IDEA
      • 3.5.2 修改 build.gradle 配置
  • 四、源码代码结构
  • 五、核心 Core 目录代码结构
  • 六、源码部署验证
    • 6.1 core.main 下新建日志配置类
    • 6.2 修改 server.properties
    • 6.3 配置 Run Configurations
    • 6.4 发送、消费 message

一、前言

参考的博客是用的是 Kafka 2.7 版本的,于是我这里也采用 2.7 版本,理由是这个版本还保存着 zookeeper,生产环境比较稳定

二、环境准备

  • JDK:1.8.0_241
  • Scala:2.12.8
  • Gradle:6.6
  • Zookeeper:3.4.14

三、环境搭建

3.1 JDK 环境搭建

直接使用本地环境

3.2 Scala 环境搭建

下载链接:Scala 2.12.8 | The Scala Programming Language (scala-lang.org)

3.2.1 配置 Scala 环境变量

vim ~/.bash_profile# 安装的路径
export SCALA_HOME=/Users/gabriel/Environment/scala-2.12.8
export PATH=$PATH:$SCALA_HOME/binsource ~/.bash_profile

3.2.2 验证

输入 scala -version 看到提示则成功

3.3 Gradle 环境搭建

下载链接:Gradle Distributions

下载版本为 gradle-6.6-bin

3.3.1 配置 Gradle 环境变量

vim ~/.bash_profile# 安装的路径
export GRADLE_HOME=/Users/gabriel/Environment/gradle-6.6
export PATH=$PATH:$GRADLE_HOME/binsource ~/.bash_profile

3.3.2 验证

输入 gradle -version 看到提示则成功

3.4 Zookeeper 环境搭建

下载链接:Index of /dist/zookeeper/zookeeper-3.4.14 (apache.org)

3.4.1 配置 Zookeeper 环境变量

vim ~/.bash_profile# 安装的路径
export ZK_HOME=/Users/gabriel/Environment/zookeeper-3.4.14
export PATH=$PATH:$ZK_HOME/binsource ~/.bash_profile  

创建 data 文件夹用于存放日志数据,并在 cfg 文件中指定

cd zookeeper-3.4.14
mkdir datacd conf
mv zoo_sample.cfg zoo.cfg
# 修改 zoo.cfg 内的配置
dataDir=/Users/gabriel/Environment/zookeeper-3.4.14/data

3.4.2 验证

sh zkServer.sh start

输出提示则成功

3.5 Kafka 源码搭建

下载链接:Apache Kafka

这里选择了 2.7.0 版本

3.5.1 导入 Kafka 源码至 IDEA

Setting 里面需要配置 Gradle Home 为本地地址 /Users/gabriel/Environment/gradle-6.6

3.5.2 修改 build.gradle 配置

这里是我第一次使用 gradle 构建项目,基本原理和 maven 差不多,刚好学习一下

需要把镜像文件下载服务器更换为国内的私服,否则会相当慢,直接导致 “time out” 报错。

进入 kafka 源码包,修改 build.gradle 文件,在原来配置上,添加 ali 私服配置。

buildscript {repositories {maven {url 'https://maven.aliyun.com/nexus/content/groups/public/'}maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}// 插件下载地址maven {url 'https://maven.aliyun.com/repository/gradle-plugin'}}
}allprojects {repositories {maven {url 'https://maven.aliyun.com/nexus/content/groups/public/'}maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}// 插件下载地址maven {url 'https://maven.aliyun.com/repository/gradle-plugin'}}
}

Bug 1:

疯狂报错如下,好像是 gradle 的插件找不到,从对应的阿里云地址也下载不下来

解决方案:在上面配置 maven 下载地址的地方加上专门的插件下载地址

A problem occurred configuring root project 'kafka-2.7.0-src'.
> Could not resolve all artifacts for configuration ':classpath'.> Could not find gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.4.4.Searched in the following locations:- https://maven.aliyun.com/nexus/content/groups/public/gradle/plugin/com/github/spotbugs/snom/spotbugs-gradle-plugin/4.4.4/spotbugs-gradle-plugin-4.4.4.pom- https://maven.aliyun.com/nexus/content/repositories/jcenter/gradle/plugin/com/github/spotbugs/snom/spotbugs-gradle-plugin/4.4.4/spotbugs-gradle-plugin-4.4.4.pom- https://dl.bintray.com/content/netflixoss/external-gradle-plugins/gradle/plugin/com/github/spotbugs/snom/spotbugs-gradle-plugin/4.4.4/spotbugs-gradle-plugin-4.4.4.pomRequired by:project :> Could not find org.gradle:test-retry-gradle-plugin:1.1.6.Searched in the following locations:- https://maven.aliyun.com/nexus/content/groups/public/org/gradle/test-retry-gradle-plugin/1.1.6/test-retry-gradle-plugin-1.1.6.pom- https://maven.aliyun.com/nexus/content/repositories/jcenter/org/gradle/test-retry-gradle-plugin/1.1.6/test-retry-gradle-plugin-1.1.6.pom- https://dl.bintray.com/content/netflixoss/external-gradle-plugins/org/gradle/test-retry-gradle-plugin/1.1.6/test-retry-gradle-plugin-1.1.6.pomRequired by:project :Possible solution:- Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

然后直接点右上角的小图标下载依赖

依赖下载完以后需要编译源代码(源代码中可以看到编译的 build 目录),这样子后面部署 kafka.Kafka 启动类然后使用脚本创建 producer、consumer 的时候,才能成功。手动输入命令如下:

./gradlew clean build -x test

或者直接右侧 gradle build,不过其中需要经过很多 test 测试,上面手动跳过

四、源码代码结构

在这里插入图片描述

重点看下其中几个重要的模块:

  • bin 目录:保存 Kafka 工具脚本,包括 kafka-server-start 和 kafka-console-producer 等脚本都存放在这里

  • clients 目录:保存 Kafka 客户端代码,比如生产者和消费者的代码都在该目录下(对于 Kafka 而言都是客户端)

  • config 目录:保存 Kafka 的配置文件,其中比较重要的配置文件是 server.properties

  • connect 目录:保存 Connect 组件的源代码。 Kafka Connect 组件是用来实现 Kafka 与外部系统之间的实时数据传输的。

  • core 目录:保存 Broker 端代码。Kafka 服务器端代码全部保存在该目录下(这对于 Kafka 而言是服务端)

  • generator 目录:Kafka 消息类处理模块,主要是根据 clients 模块下的 message json 文件生成对应的 java 类,在 build.gradle 文件中,可以看到定义了一个任务 processMessages

  • raft 目录:raft 一致性协议相关。

五、核心 Core 目录代码结构

在这里插入图片描述

  • admin 包:执行管理命令的功能;
  • api 包:封装请求和响应 DTO 对象;
  • cluster 包:集群对象,例如 Partition 类代表一个分区,Replica 类代表一个分区副本;
  • common 包:通用类,比如异常类
  • consumer 包:只有一个类 BaseConsumerRecord,后面会丢弃该包,用 clients 包下 org.apache.kafka.clients.consumer.ConsumerRecord 代替;
  • controller 包: 和 kafkaController(kc)相关的类,重点模块,一个kafka集群只有一个leader kafkaController,该kafkaController负责分区管理,副本管理,并保证集群信息在集群中同步;
  • coordinator 包:保存了消费者端的 GroupCoordinator 代码和用于事务的 TransactionCoordinator 代码。对 coordinator 包进行分析,特别是对消费者端的 GroupCoordinator 代码进行分析,是 Broker 端协调者组件设计原理的关键;
  • log 包:保存了 Kafka 最核心的日志结构代码,包括日志、日志段、索引文件等, 另外,该包下还封装了 Log Compaction 的实现机制,是非常重要的源码包;
  • network 包:封装了 Kafka 服务器端网络层的代码,特别是 SocketServer.scala 这个文件,是 Kafka 实现 Reactor 模式的具体操作类,非常值得一读;
  • server 包:顾名思义,它是 Kafka 的服务器端主代码,里面的类非常多,很多关键的 Kafka 组件都存放在这里,比如状态机、Purgatory 延时机制等;
  • tools 包:工具类。

六、源码部署验证

最终其实就是在第三章编译完 kafka 所有文件的基础上,要启动 core 目录下和 broker 相关的类,启动类就是 kafka-2.7.0-src/core/src/main/scala/kafka/Kafka.scala

6.1 core.main 下新建日志配置类

在 core/main 下新建 resources 目录,再将 config/log4j.properties 拷贝到该目录下
在这里插入图片描述

这是为了避免启动报错“SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder””

6.2 修改 server.properties

修改 server.properties 中的 log.dirs 值,变为本地目录,

/Users/gabriel/Desktop/DiveinCode/kafka-2.7.0-src 下新建 kafka-logs 目录,修改配置如下

log.dirs=/Users/gabriel/Desktop/DiveinCode/kafka-2.7.0-src/kafka-logs

6.3 配置 Run Configurations

在这里插入图片描述

6.4 发送、消费 message

上面已经搭建好 Kafka Broker 的部署环境,并且编译成功了所有和 producer、consumer 有关的文件类,现在使用 Kafka 自带的脚本工具测试 producer 和 consumer

整体流程如下:

  1. 创建 topic

    进入 kafka-2.7.0-src/bin 通过 kafka-topics.sh 命令来创建一个名为 topicjxz 的 topic(前提代码已经 build 编译完),zookeeper 的地址我是先通过 sh zkServer.sh start 启动,然后 zkCli 启动客户端找到的:

    sh kafka-topics.sh --zookeeper localhost:2181 --create --topic topicjxz --replication-factor 1 --partitions 1
    

在这里插入图片描述

  1. 通过 kafka-console-consumer.sh 命令启动一个命令行的 consumer 来消费 topicjxz 这个 topic
sh kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topicjxz

在这里插入图片描述

  1. 重新启动一个命令行终端,通过 kafka-console-producer.sh 命令启动一个命令行的 producer 向 topicjxz 这个 topic 中生产数据
sh kafka-console-producer.sh --bootstrap-server localhost:9092 --topic topicjxz

在这里插入图片描述
在这里插入图片描述

至此,我们发现已经将整个 producer、broker、consumer 的链路部署起来并测试成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CKEditor编辑器的简单使用方法,取值,赋值

先从官网下载包。CKEditor 4 - Download Latest Version. 一&#xff1a;在项目里引用JQ基础包和CK的JS包 <script src"/JS/jquery-3.4.1.js?v1.0"></script><script src"/ckeditor/ckeditor.js"></script> 二&#xff1a;在表…

Codeforces Round 942 (Div. 2) ----- A ----- F --- 题解

前情提要&#xff1a;因为数学水平原因&#xff0c;没法给出e的证明&#xff0c;因为我也是举例归类得出的结论&#xff0c;但是按理来说应该可以利用生成数函数证明 f题也是因为数学原因加上水平有限&#xff0c;我的理解可能有偏差。 目录 A. Contest Proposal&#xff1a…

CocoaPods:iOS项目依赖管理的利器

CocoaPods&#xff1a;iOS项目依赖管理的利器 一、引言 在iOS项目的开发过程中&#xff0c;我们经常需要集成各种第三方库来快速实现某些功能&#xff0c;如网络请求、UI组件、数据处理等。然而&#xff0c;手动管理这些第三方库的版本、依赖和更新是一个繁琐且容易出错的过程…

Linux内核常用调优参数

Linux内核常用调优参数 vi /etc/sysctl.conf net.core.rmem_default 256960 net.core.rmem_max 513920 net.core.wmem_default 256960 net.core.wmem_max 513920 net.core.netdev_max_backlog 2000 net.core.somaxconn 2048 net.core.optmem_max 81920 net.ipv4.tcp_m…

图像处理的一些操作(1)

图像处理 1.安装PIL&#xff0c;skimage库1.1导入skimage库中的oi模块和data模块 2.读取图像文件2.1读取图像文件2.2 以灰度模式读取图像2.3 查看示例图像的目录路径2.4 读取chelsea图片2.5 加载示例图片并保存2.6 获得加载图片的信息2.6.1 输出图片类型2.6.2 输出图片尺寸2.6.…

论文速递 | Operations Research 3月文章合集(上)

编者按 在本系列文章中&#xff0c;我们梳理了运筹学顶刊Operations Research在2024年3月份发布的18篇文章的基本信息&#xff0c;旨在帮助读者快速洞察领域新动态。本文为第一部分。 推荐文章1 ● 题目&#xff1a;Optimal Diagonal Preconditioning 最优对角预条件化 ● …

MySQL数据库练习(17)

schooldb库——utf8字符集——utf8_general_ci排序规则 81. DDL CREATE TABLE styles (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,styleSys varchar(20) DEFAULT NULL COMMENT 系统类型(home:PC),styleName varchar(255) NOT NULL COMMENT 风格名称,styleAuthor va…

企业网站必看——企业级OV SSL证书详细介绍

组织验证&#xff08;Organization Validation&#xff0c;简称OV&#xff09;SSL证书作为网络安全解决方案的重要组成部分&#xff0c;通过提供中级的安全保障和增强的网站身份验证&#xff0c;有效提升了网站的安全级别与用户信赖度。本文将深入探讨OV SSL证书的工作原理、申…

SQL常用语句与事务介绍

文章目录 基本语法常见用法实用语句事务 基本语法 SELECT&#xff1a;用于从数据库表中检索数据。 语法&#xff1a;SELECT column1, column2, ... FROM table_name;INSERT INTO&#xff1a;用于向数据库表中插入新行。 语法&#xff1a;INSERT INTO table_name (column1, col…

面试:Spring(IOC、AOP、事务失效、循环引用、SpringMVC、SpringBoot的自动配置原理、Spring框架常见注解)

目录 一、Spring的单例Bean是否是线程安全的&#xff1f; 二、什么是AOP 1、介绍 &#xff08;1&#xff09;记录操作日志 &#xff08;2&#xff09;实现Spring中的事务 三、spring中事务失效的场景有哪些&#xff1f; 1、异常捕获处理 2、抛出检查异常 3、非public方…

nginx配置tcp长连接实现集群

注意&#xff1a;实际工程应该会用docker部署。 安装nginx sudo apt install libpcre3-dev zlib1g openssl -y wget https://nginx.org/download/nginx-1.26.0.tar.gz #安装到/home/gyl/workspace/mprpc/vendor/nginx-1.26.0下 tar xfzv nginx-1.26.0.tar.gz && cd n…

MATLAB初学者入门(29)—— 傅里叶分析

傅里叶分析是一种强大的数学工具&#xff0c;用于分解信号为正弦和余弦组成部分。在MATLAB中&#xff0c;可以使用多种方法进行傅里叶分析&#xff0c;包括快速傅里叶变换&#xff08;FFT&#xff09;和功率谱密度估计等。这些方法非常适用于信号处理、振动分析、音频处理等领域…

香港Web3,步履蹒跚

4月30日&#xff0c;6支香港虚拟资产现货ETF在香港交易所敲钟上市&#xff0c;正式迎来市场首秀。 而在前一周&#xff0c;香港证监会&#xff08;SFC&#xff09;官网就已列出华夏基金(香港)、博时国际和嘉实国际三家基金公司的比特币和以太坊现货ETF&#xff0c;并陆续披露了…

[ log日志画图]分割模型训练结束生成相关日志运用代码画图

文章目录 [ log日志画图]分割模型训练结束生成相关日志运用代码画图我的log文件&#xff1a;画图&#xff1a;1.loss1.1 loss是干嘛的1.2 代码1.3 生成图 2.DICE.IOU2.1 DICE,IOU是干嘛的(常规介绍)2.2 代码2.3 生成图小白tip [ log日志画图]分割模型训练结束生成相关日志运用代…

python 怎么调用R

如何在python中调用R&#xff1f;这其中包括了如何调用R的对象&#xff08;函数和包&#xff09;&#xff0c;R和python的对象如何互相转换&#xff0c;以及如何调用R的脚本&#xff08;外界参数的输入&#xff09;。python提供了一个模块rpy2&#xff0c;可以较好地完成这项工…

关于海康相机和镜头参数的记录

对比MV-CS020-10UC和大家用的最多的MV-CS016-10UC 其实前者适合雷达站使用&#xff0c;后者适合自瞄使用 一&#xff1a;MV-CS020-10UC的参数 二&#xff1a;对比 三&#xff1a;海康镜头选型工具

【刷爆力扣之二叉树】102. 二叉树的层序遍历

102. 二叉树的层序遍历 二叉树的层序遍历需要队列数据结构&#xff0c;还需要记录每一层节点的个数&#xff0c;可以定义一个变量记录&#xff0c;也可以直接使用队列中元素个数表示每一层的节点个数&#xff0c;每次获取队列头中的节点后&#xff0c;需要判断该节点是否有左右…

Java 基础重点知识-(泛型、反射、注解、IO)

文章目录 什么是泛型? 泛型有什么用?泛型原理是什么? Java 反射什么是反射? 反射作用是什么?动态代理有几种实现方式? 有什么特点? Java 注解什么是注解, 作用是什么? Java I/O什么是序列化?Java 是怎么实现系列化的?常见的序列化协议有哪些?BIO/NIO/AIO 有什么区别…

面试八股——HashMap

实现原理 红黑树是为了解决链表过长之后&#xff0c;查找时间过长的问题&#xff0c;将链表存储变为红黑树存储。 put方法的实现&#xff08;5⭐&#xff09; 相关属性&#xff1a; 1. 容量&#xff1a;初始容量为2^4。 2. 加载因子&#xff1a;初始值为0.75 上面两个属性的…

【面试经典 150 | 回溯】单词搜索

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;回溯 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…