閱讀834 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Kakfa源碼環境搭建

本文主要講述的是如何搭建Kafka的源碼環境,主要針對的Windows操作係統下IntelliJ IDEA編譯器,其餘操作係統或者IDE可以類推。

1.安裝和配置JDK

確認JDK版本至少為1.7,最好是1.8及以上。使用java -version命令來查看當前JDK的版本,示例如下:

C:\Users\hidden> java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)

2.下載並安裝配置Gradle

下載地址為:https://gradle.org/releases/,筆者使用的版本是3.1。一般隻需要將下載的包解壓,然後再將\$GRADLE_HOME/bin的路徑添加到環境變量Path中即可,其中\$GRADLE_HOME指的是Gradle的根目錄。可以使用gradle -v命令來驗證Gradle是否已經配置完成,示例如下:

C:\Users\hidden>gradle -v

------------------------------------------------------------
Gradle 3.1
------------------------------------------------------------

Build time:   2016-09-19 10:53:53 UTC
Revision:     13f38ba699afd86d7cdc4ed8fd7dd3960c0b1f97

Groovy:       2.4.7
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_112 (Oracle Corporation 25.112-b15)
OS:           Windows 10 10.0 amd64

3.下載並安裝配置Scala

下載地址為:https://www.scala-lang.org/download/all.html,目前最新的版本是2.12.4,不過筆者這裏使用的版本是2.11.11。如Gradle一樣,隻需要解壓並將\$SCALA_HOME/bin的路徑添加到環境變量Path即可,其中\$SCALA_HOME指的是Scala的根目錄。可以使用scala -version命令來驗證scala是否已經配置完成,示例如下:

C:\Users\hidden>scala -version
Scala code runner version 2.11.11 -- Copyright 2002-2017, LAMP/EPFL

4. 構建Kafka源碼環境

Kafka下載地址為:https://kafka.apache.org/downloads,目前最新的版本是1.0.0。將下載的壓縮包解壓,並在Kafka的根目錄執行gradle idea命令進行構建,如果你使用的是Eclipse,則隻需采用gradle eclipse命令構建即可。構建細節如下所示:

D:\IntelliJ IDEA Files\kafka-sources\kafka-1.0.0-src>gradle idea
Starting a Gradle Daemon, 2 incompatible and 1 stopped Daemons could not be reused, use --status for details
Building project 'core' with Scala version 2.11.11
:ideaModule
:ideaProject
(......省略若幹......)
:streams:examples:ideaModule
:streams:examples:idea

BUILD SUCCESSFUL

Total time: 1 mins 11.991 secs

之後將Kafka導入到IDEA中即可。不過這樣還沒有結束,對於IDEA而言,還需要安裝Scala插件,在Setting->Plugin中搜索scala並安裝,可以參考下圖,筆者這裏是已經安裝好的狀態:

這裏寫圖片描述

5. 配置Kafka源碼環境

前麵幾個步驟執行完成後就可以很舒適的閱讀Kafka的源碼,但是如果需要啟動Kafka的服務還需要一些額外的步驟。

首先確保gradle.properties配置文件中的scalaVersion與安裝的一致。gradle.properties配置文件的細節如下:

group=org.apache.kafka
# NOTE: When you change this version number, you should also make sure to update
# the version numbers in tests/kafkatest/__init__.py and kafka-merge-pr.py.
version=1.0.0
scalaVersion=2.11.11
task=build
org.gradle.jvmargs=-XX:MaxPermSize=512m -Xmx1024m -Xss2m

如果更改了scalaVersion,需要重新執行gradle idea命令來重新構建。雖然很多時候在操作係統中安裝其他版本的Scala也並沒有什麼問題,比如安裝2.12.4版本。但是有些情況下運行Kafka時會出現一些異常,而這些異常卻又是由於Scala版本不一致而引起的,比如會出現下麵示例中的報錯:

[2017-11-13 17:09:21,119] FATAL  (kafka.Kafka$)
java.lang.NoSuchMethodError: scala.collection.TraversableOnce.$init$(Lscala/collection/TraversableOnce;)V
    at kafka.message.MessageSet.<init>(MessageSet.scala:72)
    at kafka.message.ByteBufferMessageSet.<init>(ByteBufferMessageSet.scala:129)
    at kafka.message.MessageSet$.<init>(MessageSet.scala:32)
    at kafka.message.MessageSet$.<clinit>(MessageSet.scala)
    at kafka.server.Defaults$.<init>(KafkaConfig.scala:52)
    at kafka.server.Defaults$.<clinit>(KafkaConfig.scala)
    at kafka.server.KafkaConfig$.<init>(KafkaConfig.scala:686)
    at kafka.server.KafkaConfig$.<clinit>(KafkaConfig.scala)
    at kafka.server.KafkaServerStartable$.fromProps(KafkaServerStartable.scala:28)
    at kafka.Kafka$.main(Kafka.scala:82)
    at kafka.Kafka.main(Kafka.scala)

所以為了省去一些不必要的麻煩,還是建議讀者在安裝Scala版本之前先查看下Kafka源碼中gradle.properties文件中配置的scalaVersion。

再確保了scalaVersion之後,需要將config目錄下的log4j.properties文件拷貝到core/src/main/scala目錄下,這樣可以讓Kafka在運行時能夠輸出日誌信息,可以參考下圖:

這裏寫圖片描述

之後還需要配置server.properties文件,一般隻需要修改以下一些配置項:

# 是否允許topic被刪除,設置為true則topic可以被刪除,
# 開啟這個功能方便Kafka在運行一段時間之後,能夠刪除一些不需要的臨時topic
delete.topic.enable=true
# 禁用自動創建topic的功能
auto.create.topics.enable=false
# 存儲log文件的目錄,默認值為/tmp/kafka-logs
# 示例是在Windows環境下運行,所以需要修改這個配置,注意這裏的雙反斜杠。
log.dir=D:\\kafka\\tmp\\kafka-logs
# 配置kafka依賴的zookeeper路徑地址,這裏的前提是在本地開啟了一個zookeeper的服務
# 如果本地沒有zookeeper服務,可以參考下一節中zookeeper的安裝、配置及運行
zookeeper.connect=localhost:2181/kafka

之後配置Kafka的啟動參數,詳細參考下圖:

這裏寫圖片描述

這裏配置Main class為kafka.Kafka,並製定啟動時所需要的配置文件地址,即:config/server.properties。配置JMX_PORT是為了方便搜集Kafka自身的Metrics數據。

如此便可以順利的運行Kafka服務了(第一次啟動時會有一個耗時較長的編譯過程),部分啟動日誌如下:

[2017-11-14 00:24:14,472] INFO KafkaConfig values: 
    advertised.host.name = null
    advertised.listeners = null
    advertised.port = null
    authorizer.class.name = 
(......省略若幹......)
[2017-11-14 00:24:35,001] INFO Registered broker 0 at path /brokers/ids/0 with addresses: EndPoint(LAPTOP-1IN9UPT7,9092,ListenerName(PLAINTEXT),PLAINTEXT) (kafka.utils.ZkUtils)
[2017-11-14 00:24:35,019] INFO Kafka version : 1.0.0 (org.apache.kafka.common.utils.AppInfoParser)
[2017-11-14 00:24:35,020] INFO Kafka commitId : e89bffd6b2eff799 (org.apache.kafka.common.utils.AppInfoParser)
[2017-11-14 00:24:35,021] INFO [Kafka Server 0], started (kafka.server.KafkaServer)

6. Zookeeper的安裝、配置及啟動

Kafka需要使用Zookeeper來管理元數據,比如記錄topic、partitions(分區)以及replica(副本)的分配信息。由於這裏隻是闡述如何構建Kafka的源碼環境搭建,所以這裏的Zookeeper的安裝也以極簡為主,即采用單機配置。Zookeeper下載地址為:https://zookeeper.apache.org/releases.html,下載之後解壓,然後將\$ZOOKEEPER_HOME目錄下的conf/zoo_sample.cfg重命名為zoo.cfg,其中\$ZOOKEEPER_HOME指的是ZooKeeper的根目錄。

修改$ZOOKEEPER_HOME/conf/zoo.cfg配置,示例配置如下(其餘配置可以不做修改):

dataDir=D:\\zookeeper-3.4.10\\tmp\\zookeeper\\data

將$ZOOKEEPER_HOME/bin配置到Path中,之後直接運行zkServer命令即可開啟Zookeeper服務。示例如下:

C:\Users\hidden>zkServer

C:\Users\hidden>call "C:\Program Files\Java\jdk1.8.0_112"\bin\java "-Dzookeeper.log.dir=D:\zookeeper-3.4.10\bin\.." "-Dzookeeper.root.logger=INFO,CONSOLE" -cp "D:\zookeeper-3.4.10\bin\..\build\classes;D:\zookeeper-3.4.10\bin\..\build\lib\;D:\zookeeper-3.4.10\bin\..\;D:\zookeeper-3.4.10\bin\..\lib\*;D:\zookeeper-3.4.10\bin\..\conf" org.apache.zookeeper.server.quorum.QuorumPeerMain "D:\zookeeper-3.4.10\bin\..\conf\zoo.cfg"
2017-11-14 00:44:20,135 [myid:] - INFO  [main:QuorumPeerConfig@134] - Reading configuration from: D:\zookeeper-3.4.10\bin\..\conf\zoo.cfg
2017-11-14 00:44:20,147 [myid:] - INFO  [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
2017-11-14 00:44:20,147 [myid:] - INFO  [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
2017-11-14 00:44:20,147 [myid:] - INFO  [main:DatadirCleanupManager@101] - Purge task is not scheduled.
2017-11-14 00:44:20,150 [myid:] - WARN  [main:QuorumPeerMain@113] - Either no config or no quorum defined in config, running  in standalone mode
2017-11-14 00:44:20,250 [myid:] - INFO  [main:QuorumPeerConfig@134] - Reading configuration from: D:\zookeeper-3.4.10\bin\..\conf\zoo.cfg
2017-11-14 00:44:20,250 [myid:] - INFO  [main:ZooKeeperServerMain@96] - Starting server

ps:消息中間件(Kafka、RabbitMQ)交流可加微信:hiddenzzh

最後更新:2017-11-14 19:04:09

  上一篇:go  E-MapReduce Best Practices
  下一篇:go  Database Recovery in GitLab – Implementing Database Disaster Tolerance & High Availability