范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

聊聊Kafka编译Kafka源码并搭建源码环境

  一、前言
  老周这里编译 Kafka 的版本是 2.7,为啥采用这个版本来搭建源码的阅读环境呢?因为该版本相对来说比较新。而我为啥不用 2.7 后的版本呢?比如 2.8,这是因为去掉了 ZooKeeper,还不太稳定,生产环境也不太建议使用,所以以 2.7 版本进行源码搭建并研究。 二、环境准备JDK:1.8.0_241 Scala:2.12.8 Gradle:6.6 Zookeeper:3.4.14 三、环境搭建
  3.1 JDK 环境搭建
  这个就不用我说了吧,搞 Java 的本机都有 JDK 环境。
  3.2 Scala 环境搭建
  下载链接:https://www.scala-lang.org/download/2.12.8.html
  这里老周是 Mac OS 系统,这里大家看着自己的系统来下就好了哈。
  3.2.1 配置 Scala 环境变量
  终端输入以下命令进行编辑: vim ~/.bash_profile  # 这里的路径是你安装 SCALA_HOME=/Users/Riemann/Tools/scala-2.12.8 export SCALA_HOME export PATH=$PATH:$SCALA_HOME/bin  # 使环境变量生效,在命令行执行。 source  ~/.bash_profile
  3.2.2 验证
  终端输入以下命令: scala -version
  出现以下提示,说明 Scala 环境搭建成功。
  3.3 Gradle 环境搭建
  首先来到 Gradle官网:https://services.gradle.org/distributions/
  如下图:
  我们选择想要安装的发布版本,gradle-x.x-bin.zip 是需要下载的安装发布版,gradle-x.x-src.zip 是源码,gradle-x.x-all.zip 则是下载全部的文件。 我本地为 gradle-6.6。
  Gradle下载的源码不需要安装,我们将下载的压缩包在本机的目录下直接解压即可,解压后的目录如下图所示。
  3.3.1 配置 Gradle 环境变量
  终端输入以下命令进行编辑: vim ~/.bash_profile  # 这里的路径是你安装 GRADLE_HOME=/Users/Riemann/Tools/gradle-6.6 export GRADLE_HOME export PATH=$PATH:$GRADLE_HOME/bin  # 使环境变量生效,在命令行执行。 source  ~/.bash_profile
  3.3.2 验证
  终端输入以下命令: gradle -v
  出现以下提示,说明 Gradle 环境搭建成功。
  3.4 Zookeeper 环境搭建
  Zookeeper 环境老周在 Linux 环境已经搭建好了的,直接用。这里我也给出搭建的步骤,不管你是啥系统,都是类似的~
  3.4.1 下载 wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
  3.4.2 解压 tar -zxvf zookeeper-3.4.14.tar.gz
  3.4.3 进入 zookeeper-3.4.14 目录,创建 data 文件夹  cd zookeeper-3.4.14   mkdir data
  3.4.4 修改配置文件 cd conf mv zoo_sample.cfg zoo.cfg
  3.4.5 修改 zoo.cfg 中的 data 属性 dataDir=/root/zookeeper-3.4.14/data
  3.4.6 zookeeper 服务启动
  进入 bin 目录,启动服务输入命令 ./zkServer.sh start
  输出以下内容表示启动成功
  3.5 Kafka 源码环境搭建
  官网下载对应版本的源码包,网址:http://kafka.apache.org/downloads
  下载完后解压,这个源码文件还需要导入依赖 jar 包,个人使用 IDEA 来 import 导入项目,导入完后需使用前面配置好的 gradle 作为 Gradle home 地址。
  3.5.1 导入 Kafka 源码至 IDEA
  3.5.2 修改 build.gradle
  接下来还不能导 jar 包,需要把镜像文件下载服务器更换为国内的私服,否则会相当慢,直接导致 "time out" 报错。
  进入 kafka 源码包,修改 build.gradle 文件,在原来配置上,添加 ali 私服配置。 buildscript {     repositories {         maven {             url "http://maven.aliyun.com/nexus/content/groups/public/"         }         maven {             url "http://maven.aliyun.com/nexus/content/repositories/jcenter"         }     } }  allprojects {     repositories {         maven {             url "http://maven.aliyun.com/nexus/content/groups/public/"         }         maven {             url "http://maven.aliyun.com/nexus/content/repositories/jcenter"         }     } }
  3.5.3 代码构建
  可以用命令来构建,也可以在 idea 图形界面的 gradle 来构建,这里肯定是 idea 图形化界面操作更简单,但这里也提供 gradle 的命令来构建。 ./gradlew clean build -x test
  去找一下直接下载 Wrapper 所需的 Jar 包,手动把这个 Jar 文件拷贝到 kafka 路径下的 gradle/wrapper 子目录下,然后重新执行 gradlew build 命令去构建工程。
  链接: https://pan.baidu.com/s/1W6EHysWY3ZWQZRWNdNZn3Q 提取码: hpj5
  gradle 其它命令: # 构建 jar包并运行 ./gradlew jar  # 构建项目,看你是idea工具还是eclipse ./gradlew idea ./gradlew eclipse  # 构建源码包 ./gradlew srcJar  # 构建javadoc文档 ./gradlew aggregatedJavadoc  # 清理并构建 ./gradlew clean 四、代码结构
  4.1 代码安装包结构 bin 目录:保存 Kafka 工具行脚本,我们熟知的 kafka-server-start 和 kafka-console-producer 等脚本都存放在这里。 checkstyle 目录:代码规范,自动化检测。
  Checkstyle 是什么,关于格式化的讨论就不曾中断过,到底什么才是正确的,什么才是错误的,到现在也没有完整的定论。但随着时间发展,渐渐衍生出一套规范出来。没有什么绝对的正确和错误,关键在于规范的定义。最出名的就是 google style guide,Checkstyle 就是以这种风格开发出的一个自动化插件,来辅助判断代码格式是否满足规范。
  该目录下的文件定义了工程代码格式的规范,我们可以在 build.gradle 中看到相关 checkstyle 的配置和自动化代码格式化配置:
  checkstyle 配置:
  scala 自动化代码格式化配置:
  clients 目录:保存 Kafka 客户端代码,比如生产者和消费者的代码都在该目录下。 config 目录:保存 Kafka 的配置文件,其中比较重要的配置文件是 server.properties。 connect 目录:保存 Connect 组件的源代码。 Kafka Connect 组件是用来实现 Kafka 与外部系统之间的实时数据传输的。 core 目录:保存 Broker 端代码。Kafka 服务器端代码全部保存在该目录下。 docs 目录:Kafka 设计文档以及组件相关结构图。 examples 目录:Kafka 样例相关目录。 generator 目录:Kafka 消息类处理模块,主要是根据 clients 模块下的 message json 文件生成对应的 java 类,在 build.gradle 文件中,可以看到定义了一个任务 processMessages:
  gradle 目录:gradle 的脚本和依赖包定义等相关文件。 jmh-benchmarks 目录:Kafka 代码微基准测试相关类。
  JMH,即 Java Microbenchmark Harness,是专门用于代码微基准测试的工具套件。何谓 Micro Benchmark 呢?简单的来说就是基于方法层面的基准测试,精度可以达到微秒级。当你定位到热点方法,希望进一步优化方法性能的时候,就可以使用 JMH 对优化的结果进行量化的分析。
  JMH 比较典型的应用场景有:想准确的知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性;对比接口不同实现在给定条件下的吞吐量,找到最优实现。kafka-logs 目录:server.properties 文件中配置 log.dirs 生成的目录。log4j-appender 目录:
  A log4j appender that produces log messages to Kafka  这个目录里面就一个 KafkaLog4jAppender 类。raft 目录:raft 一致性协议相关。streams 目录:
  Kafka Streams is a client library for building applications and microservices, where the input and output data are stored in Kafka clusters.  提供一个基于 Kafka 的流式处理类库,直接提供具体的类给开发者调用,整个应用的运行方式主要由开发者控制,方便使用和调试。Kafka Streams 是一个用来构建流处理程序的库,特别是其输入是一个 Kafka topic,输出是另一个 Kafka topic 的程序(或者是调用外部服务,或者是更新数据库,或者其它)。它使得你以一种分布式以及容错的方式来做这件事情。tests 目录:此目录的内容介绍如何进行 Kafka 系统集成和性能测试。tools 目录:工具类模块。vagrant 目录:介绍如何在 Vagrant 虚拟环境中运行 Kafka,提供了相关的脚本文件和说明文档。
  Vagrant 是一个基于 Ruby 的工具,用于创建和部署虚拟化开发环境。它使用 Oracle 的开源 VirtualBox 虚拟化系统,使用 Chef 创建自动化虚拟环境。
  4.2 项目结构
  项目结构的话主要关注 core 目录,core 目录 是 Kafka 核心包,有集群管理,分区管理,存储管理,副本管理,消费者组管理,网络通信,消费管理等核心类。
  admin 包:执行管理命令的功能; api 包:封装请求和响应 DTO 对象; cluster 包:集群对象,例如 Replica 类代表一个分区副本,Partition 类代表一个分区; common 包:通用 jar 包; controller包: 和kafkaController(kc)相关的类,重点模块,一个kafka集群只有一个leader kc,该kc负责 分区管理,副本管理,并保证集群信息在集群中同步; coordinator 包:保存了消费者端的 GroupCoordinator 代码和用于事务的 TransactionCoordinator 代码。对 coordinator 包进行分析,特别是对消费者端的 GroupCoordinator 代码进行分析,是 Broker 端协调者组件设计原理的关键。 log 包:保存了 Kafka 最核心的日志结构代码,包括日志、日志段、索引文件等, 另外,该包下还封装了 Log Compaction 的实现机制,是非常重要的源码包。 network 包:封装了 Kafka 服务器端网络层的代码,特别是 SocketServer.scala 这个文件,是 Kafka 实现 Reactor 模式的具体操作类,非常值得一读。 consumer 包:后面会丢弃该包,用 clients 包下 consumer 相关类代替。 server 包:顾名思义,它是 Kafka 的服务器端主代码,里面的类非常多,很多关键的 Kafka 组件都存放在这里,比如状态机、Purgatory 延时机制等。 tools 包:工具类。 五、环境验证
  下面我们来验证一下 Kafka 源码环境是否搭建成功。
  5.1 首先,我们在 core/src/main 目录下新建 resources 目录,再将 conf 目录下的 log4j.properties 配置文件拷贝到 resources 目录下。
  如下图所示:
  5.2 修改 conf 目录下的 server.properties 文件 log.dirs=/Users/Riemann/Code/framework-source-code-analysis/kafka-2.7.0-src/kafka-logs
  server.properties 文件中的其他配置暂时不用修改。
  5.3 在 IDEA 中配置 kafka.Kafka 这个入口类
  具体配置如下图所示:
  5.4 启动 Kafka Broker
  启动成功的话,控制台输出没有异常,且能看到如下输出:
  5.5 可能出现以下异常
  5.5.1 异常1 log4j:WARN No appenders could be found for logger (kafka.utils.Log4jControllerRegistration$). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
  在 project structure 中加入 slf4j-log4j12-1.7.30.jar 和 log4j-1.2.17.jar 两个日志包,当然也可以在 build.gradle 中添加对应的配置来添加包。
  方法1:
  方法2: compile group: "log4j", name: "log4j", version: "1.2.17" compile group: "org.slf4j", name: "slf4j-api", version: "1.7.30" compile group: "org.slf4j", name: "slf4j-log4j12", version: "1.7.30"
  加到 build.gradle 文件中的 core 模块:
  5.5.2 异常2   SLF4J: Failed to load class   "org.slf4j.impl.StaticLoggerBinder"  .
  SLF4J: Defaulting to no-operation (NOP) logger implementation
  SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
  在这里插入图片描述
  5.6 发送、消费 message
  我们这里使用 Kafka 自带的脚本工具来验证上面搭建的 Kafka 源码环境
  首先,我们进入到 ${KAFKA_HOME}/bin 目录,通过 kafka-topics.sh 命令来创建一个名为 topic_test 的 topic:
  执行效果如下图所示:
  然后我们通过 kafka-console-consumer.sh 命令启动一个命令行的 consumer 来消费 topic_test 这个 topic,如下:  ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic_test
  接下来,我们通过 kafka-console-producer.sh 命令启动一个命令行的 producer 向 topic_test 这个 topic 中生成数据,如下:
  当我们输入一条 message 并回车之后,message 会发送到 topic_test 这个 topic 中。
  我们输入完 message 并回车之后,就可以在 consumer 处收到该 message 了,效果如下图所示:
  大功告成,后续会陆续分析 Kafka Broker 端的源码,尽情期待~

