1. 程式人生 > >動態新增刪除datanode以及tasktracker

動態新增刪除datanode以及tasktracker

首先: 建議datanode和tasktracker分開寫獨立的exclude檔案,因為一個節點即可以同時是datanode和tasktracker,也可以單獨是datanode或tasktracker。 1、刪除datanode 修改namenode上的hdfs-site.xml
  1. <property>
  2. <name>dfs.hosts</name>
  3. <value>/usr/local/hadoop/conf/datanode-allow-list</value>
  4. </property>
  5. <property>
  6. <name>dfs.hosts.exclude</name>
  7. <value>/usr/local/hadoop/conf/datanode-deny-list</value>
  8. </property>
其中dfs.host列出了連入namenode的節點,如果為空,則所有的datanode都可以連入namenode。如果不為空,則檔案中存在的datanode可以連入。 dfs.hosts.exclude列出了禁止連入namenode的節點。 如果一個節點同時存在於dfs.hosts和dfs.hosts.exclude,則禁止連入。 具體步驟  (1)將要刪除的datanode加入到dfs.hosts.exclude指定的檔案中。(最好使用主機名,IP有時可能不生效)  (2)動態重新整理配置,不需要重啟namenode
  1. hadoop dfsadmin -refreshNodes
 (3)通過hadoop dfsadmin -report或webui,可以看到,該datanode的狀態為Decommissioning  (4)等待一段時間,該節點為dead狀態。  (5)刪除dfs.hosts檔案中該節點  (6)
  1. hadoop dfsadmin -refreshNodes
 注:按照上面的操作後,如果你想要重新啟用該節點為datanode,從dfs.hosts.exclude中刪除該節點,refreshNodes,然後,到該節點上,重啟啟動該datanode:
  1. /usr/local/hadoop/bin/hadoop-daemon.sh stop datanode
  2. /usr/local/hadoop/bin/hadoop-daemon.sh start datanode
 注:正確的刪除datanode的方法應該是按照上面的方法,使用exclude檔案,而不應該直接去datanode上去sotp datanode,這樣會造出資料丟失,而且stop以後,webui和hadoop dfsadmin -report都仍然顯示該datanode節點。除非重新啟動namenode。  之所以重新啟用exclude的節點時可以stop datanode,因為此時該datanode不包含在cluster中,所以,stop後不會造成資料丟失。  2、新增datanode  如果存在dfs.hosts檔案,且不為空,則新增新的datanode到該檔案中,refreshNodes。  到新節點上,啟動即可
  1. /usr/local/hadoop/bin/hadoop-daemon.sh start datanode
 如果不存在dfs.hosts檔案,或檔案為空,直接啟動新節點即可。  3、刪除tasktracker  原理和步驟與刪除datanode一樣。
  1. <property>
  2. <name>mapred.hosts</name>
  3. <value>/usr/local/hadoop/conf/tasktracker-allow-list</value>
  4. </property>
  5. <property>
  6. <name>mapred.hosts.exclude</name>
  7. <value>/usr/local/hadoop/conf/tasktracker-deny-list</value>
  8. </property>
 動態重新整理配置的命令為:
  1. hadoop mradmin -refreshNodes
 立刻生效,可以在webui中看到,nodes節點數量的變化,以及Excluded Nodes節點的變化。  具體的步驟參考上面的刪除datanode的步驟  注:按照上面的操作後,如果你想要重新啟用該節點為tasktracker,從mapred.hosts.exclude中刪除該節點,refreshNodes,然後,到該節點上,重啟啟動該tasktracker:
  1. /usr/local/hadoop/bin/hadoop-daemon.sh stop tasktracker
  2. /usr/local/hadoop/bin/hadoop-daemon.sh start tasktracker
 注:正確的刪除tasktracker的方法應該是按照上面的方法,使用exclude檔案,而不應該直接去tasktracker上去sotp tasktracker,這樣會造成job失敗,而且stop以後,webui上仍然顯示該tasktracker節點。除非重新啟動jobtracker。  我遇到的一個問題:  在exclude檔案中,我使用了IP,發現tasktracker仍然參與計算。  在webui中發現,Excluded Nodes中存在該IP,Nodes中仍然存在該tasktracker的hostname。  解決的辦法就是,在exclude中使用hostname而不使用IP。  判斷是否真正生效:如果exclued檔案中正確的填寫了要失效的node,則總得nodes數量應該減小。  4、新增tasktracker   如果存在mapred.hosts檔案,且不為空,則新增新的tasktracker到該檔案中,refreshNodes。  到新節點上,啟動即可
  1. /usr/local/hadoop/bin/hadoop-daemon.sh start tasktracker
 如果不存在mapred.hosts檔案,或檔案為空,直接啟動新節點即可。 6、新增或刪除datanode後,平衡磁碟利用率 執行bin/start-balancer.sh,這個會很耗時間 備註:  如果不balance,那麼cluster會把新的資料都存放在新的node上,這樣會降低mr的工作效率; /usr/local/hadoop/bin/start-balancer.sh -threshold 0.1     threshold 是平衡閾值,預設是10%,值越低各節點越平衡,但消耗時間也更長。 balancer也可以在有mr job的cluster上執行,預設dfs.balance.bandwidthPerSec很低,為1M/s。在沒有mr job時,可以提高該設定加快負載均衡時間。 在namenode的hdfs-site.xml中增加設定balance的頻寬,預設只有1M:
  1. <property> 
  2.     <name>dfs.balance.bandwidthPerSec</name> 
  3.     <value>10485760</value> 
  4.     <description>
  5.         Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second.
  6.     </description> 
  7. </property>