本篇是介紹 hdfs-site.xml 的相關設定及說明
- NameNode
- dfs.name.dir
預設值 : ${hadoop.tmp.dir}/dfs/name
說明 : 指定本機上存取 fsimage 及 editlog 的目錄,這個目錄非常的重要,如果損毀就無法存取 HDFS 的資料了,所以不建議放在 ${hadoop.tmp.dir} 目錄下。更好的做法是用 “," 指定多個目錄,Hadoop 會複製 fsimage 的資料到所有的目錄下,如果其中一個目錄損毀 Hadoop 會自動使用正常的目錄並把對的資料再複製到損毀的目錄下。
指定多個目錄後在 HDFS portal 會看到多個目錄,正常狀況會是 Active,當損毀時會變成 Inactive
- dfs.namenode.logging.level
預設值 : info
說明 : 這個值是指定 namenode 的 logging level。其他的值有- dir : 看 namenode server 的變化
- block : 看 blocks 新增刪除或 replication 的變化
- all : 顯示全部的 log
除非是為了 debug,不然不建議用其他的等級,會造成 Hadoop 的 log 檔案太大。
- dfs.http.address
預設值 : 0.0.0.0:50070
說明 : Web UI 用的 port。除非是為了 security 的考量才會需要改 binding 的 IP/Port,不然不需要改這個值。 - dfs.https.enable
預設值 : false
說明 : namenode 預設並沒有啟動 https,在設定 https 的 IP/Port 之前要先確定這個值設為 true。 - dfs.https.address
預設值 : 0.0.0.0:50470
說明 : Web UI 用的 port,用 https protocol。除非是為了 security 的考量才會需要改 binding 的 IP/Port,不然不需要改這個值。 - dfs.replication
預設值 : 3
說明 : 預設 blocks 的備份數量。如果不需要太多的備份或 cluster 比較小,可以改為 2。Client 端也可以根據使用狀況自行更改這個值。只是如果所設的值小於 dfs.replication,在執行 hadoop fsck 指令時會看到這個 block 被標示為 Under-Replicated Blocks。至於備份的機制可以參考 Hadoop 參數設定 – core-site.xml 裡的 topology.script.file.name 說明。 - dfs.replication.min
預設值 : 1
說明 : 不需要特別改這個值。因為並不是所有在 HDFS 上的資料都需要有 3 份備份,這可以由 client 來決定。如果對資料備份非常敏感可以把這個值設為跟 dfs.replication 一樣。 - dfs.replication.max
預設值 : 512
說明 : 因為 client 可以自行決定每個 block 要有幾份備份,為了怕誤操作導致備份過多而影響整個 cluster 的使用量,建議給一個小一點的值,例如 10。 - dfs.block.size
預設值 : 67108864(byte)
說明 : 預設每個 block 是 64MB。如果確定存取的檔案都很大可以改為 134217728(128MB)。Client 也可自行決定要使用的 block size 而不需要更改整個 cluster 的設定。
- dfs.safemode.threshold.pct
預設值 : 0.999f
說明 : Hadoop 在啟動時預設會進入 safe mode,也就是唯讀模式,這時是不能寫入資料的。只有當 99.9% 的 blocks 達到最小的 dfs.replication.min 數量(預設是 1)才會離開 safe mode。在 dfs.replication.min 設的比較大或 data nodes 數量較多時會等比較久。
下面討論兩個極端的狀況- 設為大於 1 : 表示永遠不會離開 safe mode,這在當 Hadoop cluster 需要做 migration 時很好用,即可繼續提供讀取服務,又可防止使用者寫入資料導至 migration 不完全。
- 設為 0 : 表示不會啟動 safe mode。在 local 測試時會非常的方便,不然常常需要等一段時間或直接執行
才能離開 safe mode。
- dfs.hosts
預設值 : N/A
說明 : 預設不指定的狀況下,只要 datanodes 在 hdfs-site.xml 指定 namenode,在 mapred-site.xml 指定 jobtracker 的位址就可以加入這個 cluster。但是為了安全的考量,系統管理者可能要決定只有特定的 nodes 可以加入。此值是指定一個檔案位置,名字可自取,例如 : /etc/hadoop/conf/dfs-hosts,並列出所有可以連結 namenode 的機器清單。不在清單上的機器是沒有權限的。在 mapred-site.xml 裡也有個類似的值 mapred.hosts 來指定可以連 jobtracker 的機器清單。 - dfs.hosts.exclude
預設值 : N/A
說明 : 當需要汰換或移除多台機器時會用到。理論上一台機器無預期的當機,Hadoop 會偵測並把該機器上的 blocks 搬到其他的 datanodes 上,並不需要系統管理員做額外的動作。但是停掉多台機器的情況下是有風險的,假設備份個數為 3 並停掉三台機器,則有一定的機率某些 blocks 正好只在這三台機器上,移掉之後資料也救不回來了。正確的做法是先告訴 namenode 這些機器將被移除,讓 namenode 把上面的資料全部備份到其他的 datanodes 上,再進行停機。跟 dfs.hosts 一樣,指定一個檔案位置,名字可自取,例如 : /etc/hadoop/conf/dfs-exclude-hosts,並列出所有需汰換的機器清單。設定後要執行以下的指令通知 namenode 做搬資料的動作。
進度可以在 web UI 上看到,當該 datanodes 的狀態顯示為 “Decommissioned" 表示可以安全的移除機器了。 - dfs.support.append
預設值 : false
說明 : 指定是否可在 HDFS 原有檔案內容之後加入新資料。看 hfds-default.xml 裡對這個參數的說明是有 bug “This is currently set to false because there are bugs in the “append code" and is not supported in any prodction cluster."。但是 HBase Configuration 裡另外說明了以上的資訊是過時的,在 Cloudera 及 MapR 的版本都已經加入了這個功能。如果有使用 HBase,為了避免資料遺失,請把這個值設為 true。 - dfs.namenode.handler.count
預設值 : 10
說明 : 設定 namenode server threads 的數量,這些 threads 會用 RPC 跟其他的 datanodes 溝通。當 datanodes 數量太多時會發現很容易出現 RPC timeout,解決方法是提升網路速度或調高這個值,但要注意的是 thread 數量多也表示 namenode 吃的記憶體也隨著增加。在 Hadoop Cluster Setup 這篇文章裡的提到 900 個 nodes 只需要設成 40,但是在個人經驗裡是 100 個 nodes 配 100 個 threads。 - dfs.namenode.keytab.file
預設值 : N/A
說明 : 當 core-site.xml 裡的 hadoop.security.authentication 參數設為 “kerberos" 時就要指定 keytab 的位置。例如 : /etc/hadoop/conf/hdfs.keytab - dfs.namenode.kerberos.principal
預設值 : N/A
說明 : 指定 kerberos principal 名稱,這在產生 keytab 檔案時會指定,一般常用的命名規則是 hdfs/_HOST@KERBEROS-REALM.COM
- dfs.name.dir
- Secondary NameNode
- dfs.secondary.namenode.keytab.file
預設值 : N/A
說明 : 當 core-site.xml 裡的 hadoop.security.authentication 參數設為 “kerberos" 時就要指定 keytab 的位置。例如 : /etc/hadoop/conf/hdfs.keytab - dfs.secondary.namenode.kerberos.principal
預設值 : N/A
說明 : 指定 kerberos principal 名稱,這在產生 keytab 檔案時會指定,一般常用的命名規則是 hdfs/_HOST@KERBEROS-REALM.COM
- dfs.secondary.namenode.keytab.file
- DataNode
- dfs.data.dir
預設值 : ${hadoop.tmp.dir}/dfs/data
說明 : 指定本機上放 data nodes 資料的目錄,如果要指定多個目錄(volumes) 可用 “," 分隔。在 production 環境會指定多個,並設定 dfs.datanode.failed.volumes.tolerated。一般來說,多個目錄會對應到系統上不同的 partitions,不同的硬碟。設定多個可加快存取速度,及避免硬碟壞掉需要抽換用。 - dfs.datanode.address
預設值 : 0.0.0.0:50010
說明 : datanode service 聽的 port,用來傳輸資料用。除非是為了 security 的考量才會需要改 binding 的 IP/Port,不然不需要改這個值。 - dfs.datanode.http.address
預設值 : 0.0.0.0:50075
說明 : Web UI 用的 port。除非是為了 security 的考量才會需要改 binding 的 IP/Port,不然不需要改這個值。 - dfs.datanode.handler.count
預設值 : 3
說明 : 指定 data node 上用的 thread 數量。在 production 的環境建議調到 100。 - dfs.datanode.max.xcievers
預設值 : 256
說明 : 這個值是指定 datanode 可同時處理的最大檔案數量。但是預設值很小,當多個或一個大型程式存取時會發生下面的錯誤訊息
以使用 HBase 為例,建議值是 4096。如果還有多個程式存取可再乘 2。 - dfs.datanode.failed.volumes.tolerated
預設值 : 0
說明 : 這個值要對應 dfs.data.dir 參數設定的目錄個數,0 表示只要有任何一個 volume 壞掉 data nodes 就會被強制停掉。假設掛載 n 個 volumns,Hadoop 會確定 n – dfs.datanode.failed.volumes.tolerated 不能小於 0。設定錯誤在啟動 data node 會看到下面的訊息
如果 data volumns 有 4 個,dfs.datanode.failed.volumes.tolerated 可設為 2。表示當有 2 個硬碟壞掉時 data nodes 還是可以正常運作。這時只要換壞掉硬碟即可,並不需要停掉 data nodes。 - dfs.datanode.data.dir.perm
預設值 : 700
說明 : 這個值是設定 data node 寫資料到 local disk 上的權限。使用 POSIX 表示法。在 production 上為了 security 考量,不建議改這個參數。如果是測試環境為了方便其他 users 用工具分析資料,可以改成 755。 - dfs.datanode.du.reserved
預設值 : 0(byte)
說明 : 預設值表示 data nodes 會使用整個 volumns,寫滿之後會導致無法再寫入 M/R jobs 或啟動 data nodes 時的暫存檔。如果還有其他程式共用這些目錄也會受到影響。建議保留至少 1073741824(1G) 的空間。 - dfs.datanode.keytab.file
預設值 : N/A
說明 : 當 core-site.xml 裡的 hadoop.security.authentication 參數設為 “kerberos" 時就要指定 keytab 的位置。例如 : /etc/hadoop/conf/hdfs.keytab - dfs.datanode.kerberos.principal
預設值 : N/A
說明 : 指定 kerberos principal 名稱,這在產生 keytab 檔案時會指定,一般常用的命名規則是 hdfs/_HOST@KERBEROS-REALM.COM
- dfs.data.dir
- Etc
- dfs.balance.bandwidthPerSec
預設值 : 1048576(byte)
說明 : 這個值是決定 file blocks 從一個 data node 搬到另一個 data node 的速度, 預設為 1MB。主要是用在 re-balance,如果覺得執行速度太慢可以調整這個參數加快 blocks 的搬移。但是這也表示會多佔頻寬,可能會影響正常 M/R jobs 或 applications 的執行。建議值為 4194304(4MB)
- dfs.balance.bandwidthPerSec
執行環境
CentOS 6.2
JDK 1.6.0_31
Cloudera CDH3U3
參考資料
hfds-default.xml