交易截止日前各队信息汇总和预测分析由于今年球队强队很多,西部甚至实力平均战绩只差几场。今年交易截止日买家多多卖家很少,将是卖家市场。1。克劳德是100要走的,也可能会是最先打破截止日市场平静的交易。2。活塞多次强调最牛基金排名(3年期)图1最牛基金排名(3年期,统计到20221231)基金排名是个技术活,收益率(或持有一年两年三年收益率超额收益率)最大回撤率(或最大回撤率相关指数最大回撤率)卡玛比夏普比索提诺比,10岁的孩子玩卡丁车追尾,面临高位截瘫,究竟是谁的责任?游乐场是很多小朋友向往的地方,在这里孩子们能找到快乐,也能找到刺激,但是在这里也有危险。下面就有一个十岁的男孩,在游乐场里面玩卡丁车不慎与前车追尾,经过六个小时送到医院里面,却面临甘油三脂高过了2。26,果糖摄入过多是主因,哪些食物含有果糖?网友提问体检甘油三脂高,饮食上注意清淡,也不敢顿顿吃肉了以前很少运动,现在时不时走走路锻炼锻炼,可是甘油三脂好几年都居高不下,这到底是怎么回事?问题出在了哪?医生解析从饮食上来说,勉县春节假期接待游客52万余人次今年春节期间,勉县为增强三国文化旅游品牌吸引力和影响力,推出新春年味民俗非遗亲子娱乐花灯夜游文旅消费等丰富多彩的节庆活动,开门红和假日效应双重叠加,勉县各景区人气爆棚。据了解,勉县新职业研学旅行指导师新行业人才更需要具备专业知识日前,人社部发布中华人民共和国职业分类大典(2022年版),在新增的158个职业中,研学旅行指导师位列其中。根据官方定义,研学旅行指导师是指策划制订实施研学旅行方案,组织指导开展研这可能是秦岭北麓最宝藏的山村了养牛老汉隐士和黑狗那天赶杨庄的集,去的太早了,街道还不热闹,干脆到山边转转。库峪是进不去的,旁边听说有个小小的虎峪,去看看,如何?新村导航虎峪村,离开甫十路往西,一会儿就到了。虎峪村子规划的很整齐,中国红军第一村开园以来迎客25万余人次!2023年1月20日到1月27日,中国红军第一村春节共接待游客25。2万人次,同比增长1300实现旅游收入428。4万元,同比增长1487。共布局业态16个。中国红军第一村共布局业开平赤坎古镇所见所闻(网络截图)春节期间专门去开平赤坎古镇转了一圈,现在把赤坎古镇的所见所闻整理出来。这次去开平赤坎古镇,一早就做好了准备。年初三早上8。30分就从江门蓬江区出发,在杜阮上深岑高速转沈吴晓波通透中国的产业创新,仍然需要一大批不怕死不认命敢扎硬寨肯打呆仗的敢死队员。你们还在吗,你们在哪里呀。文吴晓波(微信公众号吴晓波频道)大年初一,我就往山里跑了,去的是莫干山西北麓的一个小我,18年不听劝,花26万贵州六盘水买房养老,如今后悔不已我叫宋涛,2017年夏天的一次西南旅游,让我对凉都六盘水念念不忘,不顾家人劝阻,到六盘水花26万买房养老。如今身体出现异样,让我进退两难。今天分享我的个人经历,希望对大家有所帮助。
倒影丨你是我的眼,一名视障小伙的返程路半岛全媒体记者史静今年刚刚17岁的许西恒,已经在黑暗世界里度过了11年。11年前,他因脑瘤压迫神经,永远失去了视力。从特教学校到盲校,11年来,许西恒得到了许多热心人的帮助。两年前悠悠大国的看天治水之道趋利避害实现人水和谐多年以来,气象部门牢牢把握国家战略需求,聚焦水灾害防治水资源节约水生态保护修复水环境治理等领域,持续统筹推进水文气象工作。从流域系统治理看举国体制优势去年6月,华南和江南南部出现罕新生儿血管瘤宝宝现在1岁4个多月了,可以和大家分享新生儿血管瘤只要往外突的并不可怕,我们家宝宝的血管瘤已经差不多完全消完了,宝宝出生了头上就有一小点红色的像血泡当时医生说的观察如果在长大就去干背水一战经济分析新范式与资产定价新周期(上)01hr发展条件的变化从中美贸易战,再到疫情三年,我们都深刻地认识到了世界经济运行的深层逻辑已经在悄然间发生了巨变。很多过去分析范式逻辑实则不再成立,需要重新反思重新构建。一是货币专访三大因素增益中国经济韧性访IMF亚太部副主任赫尔布林新华社华盛顿2月5日电专访三大因素增益中国经济韧性访IMF亚太部副主任赫尔布林新华社记者熊茂伶胡友松国际货币基金组织(IMF)亚太部副主任托马斯赫尔布林日前接受新华社记者专访时说,存款利率下调,储户们怎么看?去银行存钱是最常见的理财方式之一。以往每逢岁末年初,银行多会适当调高存款利率以吸引储户。去年底以来,这种情况却出现了变化。除了少数银行仍有存款优惠外,更多银行选择了维持利率不变甚至呕吐!腹胀!便血!是什么让新生儿宝宝如此饱受煎熬?肠旋转不良,你听说过吗?案例回顾患儿,男,23天,出生胎龄为366周,剖宫产出生,出生体重为3700g,Apgar评分91010。患儿因奶量减少反应欠佳呕吐半天收治入院。入院查体T粪石嵌顿很严重!宝宝说肚子疼想吐,千万别大意!去年初,我家宝贝还在上幼儿园,一周内出现了两次吃过上午小点心后就不精神说想吐的情况,第二次还真的吐了,接到老师通知后马上接了宝贝去看急诊,经检查,诊断为粪石嵌顿引发的急性阑尾炎,当知道怀孕前做的梦我还不知道怀孕时,就梦见我生了个孩子是个男孩,我在床上半躺着他躺在我身边,那画面真好很清晰,有一两个月大的样子,不胖也不瘦,皮肤不黑也不白,很健康,醒来后我还纳闷呢,平日里也不想这Oculus前CTO索尼PSVR2很好,但600美元售价让其很难成功近日,Oculus前CTO(首席技术官)约翰卡马克(JohnCarmack)在社交平台公开表示,索尼即将推出的第二代头显PSVR2恐怕很难在市场上取得成功,因为其高昂的价格以及分散森林管理员模拟器试玩Demo上线第二季度发售今日(2月7日),模拟经营游戏森林管理员模拟器试玩Demo现已上线,游戏支持简繁体中文,预计于今年第二季度正式发售,感兴趣的玩家可以进入商店页面。游戏介绍orestRangerSi