關於Hadoop調優

愛吃大抄手的黃大超發表於2021-07-18

Hadoop生產調優

一、HDFS—核心引數

1、NameNode 記憶體生產配置

1) NameNode 記憶體計算

每個檔案塊大概佔用 150byte,一臺伺服器 128G 記憶體為例,能儲存多少檔案塊呢?

128 * 1024 * 1024 * 1024 / 150Byte ≈ 9.1 億

2) Hadoop2.x 系列,配置 NameNode 記憶體

​ NameNode 記憶體預設 2000m,如果伺服器記憶體 4G,NameNode 記憶體可以配置 3g。在hadoop-env.sh 檔案中配置如下。

HADOOP_NAMENODE_OPTS=-Xmx3072m

3) Hadoop3.x 系列,配置 NameNode 記憶體

(1)hadoop-env.sh 中描述 Hadoop 的記憶體是動態分配的

# The maximum amount of heap to use (Java -Xmx). If no unit
# is provided, it will be converted to MB. Daemons will
# prefer any Xmx setting in their respective _OPT variable.
# There is no default; the JVM will autoscale based upon machine
# memory size.
# export HADOOP_HEAPSIZE_MAX=
# 要使用的最大堆數量(Java -Xmx)。如果沒有提供單位,它將被轉換為MB。守護程式會更喜歡在它們各自的_OPT變數中設定任何Xmx。沒有違約;JVM將根據機器記憶體大小自動伸縮。
# The minimum amount of heap to use (Java -Xms). If no unit
# is provided, it will be converted to MB. Daemons will
# prefer any Xms setting in their respective _OPT variable.
# There is no default; the JVM will autoscale based upon machine
# memory size.
# export HADOOP_HEAPSIZE_MIN=
# 要使用的最小堆數量(Java -Xms)。如果沒有提供單位,它將被轉換為MB。守護程式會更喜歡在它們各自的_OPT變數中設定任何Xms。沒有違約;JVM將根據機器記憶體大小自動伸縮。

HADOOP_NAMENODE_OPTS=-Xmx102400m

(2)檢視 NameNode 佔用記憶體

[chaos@hadoop102 ~]$ jps 

3088 NodeManager 
2611 NameNode 
3271 JobHistoryServer 
2744 DataNode 
3579 Jps   

[chaos@hadoop102 ~]$ jmap -heap 2611 

Heap Configuration:     
	MaxHeapSize = 1031798784 (984.0MB)   

(3)檢視 DataNode 佔用記憶體

 [chaos@hadoop102 ~]$ jmap -heap 2744  
 Heap Configuration:     
 	MaxHeapSize = 1031798784 (984.0MB)   

檢視發現 hadoop102 上的 NameNode 和 DataNode 佔用記憶體都是自動分配的,且相等。不是很合理。 經驗參考:

Component Memory CPU Disk
JournalNode 日誌節點 1 GB (default)Set this value using the Java Heap Size of JournalNode in Bytes HDFS configuration property.
1 GB(預設)使用位元組HDFS 配置屬性中 JournalNodeJava 堆大小設定此值。
1 core minimum
最少 1 個核心
1 dedicated disk 1個專用磁碟
NameNode Minimum: 1 GB (for proof-of-concept deployments)
Add an additional 1 GB for each additional 1,000,000 blocksSnapshots and encryption can increase the required heap memory.
See Sizing NameNode Heap Memory
Set this value using the Java Heap Size of NameNode in Bytes HDFS configuration property.最低:1 GB(用於概念驗證部署)
每增加 1,000,000 個block 增加 1 GB
快照和加密可以增加所需的堆記憶體。
請參閱調整 NameNode 堆記憶體大小
使用位元組HDFS 配置屬性中 NameNode的Java 堆大小設定此值。
Minimum of 4 dedicated cores; more may be required for larger clusters
最少 4 個專用核心;更大的叢集可能需要更多
Minimum of 2 dedicated disks for metadata1 dedicated disk for log files (This disk may be shared with the operating system.)Maximum disks: 4
至少 2 個用於後設資料的專用磁碟
1 個用於日誌檔案的專用磁碟(該磁碟可能與作業系統共享。)
最大磁碟數:4
DataNode Minimum: 4 GBIncrease the memory for higher replica counts or a higher number of blocks per DataNode. When increasing the memory, Cloudera recommends an additional 1 GB of memory for every 1 million replicas above 4 million on the DataNodes. For example, 5 million replicas require 5 GB of memory.Set this value using the Java Heap Size of DataNode in Bytes HDFS configuration property.
最低:4 GB
增加記憶體以獲得更高的副本計數或每個 DataNode 的更多塊數。在增加記憶體時,Cloudera 建議為 DataNode 上 400 萬個以上的每 100 萬個副本增加 1 GB 記憶體。例如,500 萬個副本需要 5 GB 記憶體。
使用位元組HDFS 配置屬性中 DataNode的Java 堆大小設定此值。
Minimum: 4 cores. Add more cores for highly active clusters.
最低:4 核。為高度活躍的叢集新增更多核心。
Minimum: 4Maximum: 24The maximum acceptable size will vary depending upon how large average block size is. The DN’s scalability limits are mostly a function of the number of replicas per DN, not the overall number of bytes stored. That said, having ultra-dense DNs will affect recovery times in the event of machine or rack failure. Cloudera does not support exceeding 100 TB per data node. You could use 12 x 8 TB spindles or 24 x 4TB spindles. Cloudera does not support drives larger than 8 TB.
最少:4
最大:24
最大可接受大小將取決於平均塊大小有多大。DN 的可擴充套件性限制主要取決於每個 DN 的副本數,而不是儲存的總位元組數。也就是說,如果機器或機架出現故障,擁有超密集 DN 將影響恢復時間。Cloudera 不支援每個資料節點超過 100 TB。您可以使用 12 x 8 TB 軸或 24 x 4TB 軸。Cloudera 不支援大於 8 TB 的驅動器。

