Fenriswolf 程式筆記

奮利斯狼的地盤,小綿羊勿入

Hadoop 參數設定 – hdfs-site.xml

本篇是介紹 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 的設定。

      	hadoop fs -D dfs.block.size=134217728 -put local_name remote_location
      	
    •  

    • 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 測試時會非常的方便,不然常常需要等一段時間或直接執行
        		hadoop dfsadmin -safemode leave
        		

        才能離開 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 做搬資料的動作。

      	hadoop dfsadmin -refreshNodes
      	

      進度可以在 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

     

  • 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

     

  • 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 可同時處理的最大檔案數量。但是預設值很小,當多個或一個大型程式存取時會發生下面的錯誤訊息

      	10/12/08 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.io.IOException: 
      	No live nodes contain current block. Will get new block locations from namenode and retry... 
      	

      以使用 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 會看到下面的訊息

      	2011-08-27 11:53:03,785 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: org.apache.hadoop.util.DiskChecker$DiskErrorException: Invalid value for validVolsRequired : -1 ,  Current valid volumes: 1
      		   at org.apache.hadoop.hdfs.server.datanode.FSDataset.<init>(FSDataset.java:906)
      		   at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:373)
      		   at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:282)
      		   at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1544)
      		   at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1484)
      		   at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1502)
      		   at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1627)
      		   at org.apache.hadoop.hdfs.server.datanode.SecureDataNodeStarter.start(SecureDataNodeStarter.java:103)
      		   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      		   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      		   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      		   at java.lang.reflect.Method.invoke(Method.java:597)
      		   at org.apache.commons.daemon.support.DaemonLoader.start(DaemonLoader.java:177)
      	

      如果 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

     

  • Etc
    • dfs.balance.bandwidthPerSec
      預設值 : 1048576(byte)
      說明 : 這個值是決定 file blocks 從一個 data node 搬到另一個 data node 的速度, 預設為 1MB。主要是用在 re-balance,如果覺得執行速度太慢可以調整這個參數加快 blocks 的搬移。但是這也表示會多佔頻寬,可能會影響正常 M/R jobs 或 applications 的執行。建議值為 4194304(4MB)

 
 
執行環境
CentOS 6.2
JDK 1.6.0_31
Cloudera CDH3U3

參考資料
hfds-default.xml

廣告

2012/05/25 - Posted by | Hadoop | , ,

仍無迴響。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: