1. 程式人生 > >hadoop2.8.2官方文件之分散式叢集

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.remoteapplogdir/{user}/${thisParam} ,僅在log-aggregation為true時可用
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檢視各種元件,