具體修改:hadoop-env.sh

export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS - Xmx1024m"
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS -Xmx1024m"

2、NameNode 心跳併發配置

hdfs-site.xml

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的併發心跳以及客戶端併發的後設資料操作。對於大叢集或者有大量客戶端的叢集來說,通常需要增大該引數。預設值是10。 
<property> 
    <name>dfs.namenode.handler.count</name> 
    <value>21</value> 
</property> 

企業經驗

dfs.namenode.handler.count=20 × ????^??????????e

比如叢集規模(DataNode 臺 數)為 3 臺時,此引數設定為 21。可通過簡單的 python 程式碼計算該值,程式碼如下。

[chaos@hadoop102 ~]$ sudo yum install -y python
[chaos@hadoop102 ~]$ python
Python 2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more
information.
>>> import math
>>> print int(20*math.log(3))
21
>>> quit()

3、開啟回收站配置

開啟回收站功能,可以將刪除的檔案在不超時的情況下,恢復原資料,起到防止誤刪除、 備份等作用。

1)回收站工作機制

2)開啟回收站功能引數說明

(1)預設值 fs.trash.interval = 0,0 表示禁用回收站;其他值表示設定檔案的存活時間。

(2)預設值 fs.trash.checkpoint.interval = 0,檢查回收站的間隔時間。如果該值為 0,則該值設定和 fs.trash.interval 的引數值相等。

(3)要求 fs.trash.checkpoint.interval <= fs.trash.interval。

3)啟用回收站

修改 core-site.xml,配置垃圾回收時間為 1 分鐘

<property> 
    <name>fs.trash.interval</name> 
    <value>1</value> 
</property>

4)檢視回收站

回收站目錄在 HDFS 叢集中的路徑:/user/chaos/.Trash/….

5)注意

(1)通過網頁上直接刪除的檔案也不會走回收站。

(2)通過程式刪除的檔案不會經過回收站,需要呼叫 moveToTrash()才進入回收站

Trash trash = New Trash(conf); trash.moveToTrash(path);

(3)只有在命令列利用 hadoop fs -rm 命令刪除的檔案才會走回收站。

[chaos@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r 

/user/chaos/input

2021-07-14 16:13:42,643 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hadoop102:9820/user/chaos/input' to trash at: hdfs://hadoop102:9820/user/chaos/.Trash/Current/user/chaos /input 

8)恢復回收站資料

[chaos@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /user/chaos/.Trash/Current/user/chaos/input /user/chaos/input 

二、HDFS—叢集壓測

在企業中非常關心每天從 Java 後臺拉取過來的資料,需要多久能上傳到叢集?消費者關心多久能從 HDFS 上拉取需要的資料?

為了搞清楚 HDFS 的讀寫效能,生產環境上非常需要對叢集進行壓測

HDFS 的讀寫效能主要受網路和磁碟影響比較大。為了方便測試,將 hadoop102、 hadoop103、hadoop104 虛擬機器網路都設定為 100mbps。

100Mbps 單位是 bit;10M/s 單位是 byte ; 1byte=8bit,100Mbps/8=12.5M/s。測試網速:來到 hadoop102 的/opt/module 目錄,建立一個

[chaos@hadoop102 software]$ python -m SimpleHTTPServer 

1、測試 HDFS 寫效能

寫測試底層原理:

1)測試內容:向 HDFS 叢集寫 10 個 128M 的檔案

