聊聊 Kafka:編譯 Kafka 源碼並搭建源碼環境

2022-01-01 石臻臻的雜貨鋪
一、前言

這裡編譯 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:

相關焦點

  • kafka入門(原理-搭建-簡單使用)
    前言公司在用kafka接受和發送數據,自己學習過Rabbitmq,不懂kafka挺不爽的,說幹就幹!網上找了許多帖子,學習了很多,小小的demo自己也搭建起來了,美滋滋,下面我認為優秀的網站和自己的步驟展現給大家。
  • CentOS7下簡單搭建zookeeper+kafka集群
    本文轉載自【微信公眾號:WalkingCloud,ID:WalkingCloud2018】,經微信公眾號授權轉載,如需轉載與原文作者聯繫如下圖所示三臺CentOS7的機器來搭建zookeeper+kafka集群192.168.31.221 node1 node1.walkingcloud.cn192.168.31.222
  • Flink 全網最全資源(視頻、博客、PPT、入門、實戰、源碼解析、問答等持續更新)
    博客1、《從0到1學習Flink》—— Apache Flink 介紹2、《從0到1學習Flink》—— Mac 上搭建 Flink 1.6.0 環境並構建運行簡單程序入門3、《從0到1學習》—— 源碼編譯運行21、為什麼說流處理即未來?
  • Framework學習Android系統源碼下載與編譯
    最近計劃著研究下系統源碼,之前也沒做過什麼記錄,這次正好將學習的內容記錄下來,方便以後複習鞏固。既然要學習我們的系統源碼,那我們第一步要做的就是下載源碼並進行編譯了。硬體環境要求1.編譯環境按照官方的說法,編譯 Android 2.3.x 及以上版本的系統源碼需要 64 位的系統運行環境來支持,而編譯 2.3.x 以下的版本則需要 32 位的系統運行環境。2.
  • Kafka快速入門秘籍:背景介紹,應用場景分析、核心架構分析
    在講實戰前,我們還是有必要講解下理論的,理論為輔,實戰為主,在實戰的基礎上,再深入理解理論,底層原理,底層源碼。下篇文章或者視頻,我們將帶你看官網學習kafka環境搭建、kafka基本用法、kafka的容錯性測試,在掌握知識的同時,還能順便學習下英文。
  • Kafka入門教程 (二) : Consumer使用(topic,partition和offset)
    只指定topic即每個consumer只指定需要消費的topic,高級消費,對應kafka-clients中的Consumer.subscribe()方法假定,1-N個consumer,屬於同一個group。根據consumer的個數,由kafka-clinets分配每個consumer消費的partition,分配策略見後文。
  • kafka極簡教程
    kafka是用於構建實時數據管道和流應用程式。具有橫向擴展,容錯,wicked fast(變態快)等優點,並已在成千上萬家公司運行。
  • 圖解 kafka 架構與工作原理
    ,kafka的數據就保存在topic。三、kafka 安裝光說理論可沒用,下面我們就以 centos7 為例,介紹一下 kafka 的安裝和使用。kafka 需要 zookeeper 來保存服務實例的元信息,因此在安裝 kafka 之前,我們需要先安裝 zookeeper。
  • 利用flume+kafka+storm+mysql構建大數據實時系統
    在我們系統中由kafka來接收。/configure# make# make install# sudo ldconfig (更新LD_LIBRARY_PATH)缺少c++環境:yum install gcc-c++之後遇到的問題是:Error:cannot link with -luuid, install uuid-dev這是因為沒有安裝uuid
  • logstash_output_kafka:Mysql同步Kafka深入詳解
    如果需要同步歷史全量數據+實時更新數據,建議使用logstash。1、logstash同步原理常用的logstash的插件是:logstash_input_jdbc實現關係型資料庫到Elasticsearch等的同步。實際上,核心logstash的同步原理的掌握,有助於大家理解類似的各種庫之間的同步。
  • Apache Kafka 快速入門指南
    五、Kafka 安裝5.1 安裝環境與前提條件安裝環境:Linux前提條件:Linux系統下安裝好jdk 1.8以上版本,正確配置環境變量Linux系統下安裝好scala 2.11版本安裝ZooKeeper(註:kafka自帶一個Zookeeper服務,如果不單獨安裝,也可以使用自帶的ZK)5.2 安裝步驟Apache基金會開源的這些軟體基本上安裝都比較方便,只需要下載、解壓、配置環境變量三步即可完成,kafka也一樣,官網選擇對應版本下載後直接解壓到一個安裝目錄下就可以使用了,如果為了方便可以在~/.bashrc
  • Filebeat+Kafka+Logstash+Elasticsearch+Kibana 構建日誌分析系統
    1、Docker 環境執行命令如下:# 在 docker 節點執行# 騰訊雲 docker hub 鏡像# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"# DaoCloud 鏡像
  • 關於Kafka區分請求處理優先級的討論
    通常我們這裡把PRODUCE/FETCH請求稱為數據類請求;把controller發送的那3種請求稱為控制類請求或controller類請求——在源碼中前者被稱為data plane request,後者稱為controller plane request。這種公平處理原則在很多場合下都是不合理的。為什麼?簡單來說控制類請求具有直接令數據類請求失效的能力。
  • 搭建大型源碼閱讀環境——使用 OpenGrok
    下載 Universal Ctags(https://github.com/universal-ctags/ctags) for Windows,將 ctags.exe 文件所在目錄添加到 PATH 環境變量。
  • kafka使用原理介紹
    但是如果某個kafka controller 切換的時候,會導致partition leader的切換(老的 kafka controller上面的partition leader會選舉到其他的kafka broker上),但是這樣就會導致丟數據。
  • 【CUDA學習筆記】第八篇:源碼編譯OpenCV+CUDA模塊(完整源碼打包一次成功編譯)
    1、OpenCV+CUDA+Contrib的源碼編譯2、OpenCV+CUDA+Contrib的測試3、源碼級相關難下載文件的集成下載(附連結)1、OpenCV+CUDA+Contrib的源碼編譯1、cmake軟體打開,選擇opencv源碼文件夾
  • Python3.7源碼在windows(VS2015)下的編譯和安裝
    Python3.7源碼在windows(VS2015)下的編譯和安裝下載官方源碼,使用vs2015(WIN10SDK),最python3.7.0的源碼進行編譯,編譯出不同的版本(release,debug),並配置python的運行環境(環境變量的配置)。
  • Kafka 基本原理(8000 字小結)
    Consumer複製(Replication)日誌壓縮(Log Compaction)DistributionZookeeper協調控制開發環境搭建1)kafka以topic來進行消息管理,每個topic包含多個partition,每個partition對應一個邏輯log,有多個segment組成。2)每個segment中存儲多條消息(見下圖),消息id由其邏輯位置決定,即從消息id可直接定位到消息的存儲位置,避免id到位置的額外映射。
  • 新手使用 Macos CLion 搭建MySQL源碼debug環境
    看了很多MySQL 的原理分析文章,懂了一些,但是沒有看源碼,總感覺些許缺憾,於是趁著假期,搭建一套debug環境,為後續驗證原理以及自己的猜想做準備
  • 「Spring和Kafka」Kafka整合Spring 深入挖掘 -第1部分
    為此,我們用我們自己的來覆蓋Spring Boot的自動配置容器工廠:@Beanpublic ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(ConcurrentKafkaListenerContainerFactoryConfigurer configurer,