HDFS數據平衡:節點間平衡與節點內平衡


一、節點間平衡

1、Apache 

開啟數據均衡命令:

bin/start-balancer.sh –threshold 10

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

停止數據均衡命令:

bin/stop-balancer.sh

2、CDH

CDH在HDFS中提供了Balancer角色,使我們可以免於用命令行執行start-balancer.sh來手動配置。

Cloudera Manager里與Balancer有關的配置項有以下這些。

Balancing Threshold:Balancer平衡的閾值。平衡過程結束后,所有節點的磁盤占用率與集群的平均占用率之差必須小於threshold(按百分比計)。默認值是10。
Rebalancing Policy:計算平衡度的策略,有DataNode和BlockPool兩種。前者是按節點級別來算,后者是按塊池級別來算。后者只有對HDFS Federation才有效,所以我們選前者。
Included/Excluded Hosts:分別用來指定參與平衡的節點和被排除的節點。這樣可以先人為判斷數據分布情況,然后只讓我們認為需要平衡的節點來操作。
dfs.balancer.moverThreads/dispatcherThreads:分別表示移動數據的線程池大小,和調度數據移動方案的線程池大小,默認值1000和200。
dfs.datanode.balance.max.concurrent.moves:表示能夠同時移動的塊(英文說法叫in-flight)數量,默認值50。
dfs.balancer.max-size-to-move:表示在Balancer的一次迭代(下面會提到)中,一個DataNode的最大數據交換量,默認值10G。
另外,還有一個出現在DataNode參數但又與平衡相關的:dfs.datanode.balance.bandwidthPerSec,即每個節點可以用來做平衡的最大帶寬,默認1MB/s。這個值在多數情況下是偏小的,可以適當增大,如10甚至20。千萬注意不能擠占太多帶寬,以保證正常業務的運行。

我們使用CDH5.12.1,如下

二、節點內(磁盤間)平衡

1、hadoop2.x

1.1 背景

當HDFS的datanode節點掛載多個磁盤時,往往會出現兩種數據不均衡的情況:

(1) 不同datanode節點間數據不均衡;

(2) 掛載數據盤的磁盤間數據不均衡。

特別是這種情況:當datanode原來是掛載單數據磁盤,當磁盤占用率很高之后,再掛載新的數據盤。由於hadoop 2.x 版本並不支持 HDFS 的磁盤間數據均衡,因此,會造成老數據磁盤占用率很高,新掛載的數據盤幾乎很空。在這種情況下,掛載新的數據盤就失去了擴容HDFS數據盤的意義。

1.2 解決方法

雖然hadoop官方並沒有在hadoop 2.X 提供標准的磁盤間數據均衡方法,但是我們也可以通過一些其它途徑來達到磁盤間數據均衡。

總體方法:通過升降HDFS數據的副本數量,“一減一增”過程中,“一減”過程中會將老數據盤的數據塊刪除一個副本,“一增”過程中會將增加的一個副本數據均衡寫入到老數據盤和新數據盤。通過“一減一增”,使得一部分老數據盤的數據轉移到新的數據盤。

升降數據副本:比如默認HDFS的副本數是3份。
(1)使用命令將HDFS的副本數降為2,此時HDFS會刪除老數據盤上面的1份副本; (2)再使用命令將HDFS的副本數升為3,此時HDFS會將新增的1份副本均勻分布在所有的磁盤(新老數據盤機會 均等地分布這一份副本數據); 理論上使用這種方法將整個HDFS數據執行一遍。(假設原來是一塊數據盤,現在每個datanode新增一塊數據盤)老的數據盤會減少 六分之一,減少的六分之一數據將會增加到新的數據盤。具體的計算過程如下: 假設原來磁盤的數據量為n GB,那么經過3副本降為2副本之后,老磁盤的數據量為: n * 2/3 再經過副本2增加為3之后,老磁盤的數據量為: n * 2/3 + n * 1/3 *1/2 = n * 5/6 因此,有 1/6 的數據從老磁盤遷移到新的磁盤。

升降副本是一個迫不得已的辦法。如果在做升降副本過程中,datanode有節點掛掉,就會增加丟失數據塊的幾率。

因此,在做“一升一降”之前、執行的過程中,都需要檢查HDFS是否健康。同時,當對大批量數據做均衡時,容易出現錯誤,需要對HDFS的子目錄逐個做均衡。

1.3 具體操作辦法

step1:檢查HDFS健康程度:

su hdfs;
hadoop fsck /

step2:檢查各個目錄的大小:

[hdfs@10]$ hadoop fs -du -h /
5.7 G       /app-logs 
677.9 G     /apps 
2.7 G       /backup 
0           /data
0           /group
365.3 M     /hdp
0           /mapred
1.1 G       /mr-history
1.1 T       /project
0           /system
33.1 G      /tmp 
197.0 G     /user

step3:對各個子目錄(或者是子目錄的子目錄)進行副本數變更操作:

假如對HDFS的 /app-logs 子目錄做變更,執行:

su hdfs;
hadoop fsck /app-logs;   ## 每次做變更之前很有必要檢查集群HDFS健康程度
hadoop fs -setrep -R 2 /app-logs;  ## 將副本數量降為2
hadoop fsck /app-logs;   ## 很有必要每次做完變更副本之后檢查集群HDFS健康程度
cd /data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/sbin/;
./start-balancer.sh -threshold 5;  ## 變更副本之后,做一次HDFS集群間的數據均衡
hadoop fs -setrep -R 3 /app-logs;  ## 將副本數量增為3,還原原來的副本數量
hadoop fsck /app-logs;   ## 很有必要每次做完變更副本之后檢查集群HDFS健康程度
cd /data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/sbin/;
./start-balancer.sh -threshold 5;  ## 變更副本之后,做一次HDFS集群間的數據均衡

