1. 程式人生 > 實用技巧 >叢集效能調優-速度篇

叢集效能調優-速度篇

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/

  1. 同步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

資料寫入流程

最佳方案:加機器