1. 程式人生 > 其它 >生產調優6 HDFS-故障排除

生產調優6 HDFS-故障排除

目錄

HDFS-故障排除

這裡採用三臺伺服器即可,我們恢復到Yarn開始儲存的伺服器快照狀態

NameNode故障處理

需求

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

模擬故障

1.kill -9 NameNode程序

[ranan@hadoop102 ~]$ jpsall
=============== hadoop102 ===============
2165 NameNode  #NameNode程序
2888 JobHistoryServer
2684 NodeManager
3021 Jps
2350 DataNode
=============== hadoop103 ===============
2177 DataNode
2408 ResourceManager
2569 NodeManager
2973 Jps
=============== hadoop104 ===============
2320 SecondaryNameNode
2177 DataNode
2633 Jps
2445 NodeManager

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

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

問題解決

1.假設不知道怎麼引起的故障,我們先檢視程序,發現NameNode沒有啟動

[ranan@hadoop102 name]$ jpsall
=============== hadoop102 ===============
2888 JobHistoryServer
2684 NodeManager
3340 Jps
2350 DataNode
=============== hadoop103 ===============
3264 Jps
2177 DataNode
2408 ResourceManager
2569 NodeManager
=============== hadoop104 ===============
2320 SecondaryNameNode
2177 DataNode
2913 Jps
2445 NodeManager

2.啟動NameNode,啟動失敗了

[ranan@hadoop102 name]$ hdfs --daemon start namenode
[ranan@hadoop102 name]$ jpsall
=============== hadoop102 ===============
2888 JobHistoryServer
2684 NodeManager
2350 DataNode
3503 Jps
=============== hadoop103 ===============
2177 DataNode
2408 ResourceManager
2569 NodeManager
3354 Jps
=============== hadoop104 ===============
2320 SecondaryNameNode
2177 DataNode
2986 Jps
2445 NodeManager

3.檢視日誌/opt/module/hadoop-3.1.3/logs,我們是NameNode掛掉,檢視NameNode相關日誌

[ranan@hadoop102 logs]$ tail -n 100 hadoop-ranan-namenode-hadoop102.log

懷疑是NameNode不完整了

4.拷貝 SecondaryNameNode 中資料到原 NameNode 儲存資料目錄

SecondaryNameNode在hadoop104節點上/opt/module/hadoop-3.1.3/data/dfs/namesecondary

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

5.重新啟動 NameNode

[ranan@hadoop102 name]$ hdfs --daemon start namenode
[ranan@hadoop102 name]$ jpsall
=============== hadoop102 ===============
2888 JobHistoryServer
3721 NameNode
2684 NodeManager
2350 DataNode
3807 Jps
=============== hadoop103 ===============
2177 DataNode
3495 Jps
2408 ResourceManager
2569 NodeManager
=============== hadoop104 ===============
2320 SecondaryNameNode
3216 Jps
2177 DataNode
2445 NodeManager

6.在叢集上刪除一個檔案,測試是否正常執行

等待30s之後在刪除,成功

總結
在生產環境中不會使用SecondaryNameNode,會使用HA(兩個NameNode)

叢集安全模式&磁碟修復(重要)

安全模式

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

進入安全模式場景

1.NameNode在載入映象檔案和編輯日誌期間(叢集的啟動過程中)處於安全模式
2.NameNode在接受DataNode註冊時,處於安全模式

退出安全模式條件

dfs.namenode.safemode.min.datanodes:最小可用 datanode 數量,預設 0表示叢集上至少有一個datanode,如果至少有2個,可以設定為1

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

dfs.namenode.safemode.extension:穩定時間,預設值 30000 毫秒,即 30 秒之後退出安全模式

基本語法

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

檢視安全模式狀態
hdfs dfsadmin -safemode get

進入安全模式狀態
hdfs dfsadmin -safemode enter

離開安全模式狀態
hdfs dfsadmin -safemode leave

等待安全模式狀態
hdfs dfsadmin -safemode wait

案例:磁碟修復

需求

兩個資料塊損壞,進入安全模式,如何處理?

具體操作

1.損壞2個數據塊

分 別 進 入 hadoop102 、 hadoop103 、 hadoop104 的 /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-352852630-192.168.10.102-1624540176574/current/finalized/subdir0/subdir0 目錄,統一刪除某 2 個塊資訊

# 以103為例子,102和104同樣的操作
[ranan@hadoop103 ~]$ cd /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-352852630-192.168.10.102-1624540176574/current/finalized/subdir0/subdir0

[ranan@hadoop104 subdir0]$rm -rf blk_1073741825 blk_1073741825_1001.meta  blk_1073741851 blk_1073741851_1027.meta

2.重新啟動叢集

此時叢集沒有什麼反應,因為NameNode不知道資料塊損害了
在啟動時DataNode主動向NameNode彙報,並週期性(預設6個小時)上報所有塊訊息(塊是否完好)。

所以我們需要重新啟動叢集,讓NameNode知道資料塊損壞了。

[ranan@hadoop102 subdir0]$ myhadoop.sh stop
[ranan@hadoop102 subdir0]$ myhadoop.sh start

觀察 http://hadoop102:9870/dfshealth.html#tab-overview

安全模式打開了,塊的數量沒有達到要求

3.離開安全模式

# 先檢視是否在安全模式
[ranan@hadoop102 ~]$ hdfs dfsadmin -safemode get
Safe mode is ON

# 離開安全模式
[ranan@hadoop102 ~]$ hdfs dfsadmin -safemode leave
Safe mode is OFF

重新整理頁面

雖然此時可以對叢集進行操作了,但是下次重新啟動叢集(或6個小時得知資料開缺失),又會進入安全模式

有兩種辦法撤離解決
1.把缺失的資料修復
2.將元資料刪除

案例:模擬等待安全模式

類似於銀行12.30對賬,此時不能存錢不能取錢。希望以對完賬,就可以存錢、取錢或其他操作。

# 檢視當前模式

[ranan@hadoop102 ~]$ hdfs dfsadmin -safemode get
Safe mode is OFF

# 進入安全模式

[ranan@hadoop102 ~]$ hdfs dfsadmin -safemode enter
Safe mode is ON

建立並執行下面指令碼
在/opt/module/hadoop-3.1.3 路徑上, 編輯一個指令碼 safemode.sh

[ranan@hadoop102 hadoop-3.1.3]$ vim safemode.sh
#!/bin/bash
hdfs dfsadmin -safemode wait  # 處於安全模式時,相當於阻塞狀態,當安全模式退出,這條命令執行完畢,直接執行下一條
hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /
[ranan@hadoop102 hadoop-3.1.3]$ chmod 777 safemode.sh
[ranan@hadoop102 hadoop-3.1.3]$ ./safemode.sh

在開啟一個視窗,退出安全模式

[ranan@hadoop102 ~]$ hdfs dfsadmin -safemode leave
Safe mode is OFF

慢磁碟監控

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

如何發現慢磁碟?

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

如何找出慢磁碟

通過心跳時間

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

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

順序讀測試

1.安裝fio測試工具

[ranan@hadoop102 hadoop-3.1.3]$ sudo yum install -y fio

2.執行測試

知道下一次讀的位置在哪裡,所以速度很快

[ranan@hadoop102 hadoop-3.1.3]$ sudo fio -filename=/home/ranan/test.log -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r

磁碟的總體順序讀速度為486MiB/s

順序寫測試

知道下一次寫的位置在哪裡,所以速度很快

[ranan@hadoop102 hadoop-3.1.3]$ sudo fio -filename=/home/ranan/test.log -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_w

磁碟的總體順序寫速度為 451MiB/s

隨機寫測試

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

磁碟的總體隨機寫速度為 408MiB/s

混合隨機讀寫測試

[ranan@hadoop102 hadoop-3.1.3]$sudo fio -filename=/home/atguigu/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

磁碟的總體混合隨機讀寫,讀速度為 296iB/s,寫速度 127MiB/s。

滿磁碟可以作為歸檔磁碟。

小檔案歸檔

每個檔案塊大概佔用NameNode的150byte,無關資料塊大小,因為NameNode相當於是目錄

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

HDFS存檔檔案或HAR檔案

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

案例實操

1.將合併到一起其實走的MR,所以需要開啟YARN

[ranan@hadoop102 hadoop-3.1.3]start-yarn.sh

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

input下面有三個檔案


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

這裡檢視的內容不是我們想要的

2.檢視歸檔

使用har協議檢視

# 這裡檢視的內容還是我們在網頁上看見的

[ranan@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /output/input.har
Found 4 items
-rw-r--r--   3 ranan supergroup          0 2021-12-15 09:51 /output/input.har/_SUCCESS
-rw-r--r--   3 ranan supergroup        279 2021-12-15 09:51 /output/input.har/_index
-rw-r--r--   3 ranan supergroup         23 2021-12-15 09:51 /output/input.har/_masterindex
-rw-r--r--   3 ranan supergroup       1656 2021-12-15 09:51 /output/input.har/part-0

# 使用har協議

[ranan@hadoop102 hadoop-3.1.3]$ hadoop fs -ls har:///output/input.har
2021-12-15 09:55:36,808 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
Found 3 items
-rw-r--r--   3 ranan supergroup       1366 2021-12-14 20:45 har:///output/input.har/README.txt
-rw-r--r--   3 ranan supergroup         47 2021-12-15 09:49 har:///output/input.har/b.txt
-rw-r--r--   3 ranan supergroup        243 2021-12-15 09:48 har:///output/input.har/nline.txt

3.解歸檔檔案

# 假設拷出b.txt
[ranan@hadoop102 hadoop-3.1.3]$  hadoop fs -cp har:///output/input.har/b.txt /

# 解歸檔檔案
[ranan@hadoop102 hadoop-3.1.3]$  hadoop fs -cp har:///output/input.har/* /