接下來再對HDFS的其它子目錄實施同樣的操作,直到把HDFS的所有目錄都操作一遍。

1.4 進一步

    對HDFS做完一次 “一降一增” 操作之后,理論上老數據盤會減少1/6的數據,新盤增加這部分數據。 如果覺得效果還不夠理想,可以再進行一次上面的降升操作,老數據盤會再次將一些數據遷移到新的數據盤,只是遷移量沒有前一次那么大了(讀者可以自行計算理論上會遷移多少數據量)。

2、hadoop3.x

如果想要解決節點內多塊磁盤數據不均衡的現象,就要借助DiskBalancer。在CDH 5.8.2+版本中,可以通過在CM中配置進行開啟。如果使用的Hadoop版本是3.0+,就直接在hdfs-site.xml中加入相關項。
在HDFS配置項中找到“DataNode Advanced Configuration Snippet (Safety Valve) for hdfs-site.xml”,中文為“hdfs-site.xml的HDFS服務⾼級配置代碼段(安全閥)”,加入:

<property>
<name>dfs.disk.balancer.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.disk.balancer.max.disk.throughputInMBperSec</name>
<value>50</value>
</property>
<property>
<name>dfs.disk.balancer.plan.threshold.percent</name>
<value>2</value>
</property>
<property>
<name>dfs.disk.balancer.block.tolerance.percent</name>
<value>5</value>
</property>
dfs.disk.balancer.max.disk.throughputInMBperSec:指定磁盤間平衡時占用的最大磁盤帶寬,默認值10MB/s。在不影響讀寫性能的情況下可以適當調大。
dfs.disk.balancer.plan.threshold.percent:各盤之間數據平衡的閾值。DiskBalancer中采用一種叫volume data density(卷數據密度)的度量來確定占用率的偏差值,該值越大,表明磁盤間的數據越不均衡。平衡過程結束后,每個盤的卷數據密度與平均密度之差必須小於threshold(按百分比計)。默認值是10,我們設成了5。
dfs.disk.balancer.block.tolerance.percent:在每次移動塊的過程中,移動塊的數量與理想平衡狀態之間的偏差容忍值(按百分比計)。一般也設成5。

DiskBalancer的運行流程與Balancer類似,不過對象由節點變成了磁盤。它分為Discover、Plan與Execute三個階段,分別是計算磁盤不平衡度、生成平衡計划與執行平衡計划。關於它的設計細節,可以參考JIRA中的HDFS-1312:https://issues.apache.org/jira/browse/HDFS-1312。
配置完成后,重啟DataNode,然后SSH到該節點上,手動執行即可:

生成平衡計划(hadoop1為主機名)
hdfs diskbalancer -plan hadoop1
執行平衡計划
hdfs diskbalancer -execute /system/diskbalancer/hadoop1.plan.json
查看執行狀態
hdfs diskbalancer -query hadoop1

1.3 hadoop 2.x單副本

1.問題梳理:
CDH集群中,數據文件位置默認在 /dfs/dn 中,這個目錄所屬的盤符是 /,但是 ‘/’只有100G大小,還有其他各種文件的日志什么的,空間很緊張。

今天執行hive問題,發現集群一直報警。查閱了資料,需要將CDH集群 HDFS數據存儲 更換目錄。

通過命令查看各個盤符 占用情況

df -h

2. 處理


1. 定位思路
先將集群停止,然后准備好新的存儲目錄,再將數據復制到新的目錄中,重啟集群。

2.處理步驟
假設HDFS的默認安裝目錄為“/dfs/dn”,需要移動目錄到“/home/dfs_new/dn”中。

1 .登錄cdh manager,停止hdfs集群

2 .在home目錄下創建 dfs_new/dn 目錄

cd /home
mkdir -p /home/dfs_new/dn

3.更改目錄所屬的用戶和組

chown -R hdfs /home/dfs_new/dn
chgrp -R hadoop /home/dfs_new/dn

使用cdh 搭建hdfs集群的時候,默認用戶為hdfs ,默認用戶組為hadoop

將數據復制到目標目錄:當前DataNode的目錄為根目錄下,和系統目錄在同一目錄下,隨着DataNode的增長導致系統運行空間不足

cp -af /dfs/dn/* /home/dfs_new/dn

4 . 在cdh Manager管理界面,更改DataNode的配置目錄

打開HDFS服務datanode配置頁面,將所有datanode的數據目錄配置項“dfs.datanode.data.dir”

由“/dfs/dn”修改為“/home/dfs_new/dn”。


5 . 啟動成功后,執行fsck檢查是否復制正確。 命令樣例:

hdfs fsck /

6 . fsck顯示有文件丟失,則檢查2是否正確,並執行相關的修復。

7 . fsck顯示文件無文件丟失,HDFS沒有處於安全模式,則表示數據復制成功。

8 . 刪除原有數據目錄“/dfs/dn”中的文件。

9 . 啟動集群中剩余的服務。

10 . 再平衡

 

參考文章:

https://blog.csdn.net/tianlianchao1982/article/details/107124286

https://cloud.tencent.com/developer/article/1025424

https://blog.csdn.net/qq_35356840/article/details/98947580


免責聲明!

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



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