需要JDK、SSH
對于偽分布式,Hadoop會采取與集群相同的處理方式:按次序啟動文件conf/slaves中記載的主機上的進程,只不過在偽分布式中Slave為localhost(自身)。
?
Hadoop從三個角度將主機劃分為兩種角色:
最基本Master和Slave
HDFS角度:NameNode和DataNode
MapReduce角度:JobTracker和TaskTracker
?
三種運行方式:
單機模式:無需配置,Hadoop被認為是一個單獨的Java進程,用于調試
偽分布式:fs.default.name=hdfs://localhost:9000
?? ? ? ? ? ? ?dfs.replication=1
分布式:
?
格式化HDFS系統:hadoop namenode -format
HDFS web端口:50070
?
網絡拓撲
通常來說,一個Hadoop集群體系結構由兩層網絡拓撲組成
Switch | Switch1 | Node1 |
Node2 | ||
Node3 | ||
Switch2 | Node4 | |
Node5 | ||
Node5 |
?
實際應用中,每個機架會有30-40臺機器,這些機器共享一個1GB帶寬的網絡交換機;
在所有機架之上還有一個核心交換機或路由器,通常來說其網絡交換能力為1GB或更高。
同一機架中機器節點之間的帶寬資源肯定比不同機架中機器節點豐富,這也是Hadoop隨后設計數據讀寫分發策略要考慮的一個重要因素。
在實際應用中,為了使Hadoop集群獲得更高的性能,需要配置集群,使Hadoop能夠感知其所在的網絡拓撲結構——使Hadoop清晰的知道每臺機器所在的機架。
在處理MapReduce任務時,優先選擇在機架內部做數據傳輸,以充分利用網絡帶寬資源。
HDFS可以更加智能地部署數據副本,并在性能和可靠性間找到最優的平衡。
網絡的拓撲結構、機器節點及機架的網絡位置定位都是通過樹結構來描述的。
通過樹結構來確定節點間的距離,這個距離是Hadoop做決策判斷時的參考因素。
在配置Hadoop時,Hadoop會確定節點地址和其網絡位置的映射,此映射在代碼中通過Java接口DNSToSwitchMapping實現,代碼如下
public interface DNSToSwitchMapping{
public List<string> resolve(List<String> names);
}
在topology.node.switch.mapping.impl中的配置參數定義了一個DNSToSwitchMapping接口的實現,NameNode通過它確定完成任務的機器節點所在的網絡位置。
系統有一個默認的接口實現ScriptBasedMapping,可以運行用戶自定義的一個腳本去完成映射。如果沒有定義映射,則將所有的機器節點映射到一個單獨的網絡位置中默認的機架上;如果定義了映射,則腳本位置由topology.script.file.name指定。
腳本獲得一批IP,生成一個標準的網絡位置。
?
?
Hadoop集群配置
Hadoop通過org.apache.hadoop.conf.configuration來讀取配置文件
Hadoop運行定義最終參數(final parameter)——不能在進程中改變
允許參數傳遞,即定義了一個參數后,進行引用 ${basedir}
hadop-env.sh ?為Hadoop守護進程設置環境變量
java路徑
core-site.xml
fs.default.name
hdfs-site.xml
dfs.name.dir
dfs.data.dir
mapred-site.xml
yarn-site.xml
mapred-queues.xml ?
設置MapReduce系統的隊列順序,例如把用戶分組,賦予不同級別,優先級高的job先執行
queue的有效性依賴于mapreduce.jobtracker.taskscheduler設置的調度規則(scheduler)
一些調度算法可能只需一個queue,復雜調度算法需要設置多個queue。
對queue的大部分修改無需重啟系統。
?
通過logs目錄下的日志文件對過往進行分析。
例如:NameNode和DataNode的namespaceID不一致
這個問題是由于兩次或兩次以上格式化NameNode造成的
兩種解決辦法:
1、刪除DataNode所有資料
2、修改每個DataNode的namespaceID ?位于dfs/data/current/VERSION文件中
或NameNode的namespaceID ?位于dfs/name/current/VERSION文件中
?
實際應用場景:
重啟壞掉的DataNode或JobTracker
動態加入DataNode或TaskTracker
hadoop-daemon.sh --config ./conf start datanode
hadoop-daemon.sh --config ./conf start tasktracker