本文翻譯翻譯自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ClusterSetup.html 譯註:僅僅是翻譯,內容關於搭建一個純凈,簡單的hadoop集群。實際的集群,需要考慮高可靠,性能,安全。 參 ...
本文翻譯翻譯自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ClusterSetup.html
譯註:僅僅是翻譯,內容關於搭建一個純凈,簡單的hadoop集群。實際的集群,需要考慮高可靠,性能,安全。
參考:高可靠
1.目的
告訴讀者如何搭建具有幾個節點或者成千上萬個節點的集群。
但不包含高可靠和保全內容。
2.前提
- 安裝必要的java版本
- 下載穩定版本
譯註:如果是生產庫,千萬不要使用穩定版本之外的。除非你願意支付這種代價。
3.安裝
通常包括在所有節點上解壓軟體,或者也可以使用打包系統。
劃分硬體的功能很重要。
通常,一臺機器作為名稱節點,另外一臺作為資源管理器。這兩台是核心機器。
其它服務(諸如web應用代理伺服器和mr作業歷史伺服器)可以運行在專有機器上,也可以在大機上共存,具體取決於負載。
其它的機器,用作數據節點和節點管理器。它們屬於從屬。
譯註:原文分別使用master和slave劃分幾種服務。以為把它們分別翻譯為“核心","從屬".
4.非保全模式的配置
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.xm和etc/hadoop/mapred-site.xml.
此外,我們可以控制位於bin目錄下的hadoop腳本,方式是修改 etc/hadoop/hadoop-env.sh 和 etc/hadoop/yarn-env.sh
為了配置hadoop集群,我們需要配置運行hadoop守護程式用戶的環境變數,並配置守護程式有關的參數。
HDFS守護程式包含NameNode, SecondaryNameNode, and DataNode。YARN的是ResourceManager, NodeManager, 和WebAppProxy。如果有使用MR,那麼還包含MapReduce Job History Server。
在大型集群中,這些守護程式通常是在不同的主機上分開運行(應為壓力實在大)。
4.1配置hadoop守護程式環境
管理員應該使用etc/hadoop/hadoop-env.sh,etc/hadoop/mapred-env.sh ,etc/hadoop/yarn-env.sh來設定節點有關的定製環境。
有些情況下,還必須設定JAVA_HOME。(譯註,這個是通過實踐,是嚴重推薦的,因為有的人的機器上可能有許多JAVA環境).
管理員可以使用下表中環境變數為每個獨立的守護程式設定特定的選項:
Daemon | Environment Variable |
---|---|
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 |
例如,為了讓名稱節點可以使用JAVA並行的GC(垃圾回收),那麼可以在 hadoop-env.sh 中添加如下語句:
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC"
etc/hadoop/hadoop-env.sh 中有更多的例子。
譯註:要啟用什麼java配置? 這個如果不是很熟悉hadoop的內核,還是不要輕易調整。 但如果是研究性的集群,不煩可以試試,或者遇到死馬的時候,也可以考慮下。
其它一些配置也可以定製,包括:
- HADOOP_PID_DIR - 守護程式進程id文件所在路徑。
- HADOOP_LOG_DIR - 守護程式日誌路徑。
- HADOOP_HEAPSIZE / YARN_HEAPSIZE - java虛擬機所使用最大記憶體,單位MB。例如如果是1000就是1000MB。預設就是1000MB.可以根據集群的需要調整大小。
大部分情況下,我們應該設定HADOOP_PID_DIR 和 HADOOP_LOG_DIR,這樣只有啟動守護程式的用戶可以寫。否則有潛在的連接攻擊。
一般來說,也需要在系統級別shell環境中配置HADOOP_PREFIX,例如可以在目錄/etc/profile.d下的腳本中設定:
HADOOP_PREFIX=/path/to/hadoop
export HADOOP_PREFIX
譯註:關於是否設置系統級別的環境變數,要看具體環境而定。
Daemon | Environment Variable |
---|---|
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NODEMANAGER_HEAPSIZE |
WebAppProxy | YARN_PROXYSERVER_HEAPSIZE |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
4.2配置hadoop守護程式
譯註:這個小章節,需要讀者格外註意。但本章節中提到的配置僅僅是一些關鍵性的部分,並不包含所有。建議讀者詳細閱讀各個配置文件的default文檔說明。
HDFS設置
- etc/hadoop/core-site.xml
Parameter | Value | Notes |
---|---|---|
fs.defaultFS | NameNode URI |
有的地方如果有啟用viewFs,可能首碼不同。但本文只說簡單的。 |
io.file.buffer.size | 131072 |
Size of read/write buffer used in SequenceFiles. 單位位元組。具體可以參考core-default.xml說明 |
-
etc/hadoop/hdfs-site.xml
-
NameNode(名稱節點):
Parameter | Value | Notes |
---|---|---|
dfs.namenode.name.dir | Path on the local filesystem where the NameNode stores the namespace and transactions logs persistently. | 操作系統本地路徑 為了冗餘,可以配置多個路徑,路徑之間使用逗號分隔。既然是冗餘,建議路徑是位於不同的磁碟上。或者是使用raid磁碟,一個路徑即可。 |
dfs.hosts / dfs.hosts.exclude | List of permitted/excluded DataNodes. |
允許/禁止的數據節點名稱。具體值是一個文件的全路徑。文件中一行一個主機名稱。也可以不設置。如果允許就可以連接名稱節點。 譯註:不太清楚這個有什麼作用,也許僅僅是為了便於替換加入,或者做擴展測試。 |
dfs.blocksize | 268435456 | 數據塊大小。可以尾碼單位為(k,m,g,t,p,e),例如128m。也可以沒有尾碼(就是位元組為單位),這裡是256mb。 譯註:數據塊設置多大,和操作系統,每個文件大小,java設置,網路都有關係。 |
dfs.namenode.handler.count | 100 |
rpc線程個數(LINUX就是進程),用於數據節點和名稱節點之間的通訊。 譯註:如果你有非常多的數據節點,這個就需要設置很大 |
- DataNode(數據節點):
Parameter | Value | Notes |
---|---|---|
dfs.datanode.data.dir | Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks. |
存儲實際的數據塊。可以有多個路徑,之間以逗號分隔。 如果有多個路徑,則必須在每個路徑後跟上設備類型([SSD]/[DISK]/[ARCHIVE]/[RAM_DISK]) 如果沒有跟上,則預設是DISK。如果許可權運行,即使目錄不存在,也會創建 關於這個詳細的信息可以參閱http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html 譯註:在將來,這是必須嚴重關註的事情,當然也許更新的版本並不關註這個設置。 |
yarn設置
- etc/hadoop/yarn-site.xml
-
ResourceManager 和 NodeManager:
Parameter | Value | Notes |
---|---|---|
yarn.acl.enable | true / false | 是否啟用acl,預設不啟用 |
yarn.admin.acl | Admin ACL |
acl列表。具體可以參考服務級別授權。 |
yarn.log-aggregation-enable | false |
啟用或者禁用容器日誌。如果啟用,就會記錄,並且日誌會移動到某個文件系統,例如HDFS。 日誌可以使用Application Timeline Server來查看。 譯註:如果設置為true,則還涉及都許多的配置。 |
- ResourceManager:
Parameter | Value | Notes |
---|---|---|
yarn.resourcemanager.address | ResourceManager host:port for clients to submit jobs. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.scheduler.address | ResourceManager host:port for ApplicationMasters to talk to Scheduler to obtain resources. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.resource-tracker.address | ResourceManager host:port for NodeManagers. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.admin.address | ResourceManager host:port for administrative commands. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.webapp.address | ResourceManager web-ui host:port. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.hostname | ResourceManager host. | host Single hostname that can be set in place of setting all yarn.resourcemanager*address resources. Results in default ports for ResourceManager components. |
yarn.resourcemanager.scheduler.class | ResourceManager Scheduler class. | CapacityScheduler (recommended), FairScheduler (also recommended), or FifoScheduler |
yarn.scheduler.minimum-allocation-mb | Minimum limit of memory to allocate to each container request at the Resource Manager. | In MBs |
yarn.scheduler.maximum-allocation-mb | Maximum limit of memory to allocate to each container request at the Resource Manager. | In MBs |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | List of permitted/excluded NodeManagers. |
If necessary, use these files to control the list of allowable NodeManagers. |
- NodeManager:
Parameter | Value | Notes |
---|---|---|
yarn.nodemanager.resource.memory-mb | Resource i.e. available physical memory, in MB, for given NodeManager | Defines total available resources on the NodeManager to be made available to running containers |
yarn.nodemanager.vmem-pmem-ratio | Maximum ratio by which virtual memory usage of tasks may exceed physical memory | The virtual memory usage of each task may exceed its physical memory limit by this ratio. The total amount of virtual memory used by tasks on the NodeManager may exceed its physical memory usage by this ratio. |
yarn.nodemanager.local-dirs | Comma-separated list of paths on the local filesystem where intermediate data is written. | Multiple paths help spread disk i/o. |
yarn.nodemanager.log-dirs | Comma-separated list of paths on the local filesystem where logs are written. | Multiple paths help spread disk i/o. |
yarn.nodemanager.log.retain-seconds | 10800 | Default time (in seconds) to retain log files on the NodeManager Only applicable if log-aggregation is disabled. |
yarn.nodemanager.remote-app-log-dir | /logs | HDFS directory where the application logs are moved on application completion. Need to set appropriate permissions. Only applicable if log-aggregation is enabled. |
yarn.nodemanager.remote-app-log-dir-suffix | logs | Suffix appended to the remote log dir. Logs will be aggregated to ${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam} Only applicable if log-aggregation is enabled. |
yarn.nodemanager.aux-services | mapreduce_shuffle | Shuffle service that needs to be set for Map Reduce applications. |
- History Server:
Parameter | Value | Notes |
---|---|---|
yarn.log-aggregation.retain-seconds | -1 | How long to keep aggregation logs before deleting them. -1 disables. Be careful, set this too small and you will spam the name node. |
yarn.log-aggregation.retain-check-interval-seconds | -1 | Time between checks for aggregated log retention. If set to 0 or a negative value then the value is computed as one-tenth of the aggregated log retention time. Be careful, set this too small and you will spam the name node. |
mr設置(譯註:這個不是必須的,如果僅僅想使用hdfs和yarn,而使用其它計算引擎,例如spark,presto,impala等)
- etc/hadoop/mapred-site.xml
-
MapReduce Applications:
Parameter | Value | Notes |
---|---|---|
mapreduce.framework.name | yarn | Execution framework set to Hadoop YARN. |
mapreduce.map.memory.mb | 1536 | Larger resource limit for maps. |
mapreduce.map.java.opts | -Xmx1024M | Larger heap-size for child jvms of maps. |
mapreduce.reduce.memory.mb | 3072 | Larger resource limit for reduces. |
mapreduce.reduce.java.opts | -Xmx2560M | Larger heap-size for child jvms of reduces. |
mapreduce.task.io.sort.mb | 512 | Higher memory-limit while sorting data for efficiency. |
mapreduce.task.io.sort.factor | 100 | More streams merged at once while sorting files. |
mapreduce.reduce.shuffle.parallelcopies | 50 | Higher number of parallel copies run by reduces to fetch outputs from very large number of maps. |
- MapReduce JobHistory Server:
Parameter | Value | Notes |
---|---|---|
mapreduce.jobhistory.address | MapReduce JobHistory Server host:port | Default port is 10020. |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server Web UI host:port | Default port is 19888. |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | Directory where history files are written by MapReduce jobs. |
mapreduce.jobhistory.done-dir | /mr-history/done | Directory where history files are managed by the MR JobHistory Server. |
5.監控節點管理器的健康
hadoop提供了一套機制,管理員可以配置節點管理器,讓節點管理器定時運行腳本,以確定節點是否健康。
管理員可以調整腳本,做他們自己需要檢查的項目。如果腳本認為節點不健康,它必須在標註輸出中答應一行內容,開頭是ERROR。節點管理器定時執行這個腳本,並檢查腳本輸出。如果輸出包含ERROR,那麼節點就被認為不健康(unhealthy),資源管理器會把該節點列入黑名單,之後,不再為這個問題節點分配任務。然後,因為節點管理器是不停執行這個腳本,所以如果某個節點恢復健康狀態,那麼這個節點就從資源管理器的黑名單剔除,之後又會被指派任務。
檢點的健康情況,可以通過web界面查看。
etc/hadoop/yarn-site.xml中的以下參數可以控制節點健康監控:
Parameter | Value | Notes |
---|---|---|
yarn.nodemanager.health-checker.script.path | Node health script |
Script to check for node’s health status. 健康檢查腳本瀏覽路徑 |
yarn.nodemanager.health-checker.script.opts | Node health script options | Options for script to check for node’s health status. |
yarn.nodemanager.health-checker.interval-ms | Node health script interval | Time interval for running health script. |
yarn.nodemanager.health-checker.script.timeout-ms | Node health script timeout interval | Timeout for health script execution. |
檢查檢查腳本不會因為只有一些磁碟有問題,就給出ERROR標記。節點管理器有定期檢查本地磁碟的能力(特別地會去簡單nodemanager-local-dirs 和 nodemanager-log-dirs),如果發現損壞的目錄數已經超過yarn.nodemanager.disk-health-checker.min-healthy-disks所設定的閥值,那麼整個節點就會被認標記為不健康。引導磁碟是否raid,引導此否是否有問題,都會被檢查腳本檢查。
6.slaves文件
slave機器(節點),或者說從屬節點,它們必須在文件etc/hadoop/slaves中登記,一個一行。有關程式利用這個文本的內容,一次性在所有的節點上執行相同的命令。為了達成這個目的,各個節點上啟動hadoop的系統用戶賬戶必須互相建立ssh信任。
譯註:如果節點太多,建議使用腳本來構建這樣的信任。
7.hadoop機棧敏感
許多hadoop組件是機棧敏感的,它們利用網路拓撲結構來提升性能和安全。hadoop守護程式通過激活一個管理員可配的模塊來獲得機棧信息。
具體參考機棧敏感。
嚴重建議:在啟動hdfs之前,需要先配置好機棧敏感。
譯註:機棧敏感,更多是一種邏輯拓撲,但和實際的物理拓撲也有密切的關係。
8.日誌
修改etc/hadoop/log4j.properties即可啟用apache log4j。
9.hadoop集群操作
9.1啟動
為了啟動hadoop集群,必須啟動HDFS和YARN集群。(譯註:以下假定hdfs的用戶是hdfs,yarn的用戶是yarn).
啟動之前,必須先格式化
[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name> --參數cluster_name只有在部署federation(聯合)的時候才需要提供。
啟動HDFS
在每個名稱節點上,執行以下命令
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
在每個數據節點上執行以下命令
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs start datanode
如果有配置ssh信任,並且etc/hadoop/slaves有配置,那麼可以使用以下腳本:
[hdfs]$ $HADOOP_PREFIX/sbin/start-dfs.sh
譯註:本文中這樣的配置,會預設啟動一個第二名稱節點,和名稱節點在同一臺機器上。
啟動YARN
使用yarn用戶,在資源管理器節點上運行:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
在節點管理器上運行以下命令:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR start nodemanager
在webappproxy伺服器上,運行以下命令:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start proxyserver
如果有建立ssh信任和配置etc/hadoop/slaves,那麼可以直接使用以下腳本啟動
[yarn]$ $HADOOP_PREFIX/sbin/start-yarn.sh
MapReduce JobHistory Server由用戶 mapred啟動:
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver
譯註:mr的作業歷史伺服器,需要單獨啟動。
9.2 關閉
關閉HDFS
關閉名稱節點
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
關閉數據節點
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode
如果有配置ssh信任,並且etc/hadoop/slaves有配置,那麼可以使用以下腳本:
[hdfs]$ $HADOOP_PREFIX/sbin/stop-dfs.sh
關閉YARN
關閉資源管理器
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
關閉節點管理器
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR stop nodemanager
如果有配置ssh信任,並且etc/hadoop/slaves有配置,那麼可以使用以下腳本:
[yarn]$ $HADOOP_PREFIX/sbin/stop-yarn.sh
關閉yarn的web代理伺服器
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop proxyserver
關閉MR作業歷史伺服器(如果有負載均衡,需要逐個關閉)
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR stop historyserver
譯註: 實際關閉集群的時候,應該先關閉yarn,再關閉hdfs。
10.web介面
Daemon | Web Interface | Notes |
---|---|---|
NameNode | http://nn_host:port/ | Default HTTP port is 50070,可以查看hdfs文件 |
ResourceManager | http://rm_host:port/ | Default HTTP port is 8088. |
MapReduce JobHistory Server | http://jhs_host:port/ | Default HTTP port is 19888. |