Hadoop 群集設定

目的

本文說明如何安裝和設定 Hadoop 群集,從少數幾個節點到擁有數千個節點的極大型群集。若要試玩 Hadoop,您可能想先在單一機器上安裝(請參閱 單一節點設定)。

本文不涵蓋進階主題,例如高可用性。

重要:所有生產 Hadoop 群集都使用 Kerberos 來驗證呼叫者身分,並保護對 HDFS 資料的存取,以及限制對運算服務(YARN 等)的存取。

這些說明不涵蓋與任何 Kerberos 服務的整合,- 每個建立生產群集的人員都應將連線到其組織的 Kerberos 基礎架構視為部署的關鍵部分。

請參閱 安全性,了解如何保護群集的詳細資訊。

先決條件

  • 安裝 Java。請參閱 Hadoop Wiki 以取得已知良好版本。
  • 從 Apache 鏡像網站下載 Hadoop 的穩定版本。

安裝

安裝 Hadoop 叢集通常涉及在叢集中的所有機器上解壓縮軟體,或透過包裝系統安裝,視您的作業系統而定。將硬體區分為不同的功能非常重要。

叢集中的其中一台機器通常指定為 NameNode,另一台機器則專門指定為 ResourceManager。這些是主控端。其他服務(例如 Web App Proxy Server 和 MapReduce Job History Server)通常會在專用硬體或共用基礎架構上執行,具體取決於負載。

叢集中的其他機器則同時作為 DataNode 和 NodeManager。這些是工作端。

在非安全模式下設定 Hadoop

Hadoop 的 Java 設定是由兩種重要設定檔驅動的

  • 唯讀預設設定 - core-default.xmlhdfs-default.xmlyarn-default.xmlmapred-default.xml

  • 特定於網站的設定 - etc/hadoop/core-site.xmletc/hadoop/hdfs-site.xmletc/hadoop/yarn-site.xmletc/hadoop/mapred-site.xml

此外,您可以透過 etc/hadoop/hadoop-env.shetc/hadoop/yarn-env.sh 設定特定於網站的值,來控制發行版的 bin/ 目錄中找到的 Hadoop 腳本。

若要設定 Hadoop 叢集,您需要設定 Hadoop 守護程式執行的 環境,以及 Hadoop 守護程式的 設定參數

HDFS 守護程式是 NameNode、SecondaryNameNode 和 DataNode。YARN 守護程式是 ResourceManager、NodeManager 和 WebAppProxy。如果要使用 MapReduce,則 MapReduce Job History Server 也會執行。對於大型安裝,這些通常會在不同的主機上執行。

設定 Hadoop 守護程式的環境

管理員應使用 etc/hadoop/hadoop-env.sh,以及(選擇性)etc/hadoop/mapred-env.shetc/hadoop/yarn-env.sh 腳本,來針對特定網站自訂 Hadoop 守護程式的處理程序環境。

至少,您必須指定 JAVA_HOME,以便在每個遠端節點上正確定義它。

管理員可以使用下表中所示的設定選項來設定個別守護程式

守護程式 環境變數
NameNode HDFS_NAMENODE_OPTS
DataNode HDFS_DATANODE_OPTS
Secondary NameNode HDFS_SECONDARYNAMENODE_OPTS
ResourceManager YARN_RESOURCEMANAGER_OPTS
NodeManager YARN_NODEMANAGER_OPTS
WebAppProxy YARN_PROXYSERVER_OPTS
Map Reduce Job History Server MAPRED_HISTORYSERVER_OPTS

例如,若要設定 Namenode 使用 parallelGC 和 4GB Java Heap,應在 hadoop-env.sh 中加入下列陳述式

  export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx4g"

請參閱 etc/hadoop/hadoop-env.sh 以取得其他範例。

您可以自訂的其他有用設定參數包括

  • HADOOP_PID_DIR - 儲存守護程式處理序 ID 檔案的目錄。
  • HADOOP_LOG_DIR - 儲存守護程式日誌檔案的目錄。如果日誌檔案不存在,將自動建立。
  • HADOOP_HEAPSIZE_MAX - Java heapsize 可使用的最大記憶體量。JVM 支援的單位在此也受支援。如果沒有單位,將假設數字以 MB 為單位。預設情況下,Hadoop 會讓 JVM 決定要使用多少。可以使用上面列出的適當 _OPTS 變數,針對每個守護程式覆寫此值。例如,設定 HADOOP_HEAPSIZE_MAX=1gHADOOP_NAMENODE_OPTS="-Xmx5g" 將設定 NameNode 為 5GB heap。