[chaos@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-clientjobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 10 fileSize 128MB 

 

2021-02-09 10:43:16,853 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write 

2021-02-09 10:43:16,854 INFO fs.TestDFSIO:       Date & time: Tue Feb 

09 10:43:16 CST 2021 

2021-02-09 10:43:16,854 INFO fs.TestDFSIO:     Number of files: 10 

2021-02-09 10:43:16,854 INFO fs.TestDFSIO: Total MBytes processed: 1280 

2021-02-09 10:43:16,854 INFO fs.TestDFSIO:    Throughput mb/sec: 1.61 

2021-02-09 10:43:16,854 INFO fs.TestDFSIO:  Average IO rate mb/sec: 1.9 

2021-02-09 10:43:16,854 INFO fs.TestDFSIO:  IO rate std deviation: 0.76 2021-02-09 10:43:16,854 INFO fs.TestDFSIO:   Test exec time sec: 133.05 2021-02-09 10:43:16,854 INFO fs.TestDFSIO: 

注意:nrFiles n 為生成 mapTask 的數量,生產環境一般可通過 hadoop103:8088 檢視 CPU 核數,設定為(CPU 核數 - 1)

Number of files:生成 mapTask 數量,一般是叢集中(CPU 核數-1),我們測試虛擬機器就按照實際的實體記憶體-1 分配即可

Total MBytes processed:單個 map 處理的檔案大小

Throughput mb/sec:單個 mapTak 的吞吐量

計算方式:處理的總檔案大小/每一個 mapTask 寫資料的時間累加叢集整體吞吐量:生成 mapTask 數量*單個 mapTak 的吞吐量

Average IO rate mb/sec::平均 mapTak 的吞吐量

計算方式:每個 mapTask 處理檔案大小/每一個 mapTask 寫資料的時間

全部相加除以 task 數量

IO rate std deviation:方差、反映各個 mapTask 處理的差值,越小越均衡

2)注意:如果測試過程中,出現異常

(1)可以在 yarn-site.xml 中設定虛擬記憶體檢測為 false

<!--是否啟動一個執行緒檢查每個任務正使用的虛擬記憶體量,如果任務超出分配值,則直接將其殺掉,預設是true --> 

<property>

   <name>yarn.nodemanager.vmem-check-enabled</name> 

   <value>false</value>

</property> 

(2)分發配置並重啟 Yarn 叢集

3)測試結果分析

(1)由於副本 1 就在本地,所以該副本不參與測試

一共參與測試的檔案:10 個檔案 * 2 個副本 = 20 個壓測後的速度:1.61

實測速度:1.61M/s * 20 個檔案 ≈ 32M/s 三臺伺服器的頻寬:12.5 + 12.5 + 12.5 ≈ 30m/s

所有網路資源都已經用滿。

如果實測速度遠遠小於網路,並且實測速度不能滿足工作需求,可以考慮採用固態硬碟或者增加磁碟個數。

(2)如果客戶端不在叢集節點,那就三個副本都參與計算

2、測試 HDFS 讀效能

1)測試內容:讀取 HDFS 叢集 10 個 128M 的檔案

[chaos@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-

3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-clientjobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 

128MB

 

2021-02-09 11:34:15,847 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read 

2021-02-09 11:34:15,847 INFO fs.TestDFSIO:       Date & time: Tue Feb 

09 11:34:15 CST 2021 

2021-02-09 11:34:15,847 INFO fs.TestDFSIO:     Number of files: 10 

2021-02-09 11:34:15,847 INFO fs.TestDFSIO: Total MBytes processed: 1280 

2021-02-09 11:34:15,848 INFO fs.TestDFSIO:    Throughput mb/sec: 200.28 

2021-02-09 11:34:15,848 INFO fs.TestDFSIO: Average IO rate mb/sec: 266.74 

2021-02-09 11:34:15,848 INFO fs.TestDFSIO:  IO rate std deviation: 143.12 

2021-02-09 11:34:15,848 INFO fs.TestDFSIO:   Test exec time sec: 20.83 

2)刪除測試生成資料

[chaos@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-clientjobclient-3.1.3-tests.jar TestDFSIO -clean 

測試結果分析:為什麼讀取檔案速度大於網路頻寬?由於目前只有三臺伺服器,且有三個副本,資料讀取就近原則,相當於都是讀取的本地磁碟資料,沒有走網路。

3、HDFS—多目錄

NameNode 多目錄配置

1)NameNode 的本地目錄可以配置成多個,且每個目錄存放內容相同,增加了可靠性

2)具體配置如下

在 hdfs-site.xml 檔案中新增如下內容

<property>
   <name>dfs.namenode.name.dir</name>
   <value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp. dir}/dfs/name2</value> 
</property>

