我用java寫了一個圖形化連接zookeeper的工具(附視頻演示)

zookeeper圖形化連接工具ZkInspector下載kafka啓動並訪問zookeeper圖形化訪問zookeeper的工具ZkInspector啓動方法ZkInspector的使用啓動並訪問kafka測試kafka刪除主題後出現問題測試數據的寫入和讀取kafka中的配置文件

zookeeper圖形化連接工具ZkInspector

我花了一天時間用java的swing庫寫了一個圖形化連接zookeeper的工具,起名叫ZkInspector。爲了大家直接上手使用,首先我會介紹如何在windows上直接使用kafka和zookeeper,然後再介紹ZkInspector的使用。

操作示範:

下載kafka

由於kafka內置zookeeper,所以只需要下載kafka即可。

我們在http://archive.apache.org/dist/kafka/中選擇所需要下載的kafka版本。

由於我的電腦安裝的scala版本爲2.11.8,所以我選擇了一個支持scala2.11的最高kafka版本進行測試:

http://archive.apache.org/dist/kafka/2.4.1/kafka_2.11-2.4.1.tgz

然後解壓下載好的包,比如我解壓到了D:\jdk中,則配置環境變量KAFKA_HOME=D:\jdk\kafka_2.11-2.4.1

然後將%KAFKA_HOME%\bin\windows加入Path環境變量。

注意:kafka雖然使用scala開發,但本地未安裝scala也依然可以使用。

本文涉及的所有軟件的下載地址爲:

鏈接:https://pan.baidu.com/s/124d4aeVYZb8_Yb7OkOIijg
提取碼:no0y

啓動並訪問zookeeper

進入D:\jdk\kafka_2.11-2.4.1目錄並啓動zk:

zookeeper-server-start config\zookeeper.properties
image-20200506121025536
image-20200506121051020

啓動zookeeper後,我們就可以訪問zookeeper了。

圖形化訪問zookeeper的工具

爲了大家訪問方便,我專門花了一天時間用java開發了一個zookeeper的圖像化界面的訪問工具:

image-20200506125357336

雖然不是很完善,但基本夠用,而且非常方便。

源碼暫時不給大家,除非具有java開發能力並想要改進本軟件的人比較多,有個別想要改進本軟件的可以與我私聊。

當然技術還不錯的,想要弄本軟件的源碼也可以直接反編譯,我雖然可以對源碼進行混淆加密增加反編譯的難度,但是想想還是算了,一個小程序而已。當然我更建議,想通過反編譯獲取源碼的朋友,不如把精力花在如何改進這個軟件上面,後期我可能會將源碼上傳到github上。

ZkInspector啓動方法

最通用的辦法,進入ZkInspector.jar所在的目錄,執行:

javaw -jar ZkInspector.jar

這種方法執行會殘留cmd黑屏界面,但如果你對jar包的默認打開程序是javaw -jar命令,則可以直接雙擊運行jar包。凡是通過jdk官網exe安裝程序安裝的java都可以直接雙擊打開。

但是我個人就不是,我是直接解壓已經安裝好的jdk,然後配置環境變量後就直接使用。

如果你也是這種情況,但也想要實現直接雙擊打開jar包,可以參考下面的方法:

首先,隨便找個jar文件右鍵單擊點打開方式-->默認打開方式,點預覽,選擇%JAVA_HOME%\bin下的javaw.exe文件點確定,讓註冊表中先生成相應的項和值。

然後修改剛纔生成的註冊表項(regedit命令打開註冊表):

修改HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command的默認值

由
"D:\jdk\jdk1.8.0\bin\javaw.exe" "%1"
改爲
"D:\jdk\jdk1.8.0\bin\javaw.exe" -jar "%1"

D:\jdk\jdk1.8.0跟換爲你的jdk的配置。

ZkInspector的使用

只需點擊一下就可以連接zookeeper了:

image-20200506125440558

隨便建了點數據就是這種效果:

image-20200506125614976
image-20200506125534786

啓動並訪問kafka

也需要先進入kafka的目錄D:\jdk\kafka_2.11-2.4.1中:

kafka-server-start config\server.properties

啓動完成後:

image-20200506130051873

zookeeper上的變化:

image-20200506130155917

測試kafka

再啓動一個cmd進行測試。

創建主題:

kafka-topics --create --zookeeper localhost:2181 --topic test --partitions 3 --replication-factor 1
kafka-topics --create --zookeeper localhost:2181 --topic hello --partitions 2 --replication-factor 1
kafka-topics --create --zookeeper localhost:2181 --topic haha --partitions 1 --replication-factor 1

查看主題:

kafka-topics --describe --zookeeper localhost:2181 --topic test

列出主題:

kafka-topics --list --zookeeper localhost:2181
image-20200506131014698

刪除主題:

kafka-topics --delete --zookeeper localhost:2181 --topic haha
image-20200506131950841

提示刪除命令只是把主題標記爲刪除狀態,要想徹底刪除,需要在config/server.proporties中配置delete.topic.enable=true,不過windows上這個配置似乎不生效。

刪除命令的本質僅僅只是在admin節點下面增加了被刪除節點的記錄:

image-20200506132042758

刪除主題後出現問題

然後,kafka服務端程序掛掉,並爆出如下錯誤:

java.nio.file.AccessDeniedException: D:\tmp\kafka-logs\haha-0 -> D:\tmp\kafka-lo
gs\haha-0.88f2623a9f47483eb65ffd9ba1ce0ab1-delete
        at sun.nio.fs.WindowsException.translateToIOException(WindowsException.j
ava:83)
        at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.jav
a:97)
        at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387)
        at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.j
ava:287)
        at java.nio.file.Files.move(Files.java:1395)
        at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java
:795)
        at kafka.log.Log$$anonfun$renameDir$1.apply$mcV$sp(Log.scala:982)
        at kafka.log.Log$$anonfun$renameDir$1.apply(Log.scala:980)
        at kafka.log.Log$$anonfun$renameDir$1.apply(Log.scala:980)
        at kafka.log.Log.maybeHandleIOException(Log.scala:2335)
        at kafka.log.Log.renameDir(Log.scala:980)
        at kafka.log.LogManager.asyncDelete(LogManager.scala:925)
        at kafka.cluster.Partition$$anonfun$delete$1.apply(Partition.scala:479)
        at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:253)
        at kafka.utils.CoreUtils$.inWriteLock(CoreUtils.scala:261)
        at kafka.cluster.Partition.delete(Partition.scala:470)
        at kafka.server.ReplicaManager.stopReplica(ReplicaManager.scala:360)
        at kafka.server.ReplicaManager$$anonfun$stopReplicas$2.apply(ReplicaMana
ger.scala:404)
        at kafka.server.ReplicaManager$$anonfun$stopReplicas$2.apply(ReplicaMana
ger.scala:402)
        at scala.collection.immutable.Set$Set1.foreach(Set.scala:94)
        at kafka.server.ReplicaManager.stopReplicas(ReplicaManager.scala:402)
        at kafka.server.KafkaApis.handleStopReplicaRequest(KafkaApis.scala:236)
        at kafka.server.KafkaApis.handle(KafkaApis.scala:132)
        at kafka.server.KafkaRequestHandler.run(KafkaRequestHandler.scala:70)
        at java.lang.Thread.run(Thread.java:745)
        Suppressed: java.nio.file.AccessDeniedException: D:\tmp\kafka-logs\haha-
0 -> D:\tmp\kafka-logs\haha-0.88f2623a9f47483eb65ffd9ba1ce0ab1-delete
                at sun.nio.fs.WindowsException.translateToIOException(WindowsExc
eption.java:83)
                at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsExcep
tion.java:97)
                at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301)
                at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemPr
ovider.java:287)
                at java.nio.file.Files.move(Files.java:1395)
                at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Ut
ils.java:792)
                ... 19 more
[2020-05-06 13:19:20,312] INFO [ReplicaManager broker=0] Stopping serving replic
as in dir D:\tmp\kafka-logs (kafka.server.ReplicaManager)
[2020-05-06 13:19:20,318] INFO [ReplicaFetcherManager on broker 0] Removed fetch
er for partitions Set(test-0, hello-1, test-1, hello-0, test-2) (kafka.server.Re
plicaFetcherManager)
[2020-05-06 13:19:20,319] INFO [ReplicaAlterLogDirsManager on broker 0] Removed
fetcher for partitions Set(test-0, hello-1, test-1, hello-0, test-2) (kafka.serv
er.ReplicaAlterLogDirsManager)
[2020-05-06 13:19:20,337] INFO [ReplicaManager broker=0] Broker 0 stopped fetche
r for partitions test-0,hello-1,test-1,hello-0,test-2 and stopped moving logs fo
r partitions  because they are in the failed log directory D:\tmp\kafka-logs. (k
afka.server.ReplicaManager)
[2020-05-06 13:19:20,338] INFO Stopping serving logs in dir D:\tmp\kafka-logs (k
afka.log.LogManager)
[2020-05-06 13:19:20,345] ERROR Shutdown broker because all log dirs in D:\tmp\k
afka-logs have failed (kafka.log.LogManager)
[2020-05-06 13:19:20,348] INFO [ReplicaFetcherManager on broker 0] Removed fetch
er for partitions Set(haha-0) (kafka.server.ReplicaFetcherManager)

大概意思就是kafka沒有權限將D:\tmp\kafka-logs\haha-0重命名爲D:\tmp\kafka-logs\haha-0.88f2623a9f47483eb65ffd9ba1ce0ab1-delete。再次啓動kafka服務端,依然會報同樣的錯誤,無法啓動,除非刪除zookeeper上的admin/delete_topics/haha節點,取消對它的刪除標記。

雖然kafka服務端已經掛了,但kafka客戶端還可以通過zookeeper獲取一些數據信息:

image-20200506132405877

但我們的目的就是刪除這個topic,先直接刪除zookeeper上關於haha的節點,按照Ctrl鍵進行選擇:

image-20200506132610929

刪除之後,kafka服務已經可以順利的重新啓動了。

然後再手工刪除D:\tmp\kafka-logs\haha-0文件夾,就徹底這個主題下的所有數據了。

注意:如果該topic有多個分區則需要刪除多個文件夾。

此時我在%KAFKA_HOME%config\server.properties添加

delete.topic.enable=true

後再次重啓kafka服務端。

測試數據的寫入和讀取

生產者

kafka-console-producer --broker-list localhost:9092 --topic hello

消費者

kafka-console-consumer --bootstrap-server localhost:9092 --topic hello  --from-beginning
image-20200506134549041

指定消費者組:

kafka-console-consumer --bootstrap-server localhost:9092 --topic hello --group group1  --from-beginning

查看消費進度:

kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group group1

D:\jdk\kafka_2.11-2.4.1>kafka-consumer-groups    --bootstrap-server  localhost:9092
--describe    --group group1

GROUP    TOPIC   PARTITION   CURRENT-OFFSET  LOG-END-OFFSET  LAG CONSUMER-ID HOST    CLIENT-ID
group1    hello   0   2   2   0   consumer-group1-1-86024135-f662-4e63-8654-1184a315587c  /192.168.40.1   consumer-group1-1
group1    hello   1   3   3   0   consumer-group1-1-86024135-f662-4e63-8654-1184a315587c  /192.168.40.1   consumer-group1-1

查看所有的消費組:

kafka-consumer-groups --bootstrap-server localhost:9092 --list

測試生產能力:

kafka-producer-perf-test --topic test --num-records 1000000 --record-size 1000 --throughput  -1 --producer-props bootstrap.servers=localhost:9092 acks=-1
image-20200506142649982

主要輸出5項指標,發送消息總數,每秒發送消息數(records/sec),每秒發送消息量(MB/sec),平均延遲和最大延遲。

最後的輸出表示總共發出1000000條數據,kafka 的平均吞吐量是每秒發送25058條消息,23.9 MB/秒 ,平均延時爲1248.44ms,最大延時爲3443.00ms,1015ms發送50%的消息,2330ms發送95%的消息,3171ms發送了99%的消息,3375ms發送了99.9%的消息。

測試消費能力:

kafka-consumer-perf-test --broker-list localhost:9092 --topic test --fetch-size 1048576 --messages 500000 --threads 3

start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.s
ec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec
2020-05-06 14:46:55:323, 2020-05-06 14:47:13:000, 477.0164, 26.9851, 500188, 282
95.9778, 1588747616111, -1588747598434, -0.0000, -0.0003

具體參數解釋:

  • data.consumed.in.MB:總消費大小(MB)

  • MB.sec:平均每秒消費(MB/s)

  • data.consumed.in.nMsg:總消費條數(條)

  • nMsg.sec:平均每秒消費(條)

  • rebalance.time.ms:再平衡時間(ms)

  • fetch.time.ms:fetch平均時間(ms)

  • fetch.MB.sec:fatch平均大小(MB/s)

  • fetch.nMsg.sec:fatch平均條數(條)

表示8秒內消費了477MB的消息,吞吐量爲26.9851MB/s,共消費500188條消息,每秒28295.9778條。

kafka中的配置文件

參數主要分爲以下三類:

broker配置文件參數
http://kafka.apache.org/documentation/#brokerconfigs
其中有一部分是topic級別的:即可以被topic創建時覆蓋,參看:
http://kafka.apache.org/documentation/#topicconfigs
生產者配置文件參數
http://kafka.apache.org/documentation.html#producerconfigs
消費者配置文件參數
http://kafka.apache.org/documentation.html#consumerconfigs

推薦一門課:

image-20200506172123642
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章