kafka壓力測試
1.生產(chǎn)者壓力測試
[shsxt@hadoop002 kafka]$ bin/kafka-producer-perf-test.sh --topic test --record-size 100 --num-records 100000 --throughput -1 --producer-props bootstrap.servers=hadoop002:9092,hadoop003:9092,hadoop004:9092
100000 records sent, 31486.146096 records/sec (3.00 MB/sec), 1374.63 ms avg latency, 1699.00 ms max latency, 1469 ms 50th, 1666 ms 95th, 1694 ms 99th, 1698 ms 99.9th.
2.消費者壓力測試
[shsxt@hadoop002 kafka]$ bin/kafka-consumer-perf-test.sh --zookeeper hadoop002:2181 --topic test --fetch-size 10000 --messages 10000000 --threads 1
start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec
2020-10-20 13:41:44:731, 2020-10-20 13:41:51:215, 9.5367, 1.4708, 100000, 15422.5787
PS:正常的集群應(yīng)該達(dá)到100M/sec以上
kafka機(jī)器數(shù)量計算
Kafka機(jī)器數(shù)量(經(jīng)驗公式)=2(峰值生產(chǎn)速度副本數(shù)/100)+1
先拿到峰值生產(chǎn)速度想罕,再根據(jù)設(shè)定的副本數(shù)藕施,就能預(yù)估出需要部署Kafka的數(shù)量。
比如我們的峰值生產(chǎn)速度是50M/s晒喷。副本數(shù)為2。
Kafka機(jī)器數(shù)量=2(502/100)+ 1=3臺(20臺以內(nèi)的服務(wù)器,速率在50M/s以下的,配置3臺kafka即可)
這是一個不斷迭代的過程墩划,配一下、測一下嗡综,最終確定合適的臺數(shù)乙帮。
HDFS參數(shù)調(diào)優(yōu)hdfs-site.xml
dfs.namenode.handler.count=20 * log2(Cluster Size),比如集群規(guī)模為8臺時极景,此參數(shù)設(shè)置為60(集群為6臺時察净,參數(shù)可設(shè)置為50左右)
The number of Namenode RPC server threads that listen to requests from clients. If dfs.namenode.servicerpc-address is not configured then Namenode RPC server threads listen to requests from all nodes.
NameNode有一個工作線程池,用來處理不同DataNode的并發(fā)心跳以及客戶端并發(fā)的元數(shù)據(jù)操作盼樟。對于大集群或者有大量客戶端的集群來說氢卡,通常需要增大參數(shù)dfs.namenode.handler.count的默認(rèn)值10。設(shè)置該值的一般原則是將其設(shè)置為集群大小的自然對數(shù)乘以20恤批,即20logN异吻,N為集群大小。
YARN參數(shù)調(diào)優(yōu)yarn-site.xml
(1)情景描述:總共7臺機(jī)器喜庞,每天幾億條數(shù)據(jù)诀浪,數(shù)據(jù)源->Flume->Kafka->HDFS->Hive
面臨問題:數(shù)據(jù)統(tǒng)計主要用HiveSQL,沒有數(shù)據(jù)傾斜延都,小文件已經(jīng)做了合并處理雷猪,開啟的JVM重用,而且IO沒有阻塞晰房,內(nèi)存用了不到50%求摇。但是還是跑的非常慢,而且數(shù)據(jù)量洪峰過來時殊者,整個集群都會宕掉与境。基于這種情況有沒有優(yōu)化方案猖吴。
(2)解決辦法:
內(nèi)存利用率不夠摔刁。這個一般是Yarn的2個配置造成的,單個任務(wù)可以申請的最大內(nèi)存大小海蔽,和Hadoop單個節(jié)點可用內(nèi)存大小共屈。調(diào)節(jié)這兩個參數(shù)能提高系統(tǒng)內(nèi)存的利用率。
(a)yarn.nodemanager.resource.memory-mb
表示該節(jié)點上YARN可使用的物理內(nèi)存總量党窜,默認(rèn)是8192(MB)拗引,注意,如果你的節(jié)點內(nèi)存資源不夠8GB幌衣,則需要調(diào)減小這個值矾削,而YARN不會智能的探測節(jié)點的物理內(nèi)存總量。
(b)yarn.scheduler.maximum-allocation-mb
單個任務(wù)可申請的最多物理內(nèi)存量,默認(rèn)是8192(MB)怔软。
NodeManager 8G =>要根據(jù)服務(wù)器實際內(nèi)存配置:
單個任務(wù)默認(rèn)內(nèi)存也是8G(WordCount操作)
任務(wù)中有很多的MapTask和ReduceTask垦细,假如數(shù)據(jù)是128M择镇,則默認(rèn)MT和RT為1G內(nèi)存
如果是1G的數(shù)據(jù)量挡逼,MT內(nèi)存設(shè)為8G(相應(yīng)*8)+(RT=2G),一共是10G
(看map的聚合壓縮情況腻豌,調(diào)整RT的內(nèi)存大屑铱病)
Hadoop宕機(jī)
(1)如果MR造成系統(tǒng)宕機(jī)。此時要控制Yarn同時運行的任務(wù)數(shù)吝梅,和每個任務(wù)申請的最大內(nèi)存虱疏。調(diào)整參數(shù):yarn.scheduler.maximum-allocation-mb(單個任務(wù)可申請的最多物理內(nèi)存量,默認(rèn)是8192MB)
(2)如果寫入文件過量造成NameNode宕機(jī)苏携。那么調(diào)高Kafka的存儲大小做瞪,控制從Kafka到HDFS的寫入速度。高峰期的時候用Kafka進(jìn)行緩存右冻,高峰期過去數(shù)據(jù)同步會自動跟上装蓬。
以及腳本的寫入和執(zhí)行
說明1:
java -classpath 需要在jar包后面指定全類名;
java -jar 需要查看一下解壓的jar包META-INF/ MANIFEST.MF文件中纱扭,Main-Class是否有全類名牍帚。如果有可以用java -jar,如果沒有就需要用到j(luò)ava -classpath
說明2:/dev/null代表linux的空設(shè)備文件乳蛾,所有往這個文件里面寫入的內(nèi)容都會丟失暗赶,俗稱“黑洞”。(可以將一些無用的日志丟入進(jìn)去)
flume集成kafka肃叶,設(shè)置上攔截器
1.實現(xiàn)接口
2.重寫4個方法(初始化蹂随、單event、雙event因惭、close關(guān)閉資源)
event能獲取到 body 和 header
ETL => body => 主要判斷的就是 json數(shù)據(jù) 是否以 { 開頭岳锁、以 } 結(jié)尾,還有服務(wù)器時間(長度13筛欢,全部是數(shù)字)
分類型攔截器 => body header => 根據(jù)body區(qū)分start或event類型浸锨,再把相應(yīng)數(shù)據(jù)添加到頭里面 topic,start_topic/event_topic
3.靜態(tài)內(nèi)部類Builder
new 對象
4.打包上傳集群
PS:kafka的blockId必須不能重復(fù)
如果想要生成其他時間點的數(shù)據(jù)版姑,一定要先停止全部集群柱搜,再去修改時間,否則會出現(xiàn)flume消費不到kafka數(shù)據(jù)的情況
(如果一定要造測試數(shù)據(jù)剥险,就往以后的年月日去改聪蘸,不要改成以前的年月日)
同步時間腳本
.# !/bin/bash
.# -t與sudo配套使用,虛擬終端的意思,下面是集群同步時間健爬,非正式使用控乾,一般是使用時間服務(wù)器
for i in hadoop002 hadoop003 hadoop004
do
echo "========== i "sudo date -s $1"
done
遠(yuǎn)程控制腳本
.# !/bin/bash
.# 遠(yuǎn)程登錄,執(zhí)行傳入的所有命令
for i in hadoop002 hadoop003 hadoop004
do
echo "========== i "$*"
done
查看全部節(jié)點的進(jìn)程
xcall.sh jps
超鏈接復(fù)制文件腳本
.#!/bin/bash
.#1 獲取輸入?yún)?shù)個數(shù)娜遵,如果沒有參數(shù)蜕衡,直接退出
pcount=$#
if ((pcount==0)); then
echo no args;
exit;
fi
.#2 獲取文件名稱
p1=p1`
echo fname=$fname
.#3 獲取上級目錄到絕對路徑
pdir=cd -P $(dirname $p1); pwd
echo pdir=$pdir
.#4 獲取當(dāng)前用戶名稱
user=whoami
.#5 循環(huán)
for host in hadoop002 hadoop003 hadoop004
do
echo ------------------- pdir/
user@
pdir
done
xsync
采集通道啟動停止腳本
.#!/bin/bash
case $1 in
"start"){
echo "----------啟動集群-----------"
/opt/module/hadoop-2.7.2/sbin/start-dfs.sh
ssh hadoop003 /opt/module/hadoop-2.7.2/sbin/start-yarn.sh
zk.sh start
sleep 5s;
f1.sh start
kf.sh start
sleep 8s;
f2.sh start
};;
"stop"){
echo "----------停止集群-----------"
f2.sh stop
sleep 5s;
kf.sh stop
sleep 10s;
f1.sh stop
zk.sh stop
ssh hadoop003 /opt/module/hadoop-2.7.2/sbin/stop-yarn.sh
/opt/module/hadoop-2.7.2/sbin/stop-dfs.sh
};;
esac
Hadoop相關(guān)總結(jié)
1)Hadoop默認(rèn)不支持LZO壓縮,如果需要支持LZO壓縮设拟,需要添加jar包慨仿,并在hadoop的cores-site.xml文件中添加相關(guān)壓縮配置。需要掌握讓LZO文件支持切片纳胧。
2)Hadoop常用端口號镰吆,50070,8088,19888,9000
3)Hadoop配置文件以及簡單的Hadoop集群搭建。8個配置文件
4)HDFS讀流程和寫流程
5)MapReduce的Shuffle過程及Hadoop優(yōu)化(包括:壓縮跑慕、小文件万皿、集群優(yōu)化)
6)Yarn的Job提交流程
7)Yarn的默認(rèn)調(diào)度器、調(diào)度器分類核行、以及他們之間的區(qū)別
8)HDFS存儲多目錄
9)Hadoop參數(shù)調(diào)優(yōu)
10)項目經(jīng)驗之基準(zhǔn)測試
Zookeeper相關(guān)總結(jié)
1)選舉機(jī)制
半數(shù)機(jī)制牢硅,安裝奇數(shù)臺
10臺服務(wù)器幾臺:3 臺
20臺服務(wù)器幾臺:5臺
100臺服務(wù)器幾臺:11臺
不是越多越好,也不是越少越好钮科。 如果多唤衫,通信時間長,效率低绵脯;如果太少佳励,可靠性差。
2)常用命令
ls蛆挫、get赃承、create
Flume相關(guān)總結(jié)
1)Flume組成,Put事務(wù)悴侵,Take事務(wù)
Taildir Source:斷點續(xù)傳瞧剖、多目錄。Flume1.6以前需要自己自定義Source記錄每次讀取文件位置可免,實現(xiàn)斷點續(xù)傳抓于。
File Channel:數(shù)據(jù)存儲在磁盤,宕機(jī)數(shù)據(jù)可以保存浇借。但是傳輸速率慢捉撮。適合對數(shù)據(jù)傳輸可靠性要求高的場景,比如妇垢,金融行業(yè)巾遭。
Memory Channel:數(shù)據(jù)存儲在內(nèi)存中肉康,宕機(jī)數(shù)據(jù)丟失。傳輸速率快灼舍。適合對數(shù)據(jù)傳輸可靠性要求不高的場景吼和,比如,普通的日志數(shù)據(jù)骑素。
Kafka Channel:減少了Flume的Sink階段炫乓,提高了傳輸效率。
Source到Channel是Put事務(wù)
Channel到Sink是Take事務(wù)
2)Flume攔截器
(1)攔截器注意事項
項目中自定義了:ETL攔截器和區(qū)分類型攔截器砂豌。
采用兩個攔截器的優(yōu)缺點:優(yōu)點厢岂,模塊化開發(fā)和可移植性;缺點阳距,性能會低一些
(2)自定義攔截器步驟
a)實現(xiàn) Interceptor
b)重寫四個方法
?initialize 初始化
?public Event intercept(Event event) 處理單個Event
?public List<Event> intercept(List<Event> events) 處理多個Event,在這個方法中調(diào)用Event intercept(Event event)
?close 方法
c)靜態(tài)內(nèi)部類结借,實現(xiàn)Interceptor.Builder