注意:因為每臺伺服器節點的磁碟情況不同,所以這個配置配完之後,可以選擇不分發(2)停止叢集,刪除三臺節點的 data 和 logs 中所有資料。

[chaos@hadoop102 hadoop-3.1.3]$ rm -rf data/ logs/ 

[chaos@hadoop103 hadoop-3.1.3]$ rm -rf data/ logs/ 

[chaos@hadoop104 hadoop-3.1.3]$ rm -rf data/ logs/ 

(3)格式化叢集並啟動。

[chaos@hadoop102 hadoop-3.1.3]$ bin/hdfs namenode -format 

[chaos@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh 

3)檢視結果

 [chaos@hadoop102  dfs]$ ll 

總用量 12   
drwx------.  3 chaos chaos 4096 12月 11  08:03 data 
drwxrwxr-x. 3 chaos chaos 4096 12月 11 08:03 name1 
drwxrwxr-x. 3 chaos chaos 4096 12月 11 08:03 name2   

檢查 name1name2 裡面的內容,發現一模一樣

DataNode 多目錄配置

1)DataNode 可以配置成多個目錄,每個目錄儲存的資料不一樣(資料不是副本)

2)具體配置如下

在 hdfs-site.xml 檔案中新增如下內容

<property> 
    <name>dfs.datanode.data.dir</name>
	<value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value> 
</property>

3)檢視結果

[chaos@hadoop102 dfs]$ ll 
總用量 12   
drwx------.  3 chaos chaos 4096 4月  4 14:22 data1  
drwx------. 3 chaos chaos 4096 4月  4 14:22 data2  
drwxrwxr-x. 3 chaos chaos 4096 12月  11 08:03 name1 
drwxrwxr-x. 3 chaos chaos 4096 12月 11 08:03  name2   

4)向叢集上傳一個檔案,再次觀察兩個資料夾裡面的內容發現不一致(一個有數一個沒有)

[chaos@hadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/word.txt / 

三、 叢集資料均衡之磁碟間資料均衡

生產環境,由於硬碟空間不足,往往需要增加一塊硬碟。剛載入的硬碟沒有資料時,可以執行磁碟資料均衡命令。(Hadoop3.x 新特性)

1、生成均衡計劃

(如果只有一塊磁碟,不會生成計劃)

hdfs diskbalancer -plan hadoop103 

2、執行均衡計劃

hdfs diskbalancer -execute hadoop103.plan.json 

3、檢視當前均衡任務的執行情況

hdfs diskbalancer -query hadoop103 

4、取消均衡任務

hdfs diskbalancer -cancel hadoop103.plan.json 

四、 HDFS—叢集擴容及縮容

1、新增白名單

白名單:表示在白名單的主機 IP 地址可以,用來儲存資料。

企業中:配置白名單,可以儘量防止黑客惡意訪問攻擊。

配置白名單步驟如下:

1)NameNode 節點的/opt/module/hadoop-3.1.3/etc/hadoop 目錄下分別建立 whitelistblacklist 檔案

(1)建立白名單

[chaos@hadoop102 hadoop]$ vim whitelist

在 whitelist 中新增如下主機名稱,假如叢集正常工作的節點為 102 103

hadoop102 hadoop103

(2)建立黑名單

[chaos@hadoop102 hadoop]$ touch blacklist

保持空的就可以

2)hdfs-site.xml 配置檔案中增加 dfs.hosts 配置引數

<!-- 白名單 --> 

<property>

   <name>dfs.hosts</name> 

   <value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>

</property>

 

<!-- 黑名單 --> 

<property>

   <name>dfs.hosts.exclude</name>

   <value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>

</property>

3)分發配置檔案 whitelisthdfs-site.xml

[chaos@hadoop104 hadoop]$ xsync hdfs-site.xml whitelist 

4)第一次新增白名單必須重啟叢集,不是第一次,只需要重新整理 NameNode 節點即可

[chaos@hadoop102 hadoop-3.1.3]$ myhadoop.sh stop 
[chaos@hadoop102 hadoop-3.1.3]$ myhadoop.sh start 

5)web 瀏覽器上檢視 DNhttp://hadoop102:9870/dfshealth.html#tab-datanode

6)在 hadoop104 上執行上傳資料資料失敗

[chaos@hadoop104 hadoop-3.1.3]$ hadoop fs -put NOTICE.txt /

7)二次修改白名單,增加 hadoop104

[chaos@hadoop102 hadoop]$ vim whitelist
修改為如下內容
hadoop102
hadoop103
hadoop104

8)重新整理 NameNode

[chaos@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful

9)在 web 瀏覽器上檢視 DN,http://hadoop102:9870/dfshealth.html#tab-datanode

2、服役新伺服器

1)需求

