一、概述
HDFS集羣主要由NameNode和DataNodes組成,前者負責管理文件系統元數據,後者用於保存真正的數據。
主要特性:
1. 可使用商品級硬件(如普通PC)進行分佈式存儲和分佈式計算。高容錯、可擴展、易伸縮。
2. 可根據不同的需求進行不同的配置。
3. Hadoop使用Java編寫,支持各主流平臺。
4. 支持使用類似shell命令與HDFS進行交互。
5. NameNode和DataNodes集成在了web服務器中,可方便使用web查看集羣狀態。
6. 其他特性:文件權限驗證、機架感知、安全模式、fsck等等。
以下筆記由hadoop 2.7.2文檔而來。
二、Web界面
默認的配置中,NameNode可通過http://namenode-name:50070/來訪問(其中的namenode-name是你自己配置的namenode主機名)。使用Web界面可以查看集羣狀態、瀏覽文件系統、查看DataNodes等。
三、Hadoop集羣安裝
略,請參考文檔,或自行百度。
四、非安全模式下的Hadoop配置
1. 配置文件主要有兩種:
- 只讀的默認配置 ——
- 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
2. 控制Hadoop腳本行爲:
- etc/hadoop/hadoop-env.sh
- etc/hadoop/yarn-env.sh
- etc/hadoop/mapred-env.sh
3. Hadoop後臺進程:
- Hadoop後臺進程一般各自運行在獨立的主機上
- HDFS後臺進程
- NameNode, SecondaryNameNode, DataNode
- YARN後臺進程
- ResourceManager, NodeManager, WebAppProxy
- MapReduce後臺進程(若有)
- Job History Server
4. Hadoop後臺進程環境配置:
Hadoop進程的環境變量在以下3個腳本中設置
- etc/hadoop/hadoop-env.sh
- etc/hadoop/yarn-env.sh
- etc/hadoop/mapred-env.sh
各後臺進程的環境變量如下:
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 |
MapReduce Job History Server | HADOOP_JOB_HISTORYSERVER_OPTS |
比如,對NameNode的設置可以如下:
export HADOOP_NAMENODE_OPTS=”-Xmx30720m -XX:+UseParallelGC -Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS}”
5. Hadoop後臺進程配置:
- etc/hadoop/core-site.xml
Parameter | Value | Notes |
---|---|---|
fs.defaultFS | NameNode URI | hdfs://主機名:端口/ |
io.file.buffer.size | 131072 | 序列化文件的讀/寫緩存大小 |
etc/hadoop/hdfs-site.xml
NameNode的配置
Parameter | Value | Notes |
---|---|---|
dfs.namenode.name.dir | 本地文件系統上,NameNode保存命名空間和處理日誌的路徑 | 如果值指定爲用逗號分隔的目錄列表,命名錶會複製到所有目錄下做一個冗餘。 |
dfs.hosts /dfs.hosts.exclude | 許可/拒絕的DataNodes列表 | 如果有需要的話,可以使用該屬性來指定哪些DataNodes可用/不可用。 |
dfs.blocksize | 268435456 | 大型文件系統可指定HDFS的塊大小爲256MB |
dfs.namenode.handler.count | 100 | 指定有多少NameNode server線程來處理來自大量DataNodes的RPCs(遠程過程調用) |
DataNode的配置
Parameter | Value | Notes |
---|---|---|
dfs.datanode.data.dir | 一個DataNode將其數據塊保存在本地文件系統上的指定路徑中,多個路徑使用逗號分隔 | 如果路徑有多個,那麼數據會保存在所有的目錄下。一般而言,多個路徑位於不同的device下。 |
- etc/hadoop/yarn-site.xml
ResourceManager和NodeManager共有的配置
Parameter | Value | Notes |
---|---|---|
yarn.acl.enable | true/false | 是否開啓ACLs,默認關閉 |
yarn.admin.acl | Admin ACL | ACL可設置集羣的管理員。 ACLs是用逗號分隔的用戶空間和用戶組。默認值爲* 表示任何人可以訪問。空白表示無人可訪問。 |
yarn.log-aggregation-enable | false | 設置是否允許日誌聚集 |
ResourceManager的配置
Parameter | Value | Notes |
---|---|---|
yarn.resourcemanager.address | ResourceManager 主機名:端口號。用戶向這裏提交作業。 | 如果設置了主機名:端口號,會覆蓋在 yarn.resourcemanager.hostname中設置的主機名 |
yarn.resourcemanager.scheduler.address | ResourceManager host:port ApplicationMasters向這裏發出資源申請。 | 如果設置了主機名:端口號, 會覆蓋在 yarn.resourcemanager.hostnamez中設置的主機名 |
yarn.resourcemanager.resource-tracker.address | ResourceManager host:port 供NodeManager使用 | 如果設置了主機名:端口號, 會覆蓋在 yarn.resourcemanager.hostnamez中設置的主機名 |
yarn.resourcemanager.admin.address | ResourceManager host:port 供管理命令使用 | 如果設置了主機名:端口號, 會覆蓋在 yarn.resourcemanager.hostnamez中設置的主機名 |
yarn.resourcemanager.webapp.address | ResourceManager web界面 host:port. | 如果設置了主機名:端口號, 會覆蓋在 yarn.resourcemanager.hostnamez中設置的主機名 |
yarn.resourcemanager.hostname | ResourceManager 主機. | 單獨的主機名可以在所有yarn.resourcemanager*address 中設置。端口號是默認的。 |
yarn.resourcemanager.scheduler.class | ResourceManager Scheduler class. | CapacityScheduler (推薦), FairScheduler (推薦), or FifoScheduler |
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 | 許可/拒絕的NodeManager列表 | If necessary, use these files to control the list of allowable NodeManagers. |
NodeManager的配置
Parameter | Value | Notes |
---|---|---|
yarn.nodemanager.resource.memory-mb | NodeManager可用的屋裏內存 | Defines total available resources on the NodeManager to be made available to running containers |
yarn.nodemanager.vmem-pmem-ratio | 任務使用的虛擬內存可超出物理內存的最大比率 | 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 | 中間結果寫入的本地文件系統路徑列表,用逗號隔開 | Multiple paths help spread disk i/o. |
yarn.nodemanager.log-dirs | 日誌寫入的本地文件系統路徑列表,用逗號隔開 | Multiple paths help spread disk i/o. |
yarn.nodemanager.log.retain-seconds | 10800 | NodeManager保存日誌文件的默認時長(單位爲秒),僅適用於log-aggregation被關閉時。 |
yarn.nodemanager.remote-app-log-dir | /logs | 應用程序結束後,程序日誌移動到HDFS 上的相應目錄。需要設置轉移許可權限。僅適用於log-aggregation開啓時。 |
yarn.nodemanager.remote-app-log-dir-suffix | logs | 遠程日誌目錄後綴。日誌將被收集到${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}。僅適用於log-aggregation開啓時 |
yarn.nodemanager.aux-services | mapreduce_shuffle | MapReduce程序所需的Shuffle 服務 |
History Server的配置
Parameter | Value | Notes |
---|---|---|
yarn.log-aggregation.retain-seconds | -1 | 收集到的日誌保存多久。 -1 表示不保存。注意,如果該屬性值設置的太小,name node可能會收到垃圾信息。 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 聚集日誌保存時間檢查間隔。如果設爲0或負值,值被解釋成聚集日誌保存時間的1/10。注意,如果該屬性值設置的太小,name node可能會收到垃圾信息。 |
- etc/hadoop/mapred-site.xml
MapReduce Applications的配置
Parameter | Value | Notes |
---|---|---|
mapreduce.framework.name | yarn | 管理框架設爲 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 | 更大的數值有利於數據的高效排序 |
mapreduce.task.io.sort.factor | 100 | 排序時,每次將合併更多的流 |
mapreduce.reduce.shuffle.parallelcopies | 50 | map輸出數據量較大時,該屬性可使reduce在抓取map結果時並行更多的拷貝 |
MapReduce JobHistory的配置
Parameter | Value | Notes |
---|---|---|
mapreduce.jobhistory.address | MapReduce JobHistory Server host:port | Default port is 10020. |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server Web UIhost:port | Default port is 19888. |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | MapReduce作業將history文件寫入配置的目錄中 |
mapreduce.jobhistory.done-dir | /mr-history/done | MR JobHistory Server管理history文件的目錄 |
五、NodeManagers狀態監控
管理員可以提供一個腳本讓NodeManager定期運行,檢測節點的狀態。如果腳本檢測出一個節點處於不健康狀態,必須向標準輸出打印一行以”ERROR”開頭的信息。NodeManager定期運行腳本並檢查腳本輸出。如果腳本的輸出包含字符串”ERROR”,將報告節點爲不健康狀態,並且ResourceManager會將該節點加入黑名單。以後的任務將不會在該幾點上運行。不過,如果在NodeManager之後的檢測中發現改節點又恢復健康狀態,則該節點又會從黑名單刪除。
節點狀態監控腳本的控制參數在etc/hadoop/yarn-site.xml中:
Parameter | Value | Notes |
---|---|---|
yarn.nodemanager.health-checker.script.path | 腳本路徑 | Script to check for node’s health status. |
yarn.nodemanager.health-checker.script.opts | 腳本參數 | Options for script to check for node’s health status. |
yarn.nodemanager.health-checker.script.interval-ms | 腳本運行間隔 | Time interval for running health script. |
yarn.nodemanager.health-checker.script.timeout-ms | 腳本超時時間 | Timeout for health script execution. |
如果僅僅是因爲磁盤出問題,監控腳本不應該打印”ERROR”。NodeManager具備定期檢測本地磁盤健康狀態的能力(特別是檢測nodemanager-local-dirs和nodemanager-log-dirs),一旦不健康的目錄數量達到屬性yarn.nodemanager.disk-health-checker.min-healthy-disks設定的閾值,整個節點就被標記爲不健康,並報告給ResourceManager。引導盤要麼做raid,要麼也納入腳本監控。
六、slaves文件
etc/hadoop/slaves文件中列出了所有從節點的主機名或IP地址,每行一個。helper腳本會使用etc/hadoop/slaves文件同時在多臺主機上運行命令。這個功能的前提是配置了ssh信任關係(通過ssh免密碼登錄或其他方式,比如Kerberos認證)。
七、機架感知
許多Hadoop組件都使用了機架感知,並且利用網絡拓撲來獲得性能和安全性的平衡。Hadoop守護進程通過調用管理員配置的模塊來獲取集羣上從節點的機架信息。詳情請參見 Rack Awareness。
強烈建議啓動HDFS之前,先配置好機架感知。
八、日誌
Hadoop使用 Apache log4j 來記錄日誌。可通過 etc/hadoop/log4j.properties 文件來定義Hadoop守護進程的日誌配置。