[大數據運維]第28講:Hadoop 平台常見故障匯總以及操作系統性能調優


第28講:Hadoop 平台常見故障匯總以及操作系統性能調優

高俊峰(南非螞蟻)

Hadoop 日常運維問題及其解決方法

1.如何下線一個 datanode 節點?

當一個 datanode 節點所在的服務器故障或者將要退役時,你需要在 Hadoop 中下線這個節點,下線一個 datanode 節點的過程如下。
 
(1)修改 hdfs-site.xml 文件
 
如下選項,找到 namenode 節點配置文件 /etc/hadoop/conf/hdfs-site.xml:
 
    <property>     
    <name>dfs.hosts.exclude</name>      
    <value>/etc/hadoop/conf/hosts-exclude</value>  
    </property>
 
(2)修改 hosts-exclude 文件
 
執行如下操作,在 hosts-exclude 中添加需要下線的 datanode 主機名:
 
    vi /etc/hadoop/conf/hosts-exclude  
    172.16.213.188
 
(3)刷新配置
 
在 namenode 上以 hadoop 用戶執行下面命令,刷新 hadoop 配置:
 
    [hadoop@namenodemaster ~]$hdfs dfsadmin -refreshNodes
 
(4)檢查是否完成下線
 
執行如下命令,檢查下線是否完成:
 
    [hadoop@namenodemaster ~]$hdfs dfsadmin -report
 
也可以通過 NameNode 的 50070 端口訪問 Web 界面,查看 HDFS 狀態,需要重點關注退役的節點數,以及復制的塊數和進度。

2.某個 datanode 節點磁盤壞掉怎么辦?

如果某個 datanode 節點的磁盤出現故障,那么該節點將不能進行寫入操作,並導致 datanode 進程退出,針對這個問題,你可以如下解決:
 
  • 首先,在故障節點上查看 /etc/hadoop/conf/hdfs-site.xml 文件中對應的 dfs.datanode.data.dir 參數設置,去掉故障磁盤對應的目錄掛載點;
  • 然后,在故障節點上查看 /etc/hadoop/conf/yarn-site.xml 文件中對應的 yarn.nodemanager.local-dirs 參數設置,去掉故障磁盤對應的目錄掛載點;
  • 最后,重啟該節點的 DataNode 服務和 NodeManager 服務即可。

3.Hadoop 進入安全模式怎么辦?

Hadoop 剛啟動時,由於各個服務的驗證和啟動還未完成,此時 Hadoop 會進入安全模式,這時文件系統的內容不允許修改,也不允許刪除,這種狀態會一直持續,直到安全模式結束為止。
 
而這個安全模式主要是為了系統啟動時,能夠對各個 DataNode 數據塊的有效性進行檢查,並根據策略對部分數據塊進行必要的復制或者刪除。
 
如果 Hadoop 的啟動和驗證都正常,那么只需等待一會兒,Hadoop 便將自動結束安全模式。
 
當然,執行如下命令,也可以手動結束安全模式:
 
    [hadoop@namenodemaster  conf]$ hdfs dfsadmin -safemode leave

4.NodeManager 出現 Java heap space 錯誤怎么辦?

這種錯誤,一般是 JVM 內存不夠導致的,所以你需要修改所有 DataNode 和 NodeManager 的 JVM 內存大小,至於設置具體多大的內存,需要根據服務器的實際環境而定。
 
如果設置的 JVM 值已經很大,但還是出現該問題,則需要查看 NodeManager 運行日志,具體是什么原因導致的,需要具體問題具體分析,當然,最直接的方法就是重啟此節點的 NodeManager 服務。

5.DataNode 節點出現 Too many fetch-failures 錯誤的原因是什么?

出現這個問題的原因主要是,DataNode 節點間的連通性不夠通暢,或者網絡環境不太穩定。
 
你可以從如下方面查找原因,便基本能判斷問題所在:
 
  • 檢查 DataNode 節點和 NameNode 節點之間的網絡延時;
  • 通過 Nslookup 命令測試 DNS 解析主機名情況;
  • 檢查 /etc/hosts 和對應的主機名信息;
  • 檢查 NameNode 到 DataNode 節點的 SSH 單向信任情況。

6.出現 No route to host 怎么辦?

這個問題一般會在 DataNode 連接不上 NameNode,從而導致 DataNode 無法啟動的情況下發生,問題發生時可在 DataNode 日志中看到如下類似信息:
 
    ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to ... failed on local exception: java.net.NoRouteToHostException: No route to host
 
這個問題,一般是本機防火牆、本機網絡,或系統的 selinux 導致的,所以你可以關閉本機防火牆或者 selinux,然后檢查本機與 NameNode 之間的連通性,從而你便能判斷出問題症結所在。

7.如何新增一個 DataNode 節點到 Hadoop 集群?

當集群資源不夠時,需要新增幾台機器加入集群,這是 Hadoop 運維最常見的處理方式之一。那么如何將新增的服務器加入 Hadoop 集群呢,主要有以下步驟。
 
(1)新節點部署 Hadoop 環境
 
新增節點在系統安裝完成后,要進行一系列的操作,比如系統基本優化設置、Hadoop 環境的部署和安裝、JDK 的安裝等,這些基礎工作都需要你事先完成。
 
(2)修改 hdfs-site.xml 文件
 
在 NameNode 查看 /etc/hadoop/conf/hdfs-site.xml 文件,找到如下內容:
 
    <property>
      <name>dfs.hosts</name>
      <value>/etc/hadoop/conf/hosts</value>
    </property>
 
(3)修改 hosts 文件
 
在 NameNode 修改 /etc/hadoop/conf/hosts 文件,添加新增的節點主機名,操作如下:
 
    vi /etc/hadoop/conf/hosts
    slave0191.iivey.cloud 
 
最后,將配置同步到所有 DataNode 節點的機器上。
 
(4)使配置生效
 
新增節點后,要讓 NameNode 識別新的節點,則需要在 NameNode 上刷新配置,執行如下操作:
 
    [hadoop@namenodemaster ~]$hdfs dfsadmin -refreshNodes  
 
(5)在新節點啟動 dn 服務
 
在 NameNode 完成配置后,還需在新增節點上啟動 DataNode 服務,執行如下操作:
 
    [hadoop@slave0191.iivey.cloud ~]$ hdfs --daemon start datanode
 
這樣,一個新的節點就增加到集群了,Hadoop 的這種機制,可以在不影響現有集群運行的狀態下,新增或者刪除任意節點,非常方便。

8.NameNode 服務器故障了怎么辦?

在 HDFS 集群中,NameNode 主機上存儲了所有元數據信息,一旦這些信息丟失,那么 HDFS 上面的所有數據都將無法使用。
 
所以 NameNode 服務器發生故障無法啟動時,有兩種方法可以解決:
 
  • NameNode 做了高可用服務的情況下,主 NameNode 故障后,NameNode 服務會自動切換到備用的 NameNode 上,這個過程是自動的,無須手工介入;
  •  Namenode 沒做高可用服務的情況下,可以借助 SecondaryNameNode 服務,在 SecondaryNameNode 主機中找到元數據信息,然后直接在此節點啟動 Namenode 服務即可;由於 SecondaryNameNode 實現的是 Namenode 冷備份,所以這種方式可能無法找回所有數據,依舊會有部分數據丟失。
 
由此可知,對 NameNode 進行容災備份至關重要,在生產環境下,我建議通過 standby NameNode 實現 NameNode 的高可用熱備份。

9.為什么集群節點被 Yarn 標記為不健康?

Yarn 集群在長期運行任務后,某些節點會突然被標記為不健康節點,並從 Yarn 集群中剔除出去,之后便不會再有任務提交至此節點。
 
那么什么情況下,節點會被標記不健康呢?
 
在 Yarn 配置中,有個參數 yarn.nodemanager.local-dirs,用來存儲 NodeManager 應用程序運行的中間結果;還有另一個參數 yarn.nodemanager.log-dirs,用來指定 NodeManager 的日志文件存放目錄列表。這兩個參數都可以配置多個目錄,並使用逗號將多個目錄分隔開。
 
Yarn 會定期進行磁盤狀態檢查,如果這兩個參數指定目錄的可用空間,低於 Yarn 指定的閾值,NodeManager 將不會在這些節點上啟動任何新容器。
 
