1. 程式人生 > >Hadoop的磁碟大小不一導致節點掛掉

Hadoop的磁碟大小不一導致節點掛掉

問題描述

DataNode掛載的磁碟或者DataNode節點掛載多個磁碟,如果存在一些磁碟大小不一樣,資料在落盤時就可能會出現磁碟使用率不均勻的情況,容量較小的盤容易被寫滿,而容量大的盤還剩很多空間。磁碟寫滿後,影響Hadoop叢集的正常工作。

建好集群后需要將歷史記錄匯入到hbase中,而叢集中有三臺主機外接了磁碟陣列,主機磁碟陣列大小四十多G,磁碟陣列大概1.6個T。執行將資料寫入hbase的程式,第二天發現叢集掛掉了兩個節點。用df檢視各個磁碟使用情況,發現主機系統盤使用率100%!!!外接磁碟陣列使用率才3%。由於主機系統盤幾乎沒有剩餘磁碟空間,導致作業系統也不能正常使用:tab鍵補全命令不能使用,vim開啟檔案報錯等等。

解決方案

於是先解決燃眉之急,網上提供的解決辦法有三種:

  1. 資料清理:此方法屬於緊急措施:清理掉hdfs中不用的資料 
  2. 資料壓縮:手動壓縮部分資料,對於HBase可使用GZ壓縮方式,能快速有效的降低磁碟使用率 
  3. 資料移盤:手動進行資料的移動,將部分資料由寫滿的盤移動到其它盤

我選擇了第三種解決辦法,主要有三步操作:

  1. 關閉DataNode節點 
  2. 使用mv命令移動資料,要絕對保證移動後的資料相對目錄與移動前一致,如移動前usr/local/hadoop/tmp/dfs/data/current/BP-22769690-172.16.0.100-1541402558553/current/finalized/subdir0/subdir0,移動後為home/dfs/data/current/BP-22769690-172.16.0.100-1541402558553/current/finalized/subdir0/subdir0(注意:路徑格式應該保持嚴格一致;而且subdir0目錄下一共有32個subdir檔案,從subdir0到subdir31,我選擇是將其都移出去)
  3. 重啟DataNode;sbin/hadoop-daemon.sh start datanode;sbin/yarn-daemon.sh start nodemanager

可以參考 https://wiki.apache.org/hadoop/FAQ#On_an_individual_data_node.2C_how_do_you_balance_the_blocks_on_the_disk.3F 

總結

是什麼原因造成了資料落盤時的不均勻情況?本主要文調研了Hadoop的資料兩種寫入磁碟的策略:迴圈選取策略和可用空間策略。

迴圈選取策略

迴圈選取的策略很簡單,迴圈掃描整個Volumes,如果availableVolumeSize大於blockSize ,即返回該volume。按照迴圈的策略,資料會均勻的落在不同大小的盤上,大磁碟和小磁碟儲存的塊是一樣的,導致小的磁碟最先被寫滿。所以就導致了本次節點掛掉。

可用空間策略

通過計算不同磁碟最大剩餘空間與最小剩餘空間的差值,然後與閾值dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold進行對比,預設為10G,如果小於該值,將使用迴圈寫入策略,如果不小於該值,則使用最大可用空間策略。這樣磁碟的使用率就會相對均勻。

檢視是否有損壞節點

hdfs fsck /

參考:https://codeday.me/bug/20171111/94215.html

改進:修改掛載多個磁碟主機的hadoop的配置檔案hdfs-site.xml

property>

            <name>dfs.datanode.fsdataset.volume.choosing.policy</name>
            <value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
             <description>
                  datanode資料副本存放的磁碟選擇策略,有2種方式一種是輪詢方式(org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy,為預設方式),
                  另一種為選擇可用空間足夠多的磁碟儲存方式,這個為了防止各個節點上的各個磁碟的儲存均勻採用這個方式。
            </description>
 </property>
<property>
            <name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold</name>
           <value>10737418240</value>
            <description>
                   當在上面datanode資料副本存放的磁碟選擇可用空間足夠多的磁碟儲存方式開啟時,此選項才生效。這個引數主要功能是:
                   首先計算出兩個值,算出一個節點上所有磁碟中具有最大可用空間,另外一個值是所有磁碟中最小可用空間,如果這
                   兩個值相差小於該配置項指定的閥值時,則就用輪詢方式的磁碟選擇策略選擇磁碟儲存資料副本,如果比這個閥值大的話則
                   還是選擇可用空間足夠多的磁碟儲存方式。此項預設值為10737418240即10G
                  </description>
 </property>
<property>
                  <name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction</name>
                  <value>0.75f</value>
                  <description>
                   預設值是0.75f,一般使用預設值就行。具體解析:有多少比例的資料副本應該儲存到剩餘空間足夠多的磁碟上。
                   該配置項取值範圍是0.0-1.0,一般取0.5-1.0,如果配置太小,會導致剩餘空間足夠的磁碟實際上沒分配足夠的資料副本,
                   而剩餘空間不足的磁碟取需要儲存更多的資料副本,導致磁碟資料儲存不均衡。
                  </description>
 </property>

<property>
                  <name>dfs.datanode.dfs.reserved</name>
                  <value>10737418240</value>
                  <description>
                   Reserved space in bytes per volume. Always leave this much space free for non dfs use.
                  </description>
 </property>

參考資料:

https://www.waitig.com/hadoop%E7%9A%84%E7%A3%81%E7%9B%98%E5%86%99%E5%85%A5%E7%AD%96%E7%95%A5%E5%BC%95%E5%8F%91%E7%9A%84%E9%97%AE%E9%A2%98.html

https://www.cnblogs.com/Richardzhu/p/5807917.html

https://wiki.apache.org/hadoop/FAQ#On_an_individual_data_node.2C_how_do_you_balance_the_blocks_on_the_disk.3F

https://blog.csdn.net/Androidlushangderen/article/details/51776103