hadoop2.8.2官方文件之分散式叢集
目標
這個文件介紹怎麼使用Hadoop叢集,從幾個節點到幾千個節點。想要玩轉Hadoop,你可能需要先嚐試一下單節點模式:see(單節點模式)
這個文件不包括一些高階主題,比如:安全性和高可用性。
需求
- 安裝java正確版本。(單節點模式中介紹瞭如何選擇正確java版本)
- 從Apache映象下載穩定版的Hadoop。
安裝
安裝一個Hadoop叢集需要在不同的機器上解壓軟體。把不同的硬體(伺服器)拆分為不同的功能是非常重要的。
通常一臺叢集中的一臺機器指定作為NameNode,另外一臺作為ResourceManager,這是主節點。其他的服務,比如Web App代理服務和MapReduce任務歷史服務,通常執行在專門的機器上或者共享的機器上,這需要根據負載因素考慮。
急群中剩下的機器作為DataNode和NodeManager,這是從節點。
配置Hadoop為非安全模式
Hadoop的java配置有兩個重要的型別:
- 只讀的預設配置:core-default.xml, hdfs-default.xml, yarn-default.xml 和 mapred-default.xml.
- 具體地址配置:etc/hadoop/core-site.xml, etc/hadoop/hdfs-site.xml, etc/hadoop/yarn-site.xml 和 etc/hadoop/mapred-site.xml.
另外,你可以通過修改etc/hadoop/hadoop-env.sh和etc/hadoop/yarn-env.sh中的內容來代替設定具體地址配置。
為了配置Hadoop叢集,你需要配置Hadoop執行的環境,也就是Hadoop執行需要的引數。
HDFS程序包括:NameNode,SecondaryNameNode和DataNode。
YARN程序包括:ResourceManager,NodeManager和WebAppProxy。
如果用到MapReduce的話,MapReduce任務歷史服務也需要執行。為了叢集能夠更大,這些東西一般都執行在不同的機器上。
配置Hadoop程序的環境
管理員可以用etc/hadoop/hadoop-env.sh或者etc/hadoop/mapred-env.sh和etc/hadoop/yarn-env.sh 指令碼來自定義具體地址配置。
至少,你必須指定JAVA_HOME的值。
管理員可以使用下面的選項單獨配置每一個程序,選項如下:
程序 | 環境變數 |
---|---|
NameNode | HADOOP_NAMENODE_OPTS |
DataNode | HADOOP_DATANODE_OPTS |
Secondary NameNode | HADOOP_SECONDARYNAMENODE_OPTS |
ResourceManager | YARN_RESOURCEMANAGER_OPTS |
NodeManager | YARN_NODEMANAGER_OPTS |
WebAppProxy | YARN_PROXYSERVER_OPTS |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_OPTS |
舉個例子,讓Namenode程序使用parallelGC回收器,下面的配置就需要加入 hadoop-env.sh中。
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC"
更多的配置可以檢視etc/hadoop/hadoop-env.sh 檔案。下面列幾個常用到的引數。
- HADOOP_PID_DIR :程序id檔案存放的目錄。
- HADOOP_LOG_DIR :程序的日誌檔案存放的目錄。
- HADOOP_HEAPSIZE / YARN_HEAPSIZE:最大堆大小,單位MB。如果這個引數設定為1000,那麼堆就是1000MB。預設就是1000。
通常情況,你應該指定HADOOP_PID_DIR 和HADOOP_LOG_DIR ,並且使得這些目錄只有指定使用者才有許可權操作。否則會有潛在符號連結攻擊的危險。
配置HADOOP_PREFIX 也是很常用的,舉個例子,在/etc/profile.d中新增一個簡單的指令碼:
HADOOP_PREFIX=/path/to/hadoop
export HADOOP_PREFIX
還有一些設定堆大小的引數如下所示:
程序 | 環境變數 |
---|---|
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NODEMANAGER_HEAPSIZE |
Secondary NameNode | YARN_PROXYSERVER_HEAPSIZE |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
配置Hadoop程序
這個章節介紹一些配置檔案中重要的引數。
etc/hadoop/core-site.xml
引數 | 值 | 備註 |
---|---|---|
fs.defaultFS | NameNode地址 | hdfs://host:port/ |
io.file.buffer.size | 131072 | SequenceFiles的讀寫緩衝區大小 |
etc/hadoop/hdfs-site.xml
配置NameNode:
引數 | 值 | 備註 |
---|---|---|
dfs.namenode.name.dir | NameNode存放名稱空間和事務日誌的路徑 | 逗號分開的路徑,為了冗餘,名稱表會存在在多個路徑中 |
dfs.hosts /dfs.hosts.exclude | 允許和排除的DataNode列表 | 如果需要,使用這些檔案控制那些Datanode是被允許的。 |
dfs.blocksize | 268435456 | 大的檔案系統HDFS塊大小為256M |
fs.namenode.handler.count | 100 | 多個NameNode服務執行緒處理大量DataNodes的RPC呼叫 |
配置DataNode:
引數 | 值 | 備註 |
---|---|---|
dfs.datanode.data.dir | 資料塊的本地儲存路徑,逗號分開 | 如果是逗號分開的多個路徑,那麼資料會儲存在所有的目錄中,通常在不同的裝置上 |
etc/hadoop/yarn-site.xml
配置ResourceManager 和NodeManager:
引數 | 值 | 備註 |
---|---|---|
yarn.acl.enable | true/false | 使得ACLs可用,預設是false |
yarn.admin.acl | Admin ACL | ACL指定叢集的管理員,預設是*。逗號分開使用者空間和組 |
yarn.log-aggregation-enable | false | 日誌聚合開關 |
配置ResourceManager:
引數 | 值 | 備註 |
---|---|---|
yarn.resourcemanager.address | ResourceManager 主機:埠,客戶端用來提交任務。 | 如果不設定,預設是yarn.resourcemanager.hostname的值 |
yarn.resourcemanager.scheduler.address | ResourceManager 主機:埠,ApplicationMasters向Scheduler獲得資源 | 如果不設定,預設是yarn.resourcemanager.hostname的值 |
yarn.resourcemanager.resource-tracker.address | ResourceManager 主機:埠,NodeManagers使用 | 如果不設定,預設是yarn.resourcemanager.hostname的值 |
yarn.resourcemanager.admin.address | ResourceManager 主機:埠,管理員命令 | 如果不設定,預設是yarn.resourcemanager.hostname的值 |
yarn.resourcemanager.webapp.address | ResourceManager 主機:埠,web-ui訪問 | 如果不設定,預設是yarn.resourcemanager.hostname的值 |
yarn.resourcemanager.hostname | ResourceManager主機 | 設定yarn.resourcemanager*address的預設地址,使用預設埠 |
yarn.resourcemanager.scheduler.class | ResourceManager排程器 | CapacityScheduler(推薦),FairScheduler(推薦)和FifoScheduler |
yarn.scheduler.minimum-allocation-mb | 最小記憶體限制 | 單位MB |
yarn.scheduler.maximum-allocation-mb | 最大記憶體限制 | 單位MB |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | 允許和排除的NodeManager | 如果需要,可以設定被允許的NodeManager |
配置NodeManager:
引數 | 值 | 備註 |
---|---|---|
yarn.nodemanager.resource.memory-mb | NodeManager資源的實體記憶體 | 定義了NodeManager總可用資源可用執行容器 |
yarn.nodemanager.vmem-pmem-ratio | 可超過實體記憶體的虛擬記憶體的最大比例 | 每個任務的虛擬記憶體可超過實體記憶體,但必須在這個比例限制下。 |
yarn.nodemanager.local-dirs | 逗號分開的本地路徑,存放中間資料 | 多路徑傳播磁碟I/O |
yarn.nodemanager.log-dirs | 逗號分開的日誌路徑 | 多路徑傳播磁碟I/O |
yarn.nodemanager.log.retain-seconds | 10800 | 預設日誌檔案保留時間,僅在log-aggregation是false時可用 |
yarn.nodemanager.remote-app-log-dir | /logs | HDFS目錄,儲存應用日誌,需要設定相應的許可權,僅在log-aggregation為true時可用 |
yarn.nodemanager.remote-app-log-dir-suffix | logs | 遠端日誌目錄的字尾,格式為 |
yarn.nodemanager.aux-services | mapreduce_shuffle | Map Reduce應用的Shuffle服務 |
配置歷史服務(需要移動到任務地方):
引數 | 值 | 備註 |
---|---|---|
yarn.log-aggregation.retain-seconds | -1 | 聚合日誌的儲存時間,-1表示不可用,如果設定的太小會向namenode傳送垃圾郵件 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 聚合日誌的檢查時間間隔,如果是0或者負數,那麼就是聚合日誌儲存時間的十分之一。如果設定的太小會向namenode傳送垃圾郵件。 |
etc/hadoop/mapred-site.xml
配置MapReduce應用:
引數 | 值 | 備註 |
---|---|---|
mapreduce.framework.nam | yarn | 執行框架設定為Hadoop YARN |
mapreduce.map.memory.mb | 1536 | map所需要的記憶體資源 |
mapreduce.map.java.opts | -Xmx1024M | map 子 JVM的堆大小 |
mapreduce.reduce.memory.mb | 3072 | reduce鎖需要的記憶體資源 |
mapreduce.reduce.java.opts | -Xmx2560M | reduce 子 JVM的堆大小 |
mapreduce.task.io.sort.mb | 512 | 為了排序效率更高,可以使用更高的記憶體 |
mapreduce.task.io.sort.factor | 100 | 排序檔案一次合併的流數量 |
mapreduce.reduce.shuffle.parallelcopies | 50 | reduce從map的結果中拷貝資料的並行數量 |
配置MapReduce JobHistory服務:
引數 | 值 | 備註 |
---|---|---|
mapreduce.jobhistory.address | 主機:埠 | 預設埠是10020 |
mapreduce.jobhistory.webapp.address | WEB-UI的主機:埠 | 預設埠19888 |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | MapReduce任務的歷史檔案目錄 |
mapreduce.jobhistory.done-dir | /mr-history/done | MR JobHistory管理的歷史檔案目錄 |
NodeManager的健康監測
Hadoop提供了一個監測節點是否健康的機制,管理員通過配置NodeManager執行一個間隔執行的指令碼就可以做到做到。
管理員選擇指令碼中提供的功能就可以監測節點的健康狀態,如果指令碼監測到節點處於一個非健康狀態,就會列印一個ERROR開頭的日誌到標準輸出,NodeManager間隔執行指令碼並檢查它的輸出。如果指令碼的輸出包含一個ERROR,那麼就會報告這個節點處於非健康狀態,然後ResourceManager就會把這個節點加入黑名單,任務不會再讓這個節點處理。此後NodeManager依舊會執行這個指令碼,來檢測這個節點是否恢復健康,恢復健康後ResourceManager 會自動的移除黑名單。節點的健康是根據指令碼的輸出來檢測的,我們可以通過ResourceManager 的Web介面來檢視它的健康狀態。
下面配置中的引數,可以控制節點的的健康檢測指令碼,配置檔案etc/hadoop/yarn-site.xml。
引數 | 值 | 備註 |
---|---|---|
yarn.nodemanager.health-checker.script.path | 節點健康指令碼路徑 | 這個指令碼檢查節點的健康狀態 |
yarn.nodemanager.health-checker.script.opts | 指令碼選項 | 指令碼的各個選項 |
yarn.nodemanager.health-checker.interval-ms | 間隔時間 | 執行指令碼的間隔時間 |
yarn.nodemanager.health-checker.script.timeout-ms | 超時 | 指令碼執行的超時時間 |
如果本地應該壞了的話,這個指令碼不應該列印ERROR。NodeManager有能力檢測硬碟是否正常工作(具體檢測nodemanager-local-dirs和nodemanager-log-dirs),如果達到了yarn.nodemanager.disk-health-checker.min-healthy-disks配置的數量,整個節點就會被標記為非健康的,這個資訊也會發送給ResourceManager。
Slaves 檔案
在conf/slaves檔案中列出所有slave的主機名或者IP地址,一行一個。輔助指令碼(如下所述)將使用Hadoop/slaves檔案同時在多臺主機上執行命令。它不用於任何基於java的Hadoop的配置。為了使用這一功能,必須為執行Hadoop的賬號建立SSH信任(通過免密碼SSH或其他手段,如Kerberos)。
Hadoop機架感知
許多Hadoop的元件是具有機架感知的,它有利於網路拓撲結構的高效能和安全。Hadoop守護程序通過呼叫一個管理員配置模組獲取叢集中Slaves的機架資訊。
HDFS和Map/Reduce的元件是能夠感知機架的。檢視Rack Awareness獲取更多特定資訊。
非常推薦你在啟動HDFS前配置機架感知。
日誌
Hadoop使用Apache log4j來記錄日誌,它由Apache Commons Logging框架來實現。編輯conf/log4j.properties檔案可以改變Hadoop守護程序的日誌配置(日誌格式等)。
操作Hadoop叢集
一旦所有必須的配置都完成,複製這些配置到所有機器上的HADOOP_CONF_DIR中。在所有機器上這些目錄都應該是相同的。
通常,建議HDFS和YARN使用不同的使用者來啟動,在多數的安裝中,HDFS程序使用”hdfs”,YARN通常使用‘yarn賬號’。
Hadoop啟動
為了啟動Hadoop叢集,你應該先啟動HDFS和YARN叢集。
首先啟動HDFS,必須格式化,格式化一個新的分散式檔案系統如下:
[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name>
啟動HDFS的NameNode,使用下面的命令在每一個hdfs節點上執行:
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
啟動HDFS的DataNode,使用下面的命令在每一個hdfs節點上執行:
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs start datanode
如果etc/hadoop/slaves和ssh訪問已經配置好了(檢視單節點安裝),所有的HDFS程序可以使用一個指令碼啟動,使用hdfs使用者:
[hdfs]$ $HADOOP_PREFIX/sbin/start-dfs.sh
在指定的ResourceManager上啟動YARN,使用下面的命令:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
在每一個yarn節點上執行下面的指令碼啟動NodeManager :
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR start nodemanager
啟動一個單獨的WebAppProxy 服務,使用yarn方式啟動WebAppProxy 服務,如果為了負載均衡啟動多個服務,那麼需要在每一個上都要執行:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start proxyserver
如果etc/hadoop/slaves和ssh訪問已經配置好了(檢視單節點安裝),所有的YARN程序可以使用一個指令碼啟動,使用yarn使用者:
[yarn]$ $HADOOP_PREFIX/sbin/start-yarn.sh
在指定的伺服器上啟動MapReduce JobHistory服務,使用mapred使用者:
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver
關閉Hadoop
在NameNode節點上停止NameNode使用下面的命令。用hdfs使用者:
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
執行指令碼停止DataNode。
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode
如果etc/hadoop/slaves和ssh訪問已經配置好了(檢視單節點安裝),所有的HDFS程序可以使用一個指令碼停止,使用hdfs使用者:
[hdfs]$ $HADOOP_PREFIX/sbin/stop-dfs.sh
在ResourceManager 節點上停止ResourceManager 使用下面的命令,使用yarn使用者:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
在slave上執行一個指令碼停止NodeManager ,yarn使用者:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR stop nodemanager
如果etc/hadoop/slaves和ssh訪問已經配置好了(檢視單節點安裝),所有的YARN程序可以使用一個指令碼停止,使用yarn使用者:
[yarn]$ $HADOOP_PREFIX/sbin/stop-yarn.sh
指定伺服器上,停止MapReduce JobHistory服務,使用下面命令,mapred使用者:
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR stop historyserver
Web介面
一旦Hadoop叢集啟動了,你可以使用下面的web-ui檢視各種元件,