分布式文件系统—HDFS—核心设计
原文作者:jiangw-Tony
原文地址:HDFS基礎使用
1、HDFS心跳機制(heartbeat)
Namenode 感知到 Datanode 掉線死亡的時長計算:
HDFS 默認的超時時間為 10 分鐘+30 秒。這里暫且定義超時時間為 timeout,計算公式為:timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval
而默認的 heartbeat.recheck.interval 大小為 5 分鐘,dfs.heartbeat.interval 默認的大小為 3 秒。需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 的單位為毫秒,dfs.heartbeat.interval 的單位為秒。所以,舉個例子,如果heartbeat.recheck.interval 設置為 5000(毫秒),dfs.heartbeat.interval設置為 3(秒,默認),則總的超時時間為 40 秒。
<property><name>heartbeat.recheck.interval</name><value>5000</value> </property> <property><name>dfs.heartbeat.interval</name><value>3</value> </property>2、HDFS安全模式
問題引出:集群啟動后,可以查看目錄,但是上傳文件時報錯,打開web頁面可看到namenode正處于 safemode 狀態,怎么處理?
解釋:safemode 是 namenode 的一種狀態(active/standby/safemode 安全模式)
namenode 進入安全模式的原理:
1. namenode 發現集群中的 block 丟失率達到一定比例時(0.1%),namenode 就會進入安全模式,在安全模式下,客戶端不能對任何數據進行操作,只能查看元數據信息(比如 ls/mkdir),這個丟失率是可以手動配置的,默認是 dfs.safemode.threshold.pct=0.999f
2.如何退出安全模式?
- 找到問題所在,進行修復(比如修復宕機的 datanode)
- 或者可以手動強行退出安全模式(但是并沒有真正解決問題)
在 hdfs 集群正常冷啟動時,namenode 也會在 safemode 狀態下維持相當長的一段時間,此時你不需要去理會,等待它自動退出安全模式即可。
正常啟動的時候進入安全的原理:
namenode 的內存元數據中,包含文件路徑、副本數、blockid,及每一個 block 所在datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那么,當 namenode冷啟動時,此時內存中的元數據只能從 fsimage 中加載而來,從而就沒有 block 所在的datanode 信息——>就會導致 namenode 認為所有的 block 都已經丟失——>進入安全模式——>datanode 啟動后,會定期向 namenode 匯報自身所持有的 blockid 信息,——>隨著datanode 陸續啟動,從而陸續匯報 block 信息,namenode 就會將內存元數據中的 block 所在 datanode 信息補全更新——>找到了所有 block 的位置,從而自動退出安全模式。
安全模式常用操作命令:
# 強制 NameNode 退出安全模式 hdfs dfsadmin -safemode leave # 進入安全模式 hdfs dfsadmin -safemode enter # 查看安全模式狀態 hdfs dfsadmin -safemode get # 等待,一直到安全模式結束 hdfs dfsadmin -safemode wait如果你使用的版本是 2.X 之前的版本,那么這個 hdfs 命令可以替換成 hadoop,它們都在 bin目錄下。
3、HDFS副本存放策略
1.作用:數據分塊存儲和副本的存放,是保證可靠性和高性能的關鍵。
2.方法:將每個文件的數據進行分塊存儲,每一個數據塊又保存有多個副本,這些數據塊副本分布在不同的機器節點上。
3.存放說明
在多數情況下,HDFS 默認的副本系數是 3。Hadoop 默認對 3 個副本的存放策略如下圖,其中 Block1,Block2,Block3 分別表示 Block的三個副本:
- 第一個 block 副本放在和 client 所在的 node 里(如果 client 不在集群范圍內,則這第一個 node是隨機選取的,系統會嘗試不選擇哪些太滿或者太忙的 node)。
- 第二個副本放置在與第一個節點不同的機架中的 node 中(近乎隨機選擇,系統會嘗試不選擇哪些太滿或者太忙的 node)。
- 第三個副本和第二個在同一個機架,隨機放在不同的 node 中。
4.修改副本數
第一種方式:修改集群文件 hdfs-site.xml
<property><name>dfs.replication</name><value>1</value> </property>第二種方式:命令設置 bin/hadoop fs -setrep -R 1 /
4、負載均衡
機器與機器之間磁盤利用率不平衡是 HDFS 集群非常容易出現的情況,尤其是在 DataNode 節點出現故障或在現有的集群上增添新的 DataNode 的時候。分析數據塊分布和重新均衡 DataNode 上的數據分布的工具:
sbin/start-balancer.shsbin/start-balancer.sh -threshold 5自動進行均衡非常慢,一天能移動的數據量在 10G-10T 的級別,很難滿足超大集群的需求。原因:HDFS 集群默認不允許 balance 操作占用很大的網絡帶寬,這個帶寬是可以調整的
hdfs dfsadmin -setBalanacerBandwidth newbandwidthhdfs dfsadmin -setBalanacerBandwidth 10485760該數值的單位是字節,上面的配置是 10M/s,默認是 1M/s。另外,也可以在 hdfs-site.xml 配置文件中進行設置:
<property><name>dfs.balance.bandwidthPerSec</name><value>10485760</value><description> Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second. </description> </property> # 機器容量最高的那個值 和 最低的那個值得差距 不能超過 10%sbin/start-balancer.sh -t 10%?? ??
總結
以上是生活随笔為你收集整理的分布式文件系统—HDFS—核心设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式文件系统—HDFS—Java AP
- 下一篇: java信息管理系统总结_java实现科