HDFS集群優化篇


                      HDFS集群優化篇

                                           作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

 

一.操作系統級別優化

1>.優化文件系統(推薦使用EXT4和XFS文件系統,相比較而言,更推薦后者,因為XFS已經幫我們做了大量的優化。為服務器存儲目錄掛載時添加noatime屬性)

2>.預讀緩沖

  預讀技術可以有效的減少磁盤尋道次數和應用的I/O等待時間,增加Linux文件系統預讀緩沖區的大小(默認為256 sectors,128KB),可以明顯提高順序文件的讀性能,建議調整到1024或2048 sectors。預讀緩沖區的設置可以通過blockdev命令來完成。
blockdev 工具允許從命令行調用區塊設備控制程序,常用參數如下:

  --getra 讀取預讀值
  --getfra 讀取文件系統預讀
  --setfra FSREADAHEAD 設置文件系統預讀
  --setra READAHEAD 設置設備預讀
  --getra 讀取設備的預讀值
  --setbsz BLOCKSIZE 在文件描述符打開塊設備的時候設置塊大小
  --getioopt 讀取設備優化IO大小    
  --getiomin 讀取設備最小IO大小
  -–setro 設置設備為只讀
  -–getro 讀取設備是否為只讀(成功為1,0則為可讀寫)
  -–setrw 設置設別為可讀寫
  -–getss 打印設備的扇區大小也叫邏輯塊大小,通常是512
  --getpbsz 讀取設備物理塊大小,通常是4096
  --getbsz 讀取設備塊大小,通常是4096
  -–getsize(-getsz) 打印設備的容量,按照一個扇區512個字節計算
  --getsize64 打印設備的容量,以字節為單位顯示
  -–setra N 設置預讀扇區(512字節)為N個.Set readahead to N 512-byte sectors.
  -–getra 打印readahead(預讀扇區)
  -–flushbufs 刷新緩沖
  -–rereadpt 重讀分區表。

  我們可以將默認的預讀值(256 sectors,128KB)調大,具體操作如下:


3>.放棄RAID和LVM磁盤管理方式,選用JBOD

不使用RAID 
  應避免在TaskTracker和DataNode所在的節點上進行RAID。RAID為保證數據可靠性,根據類型的不同會做一些額外的操作,HDFS有自己的備份機制,無需使用RAID來保證數據的高可用性。

不使用LVM   LVM是建立在磁盤和分區之上的邏輯層,將Linux文件系統建立在LVM之上,可實現靈活的磁盤分區管理能力。DataNode上的數據主要用於批量的讀寫,不需要這種特性,建議將每個磁盤單獨分區,分別掛載到不同的存儲目錄下,從而使得數據跨磁盤分布,不同數據塊的讀操作可並行執行,有助於提升讀性能。
JBOD   JBOD是在一個底板上安裝的帶有多個磁盤驅動器的存儲設備,JBOD沒有使用前端邏輯來管理磁盤數據,每個磁盤可實現獨立並行的尋址。將DataNode部署在配置JBOD設備的服務器上可提高DataNode性能。

4>.內存調優

   避免使用swap分區,將Hadoop守護進程的數據交換到磁盤的行為可能會導致操作超時。溫馨提示,避免使用swap分區並不意味着就不會使用swap分區,而是通過配置降低swap使用的可能性。詳情請參考:https://www.cnblogs.com/yinzhengjie/p/9994207.html

5>.調整內存分配策略

 

 

6>.網絡參數調優

   詳情請參考:https://www.cnblogs.com/yinzhengjie/p/9995756.html

 

二.HDFS集群性能優化

1>.歸檔

  存檔是用來備份的時候標識用的,說白就是做個標記,表示這個文檔在上次備份之后有沒有被修改過,比如當月1號,你給全盤做了一次備份,那么所有的文檔的存檔屬性都會被清除,表示備份過了。此后,如果你修改了某個文件,那么這個文件的存檔屬性就會被加上。當幾天后,你再做“增量”備份時候,系統就會只備份那些具有“存檔”屬性的文件

  每個文件均按塊方式存儲,每個塊的元數據存儲在namenode的內存中,因此hadoop存儲小文件會非常低效。因為大量的小文件會耗盡namenode中的大部分內存(文件大小為5kb,產生的元數據為150kb,得不償失)。一個1MB的文件以大小為128MB的塊存儲,使用的是1MB的磁盤空間,而不是128MB。

  Hadoop存檔文件或HAR文件,是一個更高效的文件存檔工具,它將文件存入HDFS塊,在減少namenode內存使用的同時,允許對文件進行透明的訪問。具體說來,Hadoop存檔文件可以用作MapReduce的輸入。

  Hdfs歸檔相當於把所有文件歸檔在一個文件夾里面了,該文件夾以.har命名的。當有很多的小文件時,可以通過歸檔來解決:

歸檔指令:

Hadoop archive–archiveName myhar.har –p /user/Ubuntu /user/my

