1.概述
在分散式實時資料流場景下,隨著資料量的增長,對Kafka叢集的效能和穩定性的要求也很高。本篇部落格將從生產者和消費者兩方面來做效能測試,針對具體的業務和資料量,來調優Kafka叢集。
2.內容
2.1 測試環境
本次測試的環境資訊由三臺物理機組成,具體資訊如下所示:
2.2 測試工具
Kafka系統提供了測試工具kafka-producer-perf-test.sh和kafka-consumer-perf-test.sh,通過該工具可以對生產者效能和消費者效能進行測試,獲取一組最佳的引數值,進而提升生產者的傳送效率和消費者的讀取效率。這裡如果需要實現帶有執行緒引數功能的工具,可以修改工具原始碼,新建一個kafka-producer-perf-test-0.8.sh指令碼,實現內容如下:
# 使用老版本的ProducerPerformance工具類 exec $(dirname $0)/kafka-run-class.sh kafka.tools.ProducerPerformance "$@"
2.2.1 生產者測試引數
2.2.2 消費者測試引數
3.生產者測試
生產者測試,分別從執行緒數、分割槽數、副本數、Broker數、同步與非同步模式、批處理大小、訊息長度大小、資料壓縮等維度來進行。
3.1 執行緒數
建立一個擁有6個分割槽、1個副本的Topic,設定不同的執行緒數併傳送相同的資料量,檢視效能變化。測試指令碼如下:
# 建立主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 --topic test_producer_perf --partitions 6 --replication-factor 1 # 設定1個執行緒數 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf --threads 1 --broker-list dn1:9092, dn2:9092, dn3:9092 # 設定10個執行緒數 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf --threads 10 --broker-list dn1:9092, dn2:9092, dn3:9092 # 設定20個執行緒數 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf --threads 20 --broker-list dn1:9092, dn2:9092, dn3:9092 # 設定25個執行緒數 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf --threads 25 --broker-list dn1:9092, dn2:9092, dn3:9092 # 設定30個執行緒數 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf --threads 30 --broker-list dn1:9092, dn2:9092, dn3:9092
3.1.1 測試結果
3.1.2 結論
向一個擁有6個分割槽、1個副本的Topic中,傳送500萬條訊息記錄時,隨著執行緒數的增加,每秒傳送的訊息記錄會逐漸增加。線上程數為25時,每秒傳送的訊息記錄達到最佳值,隨後再增加執行緒數,每秒傳送的訊息記錄數反而會減少。
3.2 分割槽數
(1)新建一個擁有12個分割槽、1個副本的主題;
(2)新建一個擁有24個分割槽、1個副本的主題;
(3)向擁有12個分割槽、1個副本的主題中傳送相同數量的訊息記錄,檢視效能變化;
(4)向擁有24個分割槽、1個副本的主題中傳送相同數量的訊息記錄,檢視效能變化。
執行命令如下:
# 建立一個擁有12個分割槽的主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 --topic test_producer_perf_p12 --partitions 12 --replication-factor 1 # 建立一個擁有24個分割槽的主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 --topic test_producer_perf_p24 --partitions 24 --replication-factor 1 # 用一個執行緒傳送資料到擁有12個分割槽的主題中 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_p12 --threads 1 --broker-list dn1:9092, dn2:9092, dn3:9092 # 用一個執行緒傳送資料到擁有24個分割槽的主題中 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_p24 --threads 1 --broker-list dn1:9092, dn2:9092, dn3:9092
3.2.1 測試結果
3.2.2 結論
從測試結果來看,分割槽數越多,單執行緒生產者的吞吐量越小。
3.3 副本數
(1)建立一個擁有兩個副本、6個分割槽的主題;
(2)建立一個擁有3個副本、6個分割槽的主題;
(3)向擁有兩個副本、6個分割槽的主題中傳送相同數量的訊息記錄,檢視效能變化;
(4)向擁有3個副本、6個分割槽的主題中傳送相同數量的訊息記錄,檢視效能變化;
執行命令如下:
# 建立一個擁有兩個副本、6個分割槽的主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 --topic test_producer_perf_r2 --partitions 6 --replication-factor 2 # 建立一個擁有3個副本、6個分割槽的主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 --topic test_producer_perf_r3 --partitions 6 --replication-factor 3 # 用3個執行緒傳送資料到擁有兩個副本的主題中 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_r2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092 # 用3個執行緒傳送資料到擁有3個副本的主題中 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_r3 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092
3.3.1 測試結果
3.3.2 結論
從測試結果來看,副本數越多,吞吐量越小。
3.4 Broker數量
通過增加Broker節點數量來檢視效能變化,指令碼如下:
# Kafka節點數為4個時,非同步傳送訊息記錄 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_b3 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092, dn4:9092 --batch-size 3000 --request-timeout-ms 100000
3.4.1 測試結果
3.4.2 結論
從測試結果來看,增加Kafka Broker數量,吞吐量會增加。
3.5 同步與非同步模式
分別使用同步和非同步模式傳送相同數量的訊息記錄,檢視效能變化。執行指令碼如下:
# 建立一個有用3個副本、6個分割槽的主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 --topic test_producer_perf_s2 --partitions 6 --replication-factor 3 # 使用同步模式傳送訊息資料 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_s2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092 --sync # 使用非同步模式傳送訊息記錄 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_s2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092
3.5.1 測試結果
3.5.2 結論
從測試結果來看,使用非同步模式傳送訊息資料,比使用同步模式傳送訊息資料,吞吐量是同步模式的3倍左右。
3.6 批處理大小
使用非同步模式傳送相同數量的訊息資料,改變批處理量的大小,檢視效能變化,執行指令碼如下:
# 以批處理模式傳送,大小為1000條 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_s2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092 --batch-size 1000 --request-timeout-ms 100000 # 以批處理模式傳送,大小為3000條 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_s2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092 --batch-size 3000 --request-timeout-ms 100000 # 以批處理模式傳送,大小為5000條 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_s2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092 --batch-size 5000 --request-timeout-ms 100000 # 以批處理模式傳送,大小為7000條 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_s2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092 --batch-size 7000 --request-timeout-ms 100000
3.6.1 測試結果
3.6.2 結論
從測試的結果來看,傳送的訊息隨著批處理大小增加而增加。當批處理大小增加到3000~5000時,吞吐量達到最佳值。而後再增加批處理大小,吞吐量的效能會下降。
3.7 訊息長度的大小
改變訊息的長度大小,檢視效能變化,執行指令碼如下:
# 傳送訊息,長度為100位元組 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_s2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092 --batch-size 3000 --request-timeout-ms 100000 --message-size 100 # 傳送訊息,長度為200位元組 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_s2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092 --batch-size 3000 --request-timeout-ms 100000 --message-size 200 # 傳送訊息,長度為500位元組 [hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages 5000000 --topics test_producer_perf_s2 --threads 3 --broker-list dn1:9092, dn2:9092, dn3:9092 --batch-size 3000 --request-timeout-ms 100000 --message-size 500
3.7.1 測試結果
3.7.2 結論
從測試結果來看,隨著訊息長度的增加,每秒所能傳送的訊息數量逐漸減少(nMsg/sec)。但是,每秒傳送的訊息的總大小(MB/sec),會隨著訊息長度的增加而增加。
4.消費者測試
消費者測試,可以從執行緒數、分割槽數、副本數等維度來進行測試。
4.1 執行緒數
建立一個擁有6個分割槽、1個備份的Topic,用不同的執行緒數讀取相同的資料量,檢視效能變化。測試指令碼如下:
# 建立主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 --topic test_consumer_perf --partitions 6 --replication-factor 1 # 設定1個執行緒數 [hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper dn1:2181,dn2:2181,dn3:2181 --messages 5000000 --topic test_consumer_perf --group g1 --threads 1 # 設定3個執行緒數 [hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper dn1:2181,dn2:2181,dn3:2181 --messages 5000000 --topic test_consumer_perf --group g2 --threads 3 # 設定6個執行緒數 [hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper dn1:2181,dn2:2181,dn3:2181 --messages 5000000 --topic test_consumer_perf --group g3 --threads 6
4.1.1 測試結果
4.1.2 結論
隨著執行緒數的增加,每秒讀取的訊息記錄會逐漸增加。線上程數與消費主題的分割槽相等時,吞吐量達到最佳值。隨後,再增加執行緒數,新增的執行緒數將會處於空閒狀態,對提升消費者程式的吞吐量沒有幫助。
4.2 分割槽數
新建一個Topic,改變它的分割槽數,讀取相同數量的訊息記錄,檢視效能變化,執行指令碼如下:
# 建立一個擁有12個分割槽的主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 --topic test_consumer_perf_p12 --partitions 12 --replication-factor 1 # 建立一個擁有24個分割槽的主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 --topic test_consumer_perf_p24 --partitions 24 --replication-factor 1 # 用一個執行緒讀取資料到擁有12個分割槽的主題中 [hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper dn1:2181,dn2:2181,dn3:2181 --messages 5000000 –topic test_consumer_perf_p12_--group g2 --threads 1 # 用一個執行緒讀取資料到擁有12個分割槽的主題中 [hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper dn1:2181,dn2:2181,dn3:2181 --messages 5000000 –topic test_consumer_perf_p24_--group g3 --threads 1
4.2.1 測試結果
4.2.2 結論
當分割槽數增加時,如果執行緒數保持不變,則消費者程式的吞吐量效能會下降。
4.3 副本數
新建Topic,改變Topic的副本數,讀取相同數量的訊息記錄,檢視效能變化,執行指令碼如下:
# 建立一個有用兩個副本、6個分割槽的主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 –topic test_consumer_perf_r2 --partitions 6 --replication-factor 2 # 建立一個有3個副本、6個分割槽的主題 [hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:2181, dn2:2181, dn3:2181 –topic test_consumer_perf_r3 --partitions 6 --replication-factor 3 # 用3個執行緒讀取資料到擁有兩個副本的主題中 [hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper dn1:2181 ,dn2:2181,dn3:2181 --messages 5000000 –topic test_consumer_perf_r2_--group g2 --threads 3 # 用3個執行緒讀取資料到擁有3個副本的主題中 [hadoop@dn1 ~]$ kafka-consumer-perf-test.sh --zookeeper dn1:2181 ,dn2:2181,dn3:2181 --messages 5000000 –topic test_consumer_perf_r3_--group g3 --threads 3
4.3.1 測試結果
4.3.2 結論
副本數對消費者程式的吞吐量影響較小,消費者程式是從Topic的每個分割槽的Leader上讀取資料的,而與副本數無關。
5.總結
Kafka效能測試步驟並不複雜,大家可以根據實際的測試環境、資料量,通過對生產者和消費者不同維度的測試,來獲取一組最佳的調優引數值。
6.結束語
這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!
另外,博主出書了《Kafka並不難學》,喜歡的朋友或同學, 可以在公告欄那裡點選購買連結購買博主的書進行學習,在此感謝大家的支援。