本地目錄健康檢測主要涉及以下兩個參數:
 
  • yarn.nodemanager.disk-health-checker.min-healthy-disks
此參數默認值為 0.25,表示正常目錄在總目錄中的數目占比,低於 0.25 則判定此節點處於不正常狀態。比如,指定了十二個目錄(磁盤),那么它們當中,至少有 3 個目錄處於正常狀態, NodeManager 才會在該節點上啟動新容器。
 
  • yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage
此參數默認值為 90(也可以將此參數設置為 0 到 100 之間的任意數)。它表示 yarn.nodemanager.local-dirs 配置項下的路徑或者 yarn.nodemanager.log-dirs 配置項下的路徑的磁盤使用率達到了 90% 以上時,此台機器上的 nodemanager 將被標志為 unhealthy。
 
解決方法很簡單:清理對應目錄下的臨時數據,使磁盤占用率降至 90% 以下;修改 90 這一默認參數值,重設磁盤使用率。
 
我有個經驗可以與你分享: 最好別將 Yarn 的日志目錄或中間結果目錄,與 HDFS 的數據存儲目錄放至同一個磁盤,這樣做能減少很多不必要的麻煩。

10.datanode 節點磁盤存儲不均衡怎么解決?

在 HDFS 集群中,磁盤損壞是家常便飯,磁盤故障后,我們一般的策略是更換新的硬盤,新硬盤更換后,只有新數據會寫入這個硬盤,而之前的老數據不會自動將數據平衡過來。
 
如此下去,更換的硬盤越多,節點之間以及每個節點的各個磁盤之間的數據將越來越不平衡;此外,集群中添加新的數據節點,也會導致 HDFS 出現數據不平衡。
 
那么如何讓 HDFS 集群重新達到一個平衡的狀態呢?可以使用 Hadoop 提供的 Balancer 程序,執行命令如下:
 
    [hadoop@namenodemaster sbin]$ $HADOOP_HOME/bin/start-balancer.sh  -t  5%
 
或者:
 
    [hadoop@namenodemaster sbin]$ hdfs balancer -threshold 5
 
這個命令中 -t 參數后面跟的是,HDFS 達到平衡狀態的磁盤使用率偏差值,如果節點與節點之間磁盤使用率偏差小於 5%,那么我們就認為 HDFS 集群已達到了平衡狀態。

11.Yarn 集群中發現任務分配不均衡怎么辦?

有時候,你通過 Yarn 集群運行數據分析任務時,會發現這樣一個問題:各節點的負載會不均衡(也就是任務數目不同),有的節點有很多任務在執行忙碌,而有的節點沒有任務執行,那么如何平衡各節點運行的任務數目呢?
 
這種問題的發生與你采用的 Yarn 資源調度策略息息相關。
 
如果是上述情況,其原因應該是采用了默認的容量調度策略(Capacity Scheduler),容量調度會盡可能將任務分配到有資源的節點,而不考慮任務均衡因素。所以這種情況下,我建議將其設置為公平調度策略,此調度模式可以將任務均勻分配到集群的每個節點。
 
其實,從 Hadoop 集群利用率角度看,該問題發生的概率比較低。因為一般情況下,任務會持續提交到集群,集群會時刻處於忙碌狀態,不會出現節點一直空閑的情況,所以任務分配不均的情況也就難以發生。

12.HDFS 下有 missing blocks,應該如何解決?

HDFS 集群出現 missing blocks 錯誤,是一個經常發生的問題,並且一旦發生往往意味着有元數據丟失或者損壞,想要將其恢復,難度很大甚至無法恢復。
 
所以我們的解決方法往往不是恢復數據,而是刪除相關文件,具體如何解決如下所示,執行下列命令:
 
    [hadoop@namenodemaster sbin]$ hdfs fsck /blocks-path/
 
此命令會檢查 HDFS 下的所有塊狀態,並向你列出有哪些文件發生了塊丟失或損壞。
然后執行如下命令,刪除這些文件即可:
 
    [hadoop@namenodemaster sbin]$ hdfs fsck -fs hdfs://bigdata/logs/mv.log  -delete
 
上面刪除了 HDFS 上 mv.log 這個文件,因為此文件元數據丟失,無法恢復,所以只能刪除。

Hadoop 調優之操作系統調優

1.調整操作系統打開文件描述符的上限

Hadoop 的任務分析經常需要讀寫大量文件,因此需要增大打開文件描述符的上限,可通過 ulimit -n 查看目前系統的打開文件描述符的上限值。CentOS 7 系統默認值是 1024,這個值太小了,建議修改為 655360 或者更大。
 
通過命令“ulimit -a”可以看到所有系統資源參數,這里面需要重點設置的是“open files”和“max user processes”,其他可以酌情設置。
 
要永久設置資源參數,主要通過下列文件實現:
 
  • /etc/security/limits.conf
  • /etc/security/limits.d/90-nproc.conf(centos6.x)
  • /etc/security/limits.d/20-nproc.conf(centos7.x)
 
將下面內容添加到 /etc/security/limits.conf 中,然后退出 shell,重新登錄即可生效。
 
    *        soft    nproc           204800
    *        hard    nproc           204800
    *        soft    nofile          655360
    *        hard    nofile          655360
    *        soft    memlock         unlimited
    *        hard    memlock         unlimited
 
需要注意的是: CentOS 6.x 版本中,有個 90-nproc.conf 文件;CentOS 7.x 版本中,有個 20-nproc.conf 文件,由於里面已經默認配置了最大用戶進程數,對這兩個的設置也就沒必要,所以直接刪除這兩個文件即可。

2.修改 net.core.somaxconn 參數

此內核參數對應的具體文件路徑為 /proc/sys/net/core/somaxconn,它用來設置 socket 監聽(listen)的 backlog 上限。
 
什么是 backlog 呢?就是 Socket 的監聽隊列,當一個請求(Request)未被處理或建立時,便會進入 backlog。而 socket server 可以一次性處理 backlog 中的所有請求,處理后的請求不再位於監聽隊列中。
 
如果 server 處理請求較慢,以至於監聽隊列被填滿時,那么新來的請求會被拒絕,所以必須增大這個值,此參數默認值為 128。作為網絡參數的基礎優化,建議修改為如下值:
 
    echo 4096 >/proc/sys/net/core/somaxconn

3.調整操作系統使用 swap 的比例

swap 原本是作為物理內存的擴展,但如今內存一般都很充足,swap 也就很少會應用;再加上數據交換至 swap,導致操作超時,從而影響 Hadoop 的讀寫以及數據分析性能。所以以上兩點,導致如今使用 swap 的場景越來越少。
 
我們可以通過系統內核參數 /proc/sys/vm/swappiness 來調整使用 swap 的比例。swappiness=0 的時候表示最大限度使用物理內存,然后才是 swap 空間;swappiness=100 的時候表示積極地使用 swap 分區,並且把內存上的數據及時地搬運到 swap 空間里。
 
Linux 基本默認設置為 60,表示你的物理內存使用到 100-60=40% 的時候,swap 交換分區便開始應用起來。對於內存需求較高的服務器(比如 Hadoop、Redis、HBase 機器),Linux 值需要設置得足夠小(0~10 之間),這樣才能最大限度使用物理內存。

4.禁用 THP(Transparent Huge Pages)功能

THP 的本意是為提升內存的性能,但是在 Hadoop 環境中發現,此功能會將 CPU 占用率增大,進而影響 Hadoop 性能,因此建議將其關閉。
 
首先檢查 THP 的啟用狀態:
 
    [root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
    [always] madvise never
    [root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
    [always] madvise never
 
這里顯示 always,表示 THP 目前是啟用狀態。要禁用 THP,可打開 /etc/rc.d/rc.local 文件,然后添加如下內容:
 
    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    fi
 
然后保存退出。
 
最后,賦予 rc.local 文件執行權限,執行如下命令:
 
    [root@localhost ~]# chmod +x /etc/rc.d/rc.local  
    [root@localhost ~]# source /etc/rc.local
 
此時,THP 功能便已經被禁用了。

總結

本課時,我主要介紹了 Hadoop 大數據運維中,常見的運維故障以及解決問題的方法和思路;以及在 Hadoop 平台下,如何對 Linux 操作系統進行深度配置和優化。由於 Hadoop 的高效穩定運行,離不開 Linux 系統的性能優化,所以希望你課下能多多練習,提升自己的技能水平。
 


免責聲明!

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



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