隨著公司業務的增長,資料量越來越大,原有的資料節點的容量已經不能滿足儲存資料的需求,需要在原有叢集基礎上動態新增新的資料節點。

2)環境準備

(1)在 hadoop100 主機上再克隆一臺 hadoop105 主機

(2)修改 IP 地址和主機名稱

[root@hadoop105 ~]# vim /etc/sysconfig/network-scripts/ifcfgens33 

[root@hadoop105 ~]# vim /etc/hostname 

(3)拷貝 hadoop102 的/opt/module 目錄和/etc/profile.d/my_env.sh 到 hadoop105

[chaos@hadoop102   opt]$ scp -r module/* chaos@hadoop105:/opt/module/
[chaos@hadoop102 opt]$ sudo scp /etc/profile.d/my_env.sh root@hadoop105:/etc/profile.d/my_env.sh
[chaos@hadoop105 hadoop-3.1.3]$ source /etc/profile 

(4)刪除 hadoop105 上 Hadoop 的歷史資料,data 和 log 資料

[chaos@hadoop105 hadoop-3.1.3]$ rm -rf data/ logs/ 

(5)配置 hadoop102 和 hadoop103 到 hadoop105 的 ssh 無密登入

[chaos@hadoop102 .ssh]$ ssh-copy-id hadoop105 
[chaos@hadoop103 .ssh]$ ssh-copy-id hadoop105 

3)服役新節點具體步驟

直接啟動 DataNode,即可關聯到叢集

[chaos@hadoop105 hadoop-3.1.3]$ hdfs --daemon start datanode 
[chaos@hadoop105 hadoop-3.1.3]$ yarn --daemon start nodemanager 

4)在白名單中增加新服役的伺服器

(1)在白名單 whitelist 中增加 hadoop104、hadoop105,並重啟叢集

[chaos@hadoop102 hadoop]$ vim  whitelist   

hadoop102
hadoop103
hadoop104
hadoop105   

(2)分發

[chaos@hadoop102 hadoop]$ xsync whitelist 

(3)重新整理 NameNode

[chaos@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes Refresh nodes successful 

5)在 hadoop105 上上傳檔案

[chaos@hadoop105 hadoop-3.1.3]$ hadoop fs -put /opt/module/hadoop-3.1.3/LICENSE.txt /

3、伺服器間資料均衡

1)企業經驗

在企業開發中,如果經常在 hadoop102 和 hadoop104 上提交任務,且副本數為 2,由於資料本地性原則,就會導致 hadoop102 和 hadoop104 資料過多,hadoop103 儲存的資料量小。

另一種情況,就是新服役的伺服器資料量比較少,需要執行叢集均衡命令。

2)開啟資料均衡命令:

[chaos@hadoop105 hadoop-3.1.3]$ sbin/start-balancer.sh -
threshold 10

對於引數 10,代表的是叢集中各個節點的磁碟空間利用率相差不超過 10%,可根據實際情況進行調整。

3)停止資料均衡命令:

[chaos@hadoop105 hadoop-3.1.3]$ sbin/stop-balancer.sh

注意:由於 HDFS 需要啟動單獨的 Rebalance Server 來執行 Rebalance 操作,所以儘量不要在 NameNode 上執行 start-balancer.sh,而是找一臺比較空閒的機器。

4、黑名單退役伺服器

黑名單:表示在黑名單的主機 IP 地址不可以,用來儲存資料。

企業中:配置黑名單,用來退役伺服器。

1)編輯/opt/module/hadoop-3.1.3/etc/hadoop 目錄下的 blacklist 檔案

[chaos@hadoop102 hadoop] vim blacklist 

新增如下主機名稱(要退役的節點) 

hadoop105 

注意:如果白名單中沒有配置,需要在 hdfs-site.xml 配置檔案中增加 dfs.hosts 配置引數

<!-- 黑名單 --> 

<property>

   <name>dfs.hosts.exclude</name>

   <value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>

</property>

2)分發配置檔案 blacklisthdfs-site.xml

[chaos@hadoop104 hadoop]$ xsync hdfs-site.xml blacklist 

3)第一次新增黑名單必須重啟叢集,不是第一次,只需要重新整理 NameNode 節點即可

[chaos@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes Refresh nodes successful 

4)檢查 Web 瀏覽器,退役節點的狀態為 decommission in progress(退役中),說明資料節點正在複製塊到其他節點

5)等待退役節點狀態為 decommissioned(所有塊已經複製完成),停止該節點及節點資源管理器。注意:如果副本數是 3,服役的節點小於等於 3,是不能退役成功的,需要修改副本數後才能退役

[chaos@hadoop105 hadoop-3.1.3]$ hdfs --daemon stop datanode 

stopping datanode

[chaos@hadoop105 hadoop-3.1.3]$ yarn --daemon stop nodemanager

stopping nodemanager

6)如果資料不均衡,可以用命令實現叢集的再平衡

[chaos@hadoop102 hadoop-3.1.3]$ sbin/start-balancer.sh -threshold 10

五、HDFS—儲存優化

1、糾刪碼

糾刪碼原理 HDFS 預設情況下,一個檔案有 3 個副本,這樣提高了資料的可靠性,但也帶來了 2 倍 的冗餘開銷。Hadoop3.x 引入了糾刪碼,採用計算的方式,可以節省約 50%左右的儲存空間。

1)糾刪碼操作相關的命令

[chaos@hadoop102 hadoop-3.1.3]$ hdfs ec
Usage: bin/hdfs ec [COMMAND]
 [-listPolicies]
 [-addPolicies -policyFile <file>]
 [-getPolicy -path <path>]
 [-removePolicy -policy <policy>]
 [-setPolicy -path <path> [-policy <policy>] [-replicate]]
 [-unsetPolicy -path <path>]
 [-listCodecs]
 [-enablePolicy -policy <policy>]
 [-disablePolicy -policy <policy>]
 [-help <command-name>].

2)檢視當前支援的糾刪碼策略

[chaos@hadoop102 hadoop-3.1.3] hdfs ec -listPolicies 

 

Erasure Coding Policies: 
ErasureCodingPolicy=[Name=RS-10-4-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=10, numParityUnits=4]], CellSize=1048576, Id=5], State=DISABLED

ErasureCodingPolicy=[Name=RS-3-2-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=3, numParityUnits=2]], CellSize=1048576, Id=2], 
State=DISABLED

ErasureCodingPolicy=[Name=RS-6-3-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=6, numParityUnits=3]], CellSize=1048576, Id=1], 
State=**ENABLED** 


ErasureCodingPolicy=[Name=RS-LEGACY-6-3-1024k, 
Schema=[ECSchema=[Codec=rs-legacy, numDataUnits=6, numParityUnits=3]], 

CellSize=1048576, Id=3], State=DISABLED 

 

ErasureCodingPolicy=[Name=XOR-2-1-1024k, Schema=[ECSchema=[Codec=xor, numDataUnits=2, numParityUnits=1]], CellSize=1048576, Id=4], State=DISABLED 

3)糾刪碼策略解釋:

RS-3-2-1024k:使用 RS 編碼,每 3 個資料單元,生成 2 個校驗單元,共 5 個單元,也就是說:這 5 個單元中,只要有任意的 3 個單元存在(不管是資料單元還是校驗單元,只要總數=3),就可以得到原始資料。每個單元的大小是 1024k=1024*1024=1048576。

RS-10-4-1024k:使用 RS 編碼,每 10 個資料單元(cell),生成 4 個校驗單元,共 14個單元,也就是說:這 14 個單元中,只要有任意的 10 個單元存在(不管是資料單元還是校驗單元,只要總數=10),就可以得到原始資料。每個單元的大小是 1024k=1024*1024=1048576。

RS-6-3-1024k:使用 RS 編碼,每 6 個資料單元,生成 3 個校驗單元,共 9 個單元,也就是說:這 9 個單元中,只要有任意的 6 個單元存在(不管是資料單元還是校驗單元,只要總數=6),就可以得到原始資料。每個單元的大小是 1024k=1024*1024=1048576。

RS-LEGACY-6-3-1024k:策略和上面的 RS-6-3-1024k 一樣,只是編碼的演算法用的是 rslegacy。

XOR-2-1-1024k:使用 XOR 編碼(速度比 RS 編碼快),每 2 個資料單元,生成 1 個校驗單元,共 3 個單元,也就是說:這 3 個單元中,只要有任意的 2 個單元存在(不管是資料單元還是校驗單元,只要總數= 2),就可以得到原始資料。每個單元的大小是1024k=1024*1024=1048576。

4)糾刪碼案例實操

糾刪碼策略是給具體一個路徑設定。所有往此路徑下儲存的檔案,都會執行此策略。預設只開啟對 RS-6-3-1024k 策略的支援,如要使用別的策略需要提前啟用。

1)需求:將/input 目錄設定為 RS-3-2-1024k 策略

2)具體步驟

(1)開啟對 RS-3-2-1024k 策略的支援

[chaos@hadoop102 hadoop-3.1.3]$ hdfs ec -enablePolicy -policy RS-3-2-1024k
Erasure coding policy RS-3-2-1024k is enabled

(2)在 HDFS 建立目錄,並設定 RS-3-2-1024k 策略

[chaos@hadoop102 hadoop-3.1.3]$ hdfs dfs -mkdir /input
[chaos@hadoop202 hadoop-3.1.3]$ hdfs ec -setPolicy -path /input -policy RS-3-2-1024k

(3)上傳檔案,並檢視檔案編碼後的儲存情況

[chaos@hadoop102 hadoop-3.1.3]$ hdfs dfs -put web.log /input

注:你所上傳的檔案需要大於 2M 才能看出效果。(低於 2M,只有一個資料單元和兩個校驗單元)

(4)檢視儲存路徑的資料單元和校驗單元,並作破壞實驗

2、異構儲存(冷熱資料分離)

異構儲存主要解決,不同的資料,儲存在不同型別的硬碟中,達到最佳效能的問題。

1)關於儲存型別

RAM_DISK:(記憶體映象檔案系統)

SSD:(SSD固態硬碟)

DISK:(普通磁碟,在HDFS中,如果沒有主動宣告資料目錄儲存型別預設都是DISK)

ARCHIVE:(沒有特指哪種儲存介質,主要的指的是計算能力比較弱而儲存密度比較高的儲存介質,用來解決資料量的容量擴增的問題,一般用於歸檔)

2)關於儲存策略

說明:從Lazy_Persist到Cold,分別代表了裝置的訪問速度從快到慢

策略ID 策略名稱 副本分佈 策略
15 Lazy_Persist RAM_DISK:1,DISK:n-1 一個副本儲存在記憶體RAM_DISK中,其餘副本儲存在磁碟中。
12 All_SSD SSD:n 所有副本都儲存在SSD中。
10 One_SSD SSD:1,DISK:n-1 一個副本儲存在SSD中,其餘副本儲存在磁碟中。
7 Hot(default) DISK:n Hot:所有副本儲存在磁碟中,這也是預設的儲存策略。
5 Warm DSIK:1,ARCHIVE:n-1 一個副本儲存在磁碟上,其餘副本儲存在歸檔儲存上。
2 Cold ARCHIVE:n 所有副本都儲存在歸檔儲存上。

3)異構儲存 Shell 操作

(1) 檢視當前有哪些儲存策略可以用

[chaos@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies listPolicies 

(2) 為指定路徑(資料儲存目錄)設定指定的儲存策略

hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx

(3) 獲取指定路徑(資料儲存目錄或檔案)的儲存策略

hdfs storagepolicies -getStoragePolicy -path xxx 

(4) 取消儲存策略;執行改命令之後該目錄或者檔案,以其上級的目錄為準,如果是根目錄,那麼就是 HOT

hdfs storagepolicies -unsetStoragePolicy -path xxx 

(5) 檢視檔案塊的分佈

bin/hdfs fsck xxx -files -blocks -locations 

(6) 檢視叢集節點

hadoop dfsadmin -report 

六、HDFS—故障排除

1、NameNode 故障處理

1)需求:

NameNode 程式掛了並且儲存的資料也丟失了,如何恢復 NameNode

2)故障模擬

(1)kill -9 NameNode 程式

[chaos@hadoop102 current]$ kill -9 19886 

(2)刪除 NameNode 儲存的資料(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)

[chaos@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-1.3/data/dfs/name/* 

3)問題解決

(1)拷貝 SecondaryNameNode 中資料到原 NameNode 儲存資料目錄

[chaos@hadoop102 dfs]$ scp -r chaos@hadoop104:/opt/module/hadoop-3.1.3/data/dfs/namesecondary/* ./name/ 

(2)重新啟動 NameNode

[chaos@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode 

(3)向叢集上傳一個檔案

2、叢集安全模式&磁碟修復

1)安全模式

檔案系統只接受讀資料請求,而不接受刪除、修改等變更請求

2)進入安全模式場景

NameNode 在載入映象檔案和編輯日誌期間處於安全模式;

NameNode 再接收 DataNode 註冊時,處於安全模式

3)退出安全模式條件

dfs.namenode.safemode.min.datanodes:最小可用 datanode 數量,預設 0

dfs.namenode.safemode.threshold-pct:副本數達到最小要求的 block 佔系統總 block 數的百分比,預設 0.999f。(只允許丟一個塊)

dfs.namenode.safemode.extension:穩定時間,預設值 30000 毫秒,即 30 秒

4)基本語法

叢集處於安全模式,不能執行重要操作(寫操作)。叢集啟動完成後,自動退出安全模式。

(1)bin/hdfs dfsadmin -safemode get (功能描述:檢視安全模式狀態)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:進入安全模式狀態)
(3)bin/hdfs dfsadmin -safemode leave(功能描述:離開安全模式狀態)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀態)

3、慢磁碟監控

“慢磁碟”指的時寫入資料非常慢的一類磁碟。其實慢性磁碟並不少見,當機器執行時間長了,上面跑的任務多了,磁碟的讀寫效能自然會退化,嚴重時就會出現寫入資料延時的問題。

如何發現慢磁碟?正常在 HDFS 上建立一個目錄,只需要不到 1s 的時間。如果你發現建立目錄超過 1 分鐘及以上,而且這個現象並不是每次都有。只是偶爾慢了一下,就很有可能存在慢磁碟。

可以採用如下方法找出是哪塊磁碟慢:

1)通過心跳未聯絡時間

一般出現慢磁碟現象,會影響到 DataNode 與 NameNode 之間的心跳。正常情況心跳時間間隔是 3s。超過 3s 說明有異常。

2)fio 命令,測試磁碟的讀寫效能

(1)順序讀測試

[chaos@hadoop102 ~]# sudo yum install -y fio
[chaos@hadoop102 ~]# sudo fio -
filename=/home/chaos/test.log -direct=1 -iodepth 1 -thread -
rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -
runtime=60 -group_reporting -name=test_r
Run status group 0 (all jobs):
 READ: bw=360MiB/s (378MB/s), 360MiB/s-360MiB/s (378MB/s-378MB/s),
io=20.0GiB (21.5GB), run=56885-56885msec

結果顯示,磁碟的總體順序讀速度為 360MiB/s。

(2)順序寫測試

[chaos@hadoop102 ~]# sudo fio -
filename=/home/chaos/test.log -direct=1 -iodepth 1 -thread -
rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -
runtime=60 -group_reporting -name=test_w
Run status group 0 (all jobs):
 WRITE: bw=341MiB/s (357MB/s), 341MiB/s-341MiB/s (357MB/s357MB/s), io=19.0GiB (21.4GB), run=60001-60001msec
 
結果顯示,磁碟的總體順序寫速度為 341MiB/s。

(3)隨機寫測試

[chaos@hadoop102 ~]# sudo fio -filename=/home/chaos/test.log -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_randw

Run status group 0 (all jobs):
 WRITE: bw=309MiB/s (324MB/s), 309MiB/s-309MiB/s (324MB/s-324MB/s),
io=18.1GiB (19.4GB), run=60001-60001msec

結果顯示,磁碟的總體隨機寫速度為 309MiB/s。

(4)混合隨機讀寫:

[chaos@hadoop102 ~]# sudo fio -filename=/home/chaos/test.log -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r_w -ioscheduler=noop

Run status group 0 (all jobs):
 READ: bw=220MiB/s (231MB/s), 220MiB/s-220MiB/s (231MB/s231MB/s), io=12.9GiB (13.9GB), run=60001-60001msec
WRITE: bw=94.6MiB/s (99.2MB/s), 94.6MiB/s-94.6MiB/s
(99.2MB/s-99.2MB/s), io=5674MiB (5950MB), run=60001-60001msec

結果顯示,磁碟的總體混合隨機讀寫,讀速度為 220MiB/s,寫速度 94.6MiB/s。

4、小檔案歸檔

1)HDFS 儲存小檔案弊端

每個檔案均按塊儲存,每個塊的後設資料儲存在 NameNode 的記憶體中,因此 HDFS 儲存小檔案會非常低效。因為大量的小檔案會耗盡 NameNode 中的大部分記憶體。但注意,儲存小 檔案所需要的磁碟容量和資料塊的大小無關。例如,一個 1MB 的檔案設定為 128MB 的塊 儲存,實際使用的是 1MB 的磁碟空間,而不是 128MB。

2)解決儲存小檔案辦法之一

HDFS 存檔檔案或 HAR 檔案,是一個更高效的檔案存檔工具,它將檔案存入 HDFS 塊, 在減少 NameNode 記憶體使用的同時,允許對檔案進行透明的訪問。具體說來,HDFS 存檔文 件對內還是一個一個獨立檔案,對 NameNode 而言卻是一個整體,減少了 NameNode 的記憶體。

3)案例實操

(1)需要啟動 YARN 程式

[chaos@hadoop102 hadoop-3.1.3]$ start-yarn.sh

(2)歸檔檔案
把/input 目錄裡面的所有檔案歸檔成一個叫 input.har 的歸檔檔案,並把歸檔後檔案儲存
到/output 路徑下。

[chaos@hadoop102 hadoop-3.1.3]$ hadoop archive -archiveName input.har -p /input /output

(3)檢視歸檔

[chaos@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /output/input.har
[chaos@hadoop102 hadoop-3.1.3]$ hadoop fs -ls har:///output/input.har

(4)解歸檔檔案

[chaos@hadoop102 hadoop-3.1.3]$ hadoop fs -cp har:///output/input.har/* /

相關文章