【查看歸檔】

Hdfs dfs –lsrhar:///user/my/myhar.har

【解歸檔】

Hdfs dfs –cphar:///user/my/my.har /user/your

 

2>.壓縮

 

三.HDFS集群配置優化

   HDFS提供了十分豐富的配置選項,幾乎每個HDFS配置項都具有默認值,一些涉及性能的配置項的默認值一般都偏於保守。根據業務需求和服務器配置合理設置這些選項可以有效提高HDFS的性能。我的集群調優針對的是配置較高的服務器(我的HDFS集群配置是:12*8T硬盤,32core,128G內存空間。

1>.dfs.namenode.handler.count

   NameNode中用於處理RPC調用的線程數,默認為10。對於較大的集群和配置較好的服務器,可適當增加這個數值來提升NameNode RPC服務的並發度。

 

服務線程個數,調大一些,一般原則是將其設置為集群大小的自然對數乘以20,即20logN,N為集群大小下圖是CDH的配置參數:

2>.dfs.datanode.handler.count

   DataNode中用於處理RPC調用的線程數,默認為3。可適當增加這個數值來提升DataNode RPC服務的並發度(推薦值:20)。 注意:線程數的提高將增加DataNode的內存需求,因此,不宜過度調整這個數值。 

3>.dfs.replication

   數據塊的備份數,也有人叫復制因子。默認值為3,對於一些重要數據,可適當增加備份數。這個得根據你的集群容量和數據的重要性來考慮,如果數據不是很重要的話,你可以設置成1份,如果數據非常重要的話,你可以配置為5份,我這里推薦值為:2。並不是說你副本數配置越高數據就越丟失不了(副本數越多,只是存放同一份數據的機器運行宕機的個數為N-1(這里的N是副本數),當然如果有必要的話,你也可以考慮一下機甲感知,從而減少同時宕機的概率。),只不過你副本數存儲的越多,那么你的集群存儲的數據量也會收到相應的影響。他們是成反比的。

4>.dfs.block.size

   HDFS數據塊的大小,Hadoop1.x版本默認值為64M,Hadoop2.x版本默認值是128M。數據塊設置太小會增加NameNode的壓力。數據塊設置過大會增加定位數據的時間。這個值跟你的磁盤轉速有關,我之前在的博客里有解釋為什么是128M,其實這個跟磁盤的轉速有關。我們可以自定義這個塊大小,考慮2個因素,第一,查看你的集群文件大致范圍都是多大?如果文件基本上都是64M~128M左右的話,建議你不要修改。如果大部分文件都在200M~256M之間的話,你可以將配置塊大小改為256,當然你也得考慮你的磁盤讀寫性能。

 

5>.dfs.datanode.data.dir

  HDFS數據存儲目錄。將數據存儲分布在各個磁盤上可充分利用節點的I/O讀寫性能。因此在實際生產環境中,這就是為什么我們將磁盤不選擇RAID和LVM,而非要選擇JBOD的原因。推薦設置多個磁盤目錄,以增加磁盤IO的性能,多個目錄用逗號進行分隔。

 

6>.hadoop.tmp.dir

  Hadoop臨時目錄,默認為系統目錄/tmp。在每個磁盤上都建立一個臨時目錄,可提高HDFS和MapReduce的I/O效率。 這里也推薦設置多個目錄。如果你使用的是CDH的話,需要在高級選項的配置中自定義。

 

7>.io.file.buffer.size

   HDFS文件緩沖區大小,默認為4096(即4K)。 推薦值:131072(128K)。這個得編輯core-site.xml配置文件,如果你用的CDH的話,直接在YARN服務里修改即可。

8>.fs.trash.interval

   HDFS清理回收站的時間周期,單位為分鍾。默認為0,表示不使用回收站特性。推薦開啟它,時間你自己定義,推薦4~7天均可。

 

9>.dfs.datanode.du.reserved

  DataNode保留空間大小,單位為字節。默認情況下,DataNode會占用全部可用的磁盤空間,該配置項可以使DataNode保留部分磁盤空間工其他應用程序使用。這個得視具體應用而定,推薦稍微空出點空間,5G~10G均可。

 

10>.機架感知

   對於較大的集群,建議啟用HDFS的機架感應功能。啟用機架感應功能可以使HDFS優化數據塊備份的分布,增強HDFS的性能和可靠性。可參考的案例:https://www.cnblogs.com/yinzhengjie/p/9142230.html

11>.dfs.datanode.max.xcievers

  這個值是指定 datanode 可同時處理的最大文件數量,推薦將這個值調大,默認是256,最大值可以配置為65535。

12>.避免臟讀寫操作

    dfs.namenode.avoid.read.stale.datanode。

  dfs.namenode.avoid.write.stale.datanode

 

13>.增大Service Monitor 將使用配置屬性列表,搜索:“dfs.datanode.socket”,默認都是3秒,我這里改成了30s。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM