叢集效能調優-速度篇
1:HDFS儲存多目錄
只針對DN進行多目錄配置
1)生產環境伺服器磁碟情況
2)在hdfs-site.xml檔案中配置多目錄,注意新掛載磁碟的訪問許可權問題。
HDFS的DataNode節點儲存資料的路徑由dfs.datanode.data.dir引數決定,其預設值為file://${hadoop.tmp.dir}/dfs/data,若伺服器有多個磁碟,必須對該引數進行修改。如伺服器磁碟如上圖所示,則該引數應修改為如下的值
<property> <name>dfs.datanode.data.dir</name><value>file:///dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value> </property>
2:叢集資料均衡
1)節點間資料均衡
開啟資料均衡命令
start-balancer.sh –threshold 10
對於引數10,代表的是叢集中各個節點的磁碟空間利用率相差不超過10%,可根據實際情況進行調整。
停止資料均衡命令:
stop-balancer.sh
2)磁碟間資料均衡
生成均衡計劃
hdfs diskbalancer -plan hadoop103
3)檢視當前均衡任務的執行情況
hdfs diskbalancer -query hadoop103
4)取消均衡任務
hdfs diskbalancer -cancel hadoop103.plan.json
3:設定hadoop的LZO壓縮
1)編譯步驟
hadoop本身並不支援lzo壓縮,故需要使用twitter提供的hadoop-lzo開源元件。hadoop-lzo需依賴hadoop和lzo進行編譯,編譯步驟如下
lzo壓縮速度快,壓縮率百分之50左右;大資料場景下,通常我們對壓縮格式的選擇只要滿足50%就足夠
Hadoop支援LZO 0. 環境準備 maven(下載安裝,配置環境變數,修改sitting.xml加阿里雲映象) gcc-c++ zlib-devel autoconf automake libtool 通過yum安裝即可,yum -y install gcc-c++ lzo-devel zlib-devel autoconf automake libtool 1. 下載、安裝並編譯LZO wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz tar -zxvf lzo-2.10.tar.gz cd lzo-2.10 ./configure -prefix=/usr/local/hadoop/lzo/ make make install 2. 編譯hadoop-lzo原始碼 2.1 下載hadoop-lzo的原始碼,下載地址:https://github.com/twitter/hadoop-lzo/archive/master.zip 2.2 解壓之後,修改pom.xml <hadoop.current.version>3.1.3</hadoop.current.version> 2.3 宣告兩個臨時環境變數 export C_INCLUDE_PATH=/usr/local/hadoop/lzo/include export LIBRARY_PATH=/usr/local/hadoop/lzo/lib 2.4 編譯 進入hadoop-lzo-master,執行maven編譯命令 mvn package -Dmaven.test.skip=true 2.5 進入target,hadoop-lzo-0.4.21-SNAPSHOT.jar 即編譯成功的hadoop-lzo元件
2)將編譯好後的hadoop-lzo-0.4.20.jar 放入hadoop-3.1.3/share/hadoop/common/
- 同步hadoop-lzo-0.4.20.jar到hadoop103、hadoop104
[root@hadoop102 common]$ xsync hadoop-lzo-0.4.20.jar
4)core-site.xml增加配置支援LZO壓縮
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
5)同步core-site.xml到hadoop103、hadoop104
xsync core-site.xml
2)在專案中使用LZO壓縮
LZO壓縮檔案可切片的特性依賴於索引,所以使用lzo時需要先手動建立索引,若無索引,則LZO檔案的切片不管多大都只有一個
1)建立LZO檔案的索引
hadoop jar /path/to/your/hadoop-lzo.jar com.hadoop.compression.lzo.DistributedLzoIndexer filename.lzo
2)基於filename.lzo檔案執行MR任務 (filename.lzo位於input目錄下)
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2
4:叢集佔用記憶體資源計算
假設伺服器記憶體128G
NameNode建議記憶體100G
單任務記憶體怎麼調?
根據輸入端資料的大小
128M資料對應 1G記憶體(maptask)
1G資料 1G/128M=8
8個maptask=8g
問題1:假設有一個電商專案共有三個任務指標,指標A有1G資料,指標B佔用2G資料,指標C佔用3G資料
問,該叢集一共需要使用多少記憶體?
1G/128M+2G/128M+3G/128M =48g
各元件間佔用的預設記憶體
NameNode 8G
maptask 1G
reducetask 1G
單任務預設記憶體 8G
5:Hadoop引數調優
1)hdfs引數調優hdfs-site.xml
log2(Cluster Size)的意思就是求Cluster Size是2的多少次冪
dfs.namenode.handler.count=20×log2(Cluster Size),比如叢集規模為8臺時,此引數設定為60
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的併發心跳以及客戶端併發的元資料操作。
對於大叢集或者有大量客戶端的叢集來說,通常需要增大引數dfs.namenode.handler.count的預設值10。
<property>
<name>dfs.namenode.handler.count</name>
<value>10</value>
</property>
2)YARN引數調優yarn-site.xml
(1)情景描述:總共7臺機器,每天幾億條資料,資料來源->Flume->Kafka->HDFS->Hive
面臨問題:資料統計主要用HiveSQL,沒有資料傾斜,小檔案已經做了合併處理,開啟的JVM重用,而且IO沒有阻塞,記憶體用了不到50%。但是還是跑的非常慢,而且資料量洪峰過來時,整個叢集都會宕掉。基於這種情況有沒有優化方案。
(2)解決辦法:
記憶體利用率不夠。這個一般是Yarn的2個配置造成的,單個任務可以申請的最大記憶體大小,和Hadoop單個節點可用記憶體大小。調節這兩個引數能提高系統記憶體的利用率。
(a)yarn.nodemanager.resource.memory-mb
表示該節點上YARN可使用的實體記憶體總量,預設是8192(MB),注意,如果你的節點記憶體資源不夠8GB,則需要調減小這個值,而YARN不會智慧的探測節點的實體記憶體總量。
(b)yarn.scheduler.maximum-allocation-mb
單個任務可申請的最多實體記憶體量,預設是8192(MB)。
3)Hadoop宕機
1)如果MR造成系統宕機。此時要控制Yarn同時執行的任務數,和每個任務申請的最大記憶體。調整引數:
yarn.scheduler.maximum-allocation-mb (單個任務可申請的最多實體記憶體量,預設是8192MB)
2)如果寫入檔案過量造成NameNode宕機。那麼調高Kafka的儲存大小,控制從Kafka到HDFS的寫入速度。高峰期的時候用Kafka進行快取,高峰期過去資料同步會自動跟上
調整 flume寫出速度的大小
控制sink從kafka消費資料的速度
sink.batchsize =1000
資料寫入流程
最佳方案:加機器