在大部分情況下,您應該指定 HADOOP_PID_DIRHADOOP_LOG_DIR 目錄,讓只有要執行 hadoop 守護程式的使用者可以寫入。否則,可能會發生符號連結攻擊。

在系統範圍的 shell 環境設定中設定 HADOOP_HOME 也是傳統做法。例如,/etc/profile.d 中的簡單指令碼

  HADOOP_HOME=/path/to/hadoop
  export HADOOP_HOME

設定 Hadoop 守護程式

此區段處理在給定的設定檔中要指定的重點參數

  • etc/hadoop/core-site.xml
參數 備註
fs.defaultFS NameNode URI 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 清單。 如果需要,請使用這些檔案來控制允許的資料節點清單。
dfs.blocksize 268435456 大型檔案系統的 HDFS 區塊大小為 256MB。
dfs.namenode.handler.count 100 更多 NameNode 伺服器執行緒可處理來自大量資料節點的 RPC。
  • 資料節點設定
參數 備註
dfs.datanode.data.dir DataNode 本機檔案系統中路徑的逗號分隔清單,用於儲存其區塊。 如果這是目錄的逗號分隔清單,則資料將儲存在所有命名目錄中,通常在不同的裝置上。
  • etc/hadoop/yarn-site.xml

  • ResourceManager 和 NodeManager 設定

參數 備註
yarn.acl.enable true / false 啟用 ACL 嗎?預設為 false
yarn.admin.acl 管理員 ACL 設定叢集管理員的 ACL。ACL 的格式為 逗號分隔使用者空間逗號分隔群組。預設為特殊值 *,表示 任何人。特殊值僅為 空白 表示沒有人有存取權。
yarn.log-aggregation-enable false 啟用或停用記錄彙總的設定
  • ResourceManager 設定
參數 備註
yarn.resourcemanager.address ResourceManager 主機:埠,供用戶端提交作業。 主機:埠 如果設定,則會覆寫 yarn.resourcemanager.hostname 中設定的主機名稱。
yarn.resourcemanager.scheduler.address ResourceManager 主機:埠,供 ApplicationMasters 與排程器溝通以取得資源。 主機:埠 如果設定,則會覆寫 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 網頁使用者介面主機:埠。 主機:埠 如果設定,則會覆寫 yarn.resourcemanager.hostname 中設定的主機名稱。
yarn.resourcemanager.hostname ResourceManager 主機。 主機 單一主機名稱,可設定在設定所有 yarn.resourcemanager*address 資源時取代這些資源。會產生 ResourceManager 組件的預設埠。
yarn.resourcemanager.scheduler.class ResourceManager 排程器類別。 CapacityScheduler(建議)、FairScheduler(也建議)或 FifoScheduler。請使用完全限定的類別名稱,例如 org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
yarn.scheduler.minimum-allocation-mb Resource Manager 中分配給每個容器要求的最小記憶體限制。 以 MB 為單位
yarn.scheduler.maximum-allocation-mb Resource Manager 中分配給每個容器要求的最大記憶體限制。 以 MB 為單位
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path 允許/排除的 NodeManagers 清單。 如果需要,請使用這些檔案來控制允許的 NodeManager 清單。
  • NodeManager 的組態
參數 備註
yarn.nodemanager.resource.memory-mb 給定 NodeManager 的資源,即可用實體記憶體(以 MB 為單位) 定義 NodeManager 上可用的總資源,以提供給正在執行的容器
yarn.nodemanager.vmem-pmem-ratio 任務虛擬記憶體使用量可以超過實體記憶體的最大比率 每個任務的虛擬記憶體使用量可以超過其實體記憶體限制,比率為此值。NodeManager 上任務使用的虛擬記憶體總量可以超過其實體記憶體使用量,比率為此值。
yarn.nodemanager.local-dirs 以逗號分隔的本地檔案系統路徑清單,用於寫入中間資料。 多個路徑有助於分散磁碟 I/O。
yarn.nodemanager.log-dirs 以逗號分隔的本地檔案系統路徑清單,用於寫入記錄。 多個路徑有助於分散磁碟 I/O。
yarn.nodemanager.log.retain-seconds 10800 NodeManager 上保留記錄檔的預設時間(以秒為單位),僅在停用記錄彙總時適用。
yarn.nodemanager.remote-app-log-dir /logs 應用程式完成時,應用程式記錄會移至該 HDFS 目錄。需要設定適當的權限。僅在啟用記錄彙總時適用。
yarn.nodemanager.remote-app-log-dir-suffix logs 附加到遠端記錄目錄的字尾。記錄會彙總到 ${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam},僅在啟用記錄彙總時適用。
yarn.nodemanager.aux-services mapreduce_shuffle 需要為 Map Reduce 應用程式設定的 Shuffle 服務。
yarn.nodemanager.env-whitelist NodeManager 繼承給容器的環境屬性 對於 MapReduce 應用程式,除了預設值之外,還應該新增 HADOOP_MAPRED_HOME。屬性值應該是 JAVA_HOME、HADOOP_COMMON_HOME、HADOOP_HDFS_HOME、HADOOP_CONF_DIR、CLASSPATH_PREPEND_DISTCACHE、HADOOP_YARN_HOME、HADOOP_HOME、PATH、LANG、TZ、HADOOP_MAPRED_HOME
  • 歷史伺服器的組態(需要移到其他地方)
參數 備註
yarn.log-aggregation.retain-seconds -1 在刪除彙總記錄之前保留記錄的時間長度。-1 表示停用。小心,如果設定得太小,您會對名稱節點發送垃圾郵件。
yarn.log-aggregation.retain-check-interval-seconds -1 檢查彙總記錄保留時間之間的時間。如果設定為 0 或負值,則值會計算為彙總記錄保留時間的十分之一。小心,如果設定得太小,您會對名稱節點發送垃圾郵件。
  • etc/hadoop/mapred-site.xml

  • MapReduce 應用程式的組態

參數 備註
mapreduce.framework.name yarn 執行架構設定為 Hadoop YARN。
mapreduce.map.memory.mb 1536 較大的資源限制,適用於映射。
mapreduce.map.java.opts -Xmx1024M 較大的堆積大小,適用於映射的子 JVM。
mapreduce.reduce.memory.mb 3072 較大的資源限制,適用於減少。
mapreduce.reduce.java.opts -Xmx2560M 較大的堆積大小,適用於減少的子 JVM。
mapreduce.task.io.sort.mb 512 在排序資料以提升效率時,較高的記憶體限制。
mapreduce.task.io.sort.factor 100 在排序檔案時,一次合併更多串流。
mapreduce.reduce.shuffle.parallelcopies 50 由減少執行的平行拷貝數量較高,以從大量映射中擷取輸出。
  • MapReduce JobHistory Server 的組態
參數 備註
mapreduce.jobhistory.address MapReduce JobHistory Server 主機:埠 預設埠為 10020。
mapreduce.jobhistory.webapp.address MapReduce JobHistory Server 網頁使用者介面 主機:埠 預設埠為 19888。
mapreduce.jobhistory.intermediate-done-dir /mr-history/tmp MapReduce 工作會將歷程記錄檔案寫入的目錄。
mapreduce.jobhistory.done-dir /mr-history/done MR JobHistory Server 會管理歷程記錄檔案的目錄。

監控 NodeManager 的健康狀態

Hadoop 提供一種機制,管理員可藉此組態 NodeManager,以定期執行管理員提供的指令碼,以判斷節點是否正常。

管理員可以在指令碼中執行任何檢查,以判斷節點是否處於正常狀態。如果指令碼偵測到節點處於不正常狀態,則必須列印一行至標準輸出,開頭為字串 ERROR。NodeManager 會定期產生指令碼並檢查其輸出。如果指令碼的輸出包含上文所述的字串 ERROR,則節點狀態會回報為 不正常,且 ResourceManager 會將節點列入黑名單。不會再將任何工作指派給此節點。不過,NodeManager 會繼續執行指令碼,因此如果節點再次恢復正常,它會自動從 ResourceManager 的黑名單節點中移除。節點的健康狀態以及指令碼的輸出(如果節點不正常)會在 ResourceManager 網頁介面中提供給管理員。節點自上次正常以來的時間也會顯示在網頁介面中。

下列參數可用於控制 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),並在根據設定的 config 屬性 yarn.nodemanager.disk-health-checker.min-healthy-disks 達到損毀目錄數量的閾值後,標記整個節點為不健康,並將此資訊也傳送給資源管理員。開機磁碟已建立 RAID 或開機磁碟故障已由健康檢查器腳本識別。

Slaves 檔案

etc/hadoop/workers 檔案中列出所有工作者主機名稱或 IP 位址,每行一個。輔助腳本(如下所述)將使用 etc/hadoop/workers 檔案一次在多個主機上執行指令。它不用於任何基於 Java 的 Hadoop 設定。為了使用此功能,必須為用於執行 Hadoop 的帳戶建立 ssh 信任(透過無密碼短語 ssh 或其他方式,例如 Kerberos)。

Hadoop 機架感知

許多 Hadoop 元件具有機架感知,並利用網路拓撲結構來提升效能和安全性。Hadoop 惡魔程式會透過呼叫管理員設定的模組取得叢集中的工作者機架資訊。請參閱 機架感知 文件以取得更詳細的資訊。

強烈建議在啟動 HDFS 之前設定機架感知。

記錄

Hadoop 使用 Apache log4j 透過 Apache Commons Logging 架構進行記錄。編輯 etc/hadoop/log4j.properties 檔案以自訂 Hadoop 惡魔程式的記錄設定(記錄格式等)。

操作 Hadoop 叢集

完成所有必要的設定後,將檔案分發到所有機器上的 HADOOP_CONF_DIR 目錄。這應為所有機器上的相同目錄。

一般而言,建議 HDFS 和 YARN 以不同的使用者身分執行。在大部分的安裝中,HDFS 程序會以「hdfs」身分執行。YARN 通常會使用「yarn」帳戶。

Hadoop 啟動

若要啟動 Hadoop 叢集,您需要同時啟動 HDFS 和 YARN 叢集。

您第一次啟動 HDFS 時,必須格式化它。將新的分散式檔案系統格式化為 hdfs

[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format

在指定節點上以 hdfs 身分使用下列指令啟動 HDFS NameNode

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode

在每個指定節點上以 hdfs 身分使用下列指令啟動 HDFS DataNode

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode

如果已設定 etc/hadoop/workers 和 ssh 信任存取(請參閱 單一節點設定),可以使用一個公用程式指令碼啟動所有 HDFS 程序。以 hdfs 身分

[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh

yarn 身分在指定的 ResourceManager 上執行下列指令啟動 YARN

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager

yarn 身分執行指令碼在每個指定主機上啟動 NodeManager

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager

啟動獨立的 WebAppProxy 伺服器。以 yarn 身分在 WebAppProxy 伺服器上執行。如果使用多個伺服器進行負載平衡,則應在每個伺服器上執行

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver

如果已設定 etc/hadoop/workers 和 ssh 信任存取(請參閱 單一節點設定),可以使用一個公用程式指令碼啟動所有 YARN 程序。以 yarn 身分

[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh

mapred 身分在指定伺服器上執行下列指令啟動 MapReduce JobHistory Server

[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver

Hadoop 關閉

hdfs 身分在指定的 NameNode 上執行下列指令停止 NameNode

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode

hdfs 身分執行指令碼停止 DataNode

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode

如果已設定 etc/hadoop/workers 和 ssh 信任存取(請參閱 單一節點設定),可以使用一個公用程式指令碼停止所有 HDFS 程序。以 hdfs 身分

[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh

yarn 身分在指定的 ResourceManager 上執行下列指令停止 ResourceManager

[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager

yarn 身分執行指令碼在工作站上停止 NodeManager

[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager

如果已設定 etc/hadoop/workers 和 ssh 信任存取(請參閱 單一節點設定),可以使用一個公用程式指令碼停止所有 YARN 程序。以 yarn 身分

[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh

停止 WebAppProxy 伺服器。以 yarn 身分在 WebAppProxy 伺服器上執行。如果使用多個伺服器進行負載平衡,則應在每個伺服器上執行

[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver

mapred 身分在指定伺服器上執行下列指令停止 MapReduce JobHistory Server

[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver

Web 介面

Hadoop 群集啟動並執行後,請按照以下說明查看元件的 Web UI

守護程式 Web 介面 備註
NameNode http://nn_host:port/ 預設 HTTP 埠為 9870。
ResourceManager http://rm_host:port/ 預設 HTTP 埠為 8088。
MapReduce JobHistory Server http://jhs_host:port/ 預設 HTTP 埠為 19888。