當前位置:
首頁 > 知識 > 構建 Hadoop 集群

構建 Hadoop 集群

構建 Hadoop 集群

-----------------------------------------------------------------------------------------------------------------------------------------

安裝選項:

1. Apache tarballs :The Apache Hadoop project and related projects provide binary (and source) tarballs for each release.

2. Packages :RPM and Debian packages are available from the Apache Bigtop project http://bigtop.apache.org/

3. Hadoop cluster management tools :Cloudera Manager and Apache Ambari are examples of dedicated tools for installing and

managing a Hadoop cluster over its whole lifecycle. They provide a simple web UI,

and are the recommended way to set up a Hadoop cluster for most users and operators.

1 集群規範 (Cluster Specification)

-----------------------------------------------------------------------------------------------------------------------------------------

硬體:

-------------------------------------------------------------------------------------------------------------------------------------

a typical choice of machine for running an HDFS datanode and a YARN node manager in 2014 would have had the following specifications:

處理器: Two hex/octo-core 3 GHz CPUs

內存: 64?512 GB ECC RAM[68]

存儲器: 12?24 × 1?4 TB SATA disks

網路: Gigabit Ethernet with link aggregation

Hadoop 一般使用多核 CPU 和多磁碟,以充分利用硬體的強大功能。

Master node scenarios

------------------------------------------------------------------------------------------------------------------------------------

根據集群的大小,運行 master daemon 由很多不同的配置:the namenode, secondary namenode, resource manager, and history server

For a small cluster (on the order of 10 nodes), it is usually acceptable to run the namenode and the resource manager on

a single master machine (as long as at least one copy of the namenode』s metadata is stored on a remote filesystem).

namenode 對內存要求較高,因為它要在內存中保持整個名稱空間文件和塊的元數據信息。

網路拓撲 (Network Topology)

------------------------------------------------------------------------------------------------------------------------------------

A common Hadoop cluster architecture consists of a two-level network topology 。

每個機架有 30-40 台伺服器,內部用一台 10GB 交換機,向上連接一台核心交換機或路由器(至少10GB,或更大帶寬),使機架間互聯。該架構的突出

特點是同一機架內部的節點之間的總帶寬要遠高於不同機架上節點間的帶寬。

機架注意事項 (Rack awareness)

--------------------------------------------------------------------------------------------------------------------------------------

為了獲得 Hadoop 最佳性能,配置 Hadoop 以讓其了解網路拓撲狀況極為重要。如果集群只有一個機架,就無須做什麼,因為這是默認配置。然而,對於

多機架集群,需要將節點映射到機架。這允許 Hadoop 在節點上部署 MapReduce 任務時更優先選擇機架內(within-rack) 傳輸(擁有更多的可用帶寬)而非

跨機架(off-rack)傳輸。 HDFS 也能夠更智能地部署塊複本以達到性能和彈性的平衡。

網路位置例如節點和機架表現在一棵樹中,從而反映出位置間的網路距離(network distance)。namenode 使用網路位置確定複本的放置位置,MapReduce

調度器使用網路位置確定其 map 任務輸入的最近複本。

示例:對於網路,機架拓撲描述為兩個網路位置 ———— /switch1/rack1 和 /switch1/rack2. 因為集群中只有一個頂級的(top-level) 交換機,位置可以

簡化為 /rack1 和 /rack2.

Hadoop 配置必須指定節點地址和網路位置的一個映射。這個映射由一個 Java 介面描述, DNSToSwitchMapping:

public interface DNSToSwitchMapping {

public List<String> resolve(List<String> names);

}

names 參數是一個 IP 地址列表,返回值是一個對應的網路位置字元串列表。

net.topology.node.switch.mapping.impl

配置屬性定義了 一個 DNSToSwitchMapping 介面實現, namenode 和 resource manager 用於解析工作節點(worker node)的網路位置。

對於本例的網路,我們將 node1, node2, and node3 映射到 /rack1, 以及將 node4, node5, and node6 映射到 /rack2.

大多數安裝不需要自己實現介面,然而,因為默認實現是 ScriptBasedMapping, 即運行一個用戶定義的腳本來確定映射,腳本位置由屬性:

net.topology.script.file.name

控制。腳本必須接受可變數量的參數,要映射的主機名或 IP 地址,並且必須將對應的網路位置發送到標準輸出,空格分隔。

如果沒有指定腳本位置,默認是將所有節點映射為一個網路位置,稱為 /default-rack

2 集群的構建和安裝 (Cluster Setup and Installation)

-----------------------------------------------------------------------------------------------------------------------------------------

1. Installing Java: Java 7 或更高版本

-------------------------------------------------------------------------------------------------------------------------------------

2. Creating Unix User Accounts :

-------------------------------------------------------------------------------------------------------------------------------------

It』s good practice to create dedicated Unix user accounts to separate the Hadoop processes from each other, and from other services

running on the same machine. The HDFS, MapReduce, and YARN services are usually run as separate users, named hdfs, mapred, and yarn,

respectively. They all belong to the same hadoop group.

最佳實踐是在同一台機器上,為 Hadoop 進程分別創建專用的 Unix 用戶帳戶,並與其他服務分開。 HDFS, MapReduce, 以及 YARN 通常作為不同的用戶

運行,用戶名分別為 hdfs, mapred, and yarn. 他們同屬於一個 hadoop 用戶組。

3. 安裝 Hadoop (Installing Hadoop)

-------------------------------------------------------------------------------------------------------------------------------------

% cd /usr/local

% sudo tar xzf hadoop-x.y.z.tar.gz

同樣,需要改變 Hadoop 文件的用戶名和組:

% sudo chown -R hadoop:hadoop hadoop-x.y.z

It』s convenient to put the Hadoop binaries on the shell path too:

% export HADOOP_HOME=/usr/local/hadoop-x.y.z

% export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

4. 配置 SSH (Configuring SSH)

-------------------------------------------------------------------------------------------------------------------------------------

Hadoop 的控制腳本(but not the daemons) 依靠 SSH 執行整體集群(cluster-wide)的操作。例如,停止和啟動集群上所有 daemon 的腳本。注意,控制

腳本是可選的,整體集群的操作也可以通過其他機制執行,例如一個分散式腳本或專用的 Hadoop 管理應用程序。

為了無間斷工作,SSH 要設置為允許 hdfs 和 yarn 用戶從集群任何機器上無密碼登錄。實現這個任務最簡單的方法是生成一個 public/private 密鑰對

並把它們放到一個 NFS 位置以在整個集群上共享。

首先,通過如下指令生成一個 RSA key 對。需要做兩次,一次作為 hdfs 用戶,一次作為 yarn 用戶。

% ssh-keygen -t rsa -f ~/.ssh/id_rsa

縱然想要無密碼登錄,沒有密碼的密鑰不認為是個好的實踐,因此當提示時,應輸入一個密碼。使用 ssh-agent 來避免為每一個連接輸入密碼。

下一步,需要確保 public key 存在於集群上所有要連接機器的 ~/.ssh/authorized_keys 文件中。如果用戶的主目錄存儲在一個 NFS 系統上,

密鑰可以通過輸入如下指令跨集群共享 (first as hdfs and then as yarn):

% cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

如果用戶主目錄沒有使用 NFS 共享,則 public key 需要通過其他方法共享,例如, ssh-copy-id 。

Test that you can SSH from the master to a worker machine by making sure ssh-agent is running, and then run ssh-add to store your

passphrase. You should be able to SSH to a worker without entering the passphrase again.

5. Configuring Hadoop

-------------------------------------------------------------------------------------------------------------------------------------

6. 格式化 HDFS 文件系統 ( Formatting the HDFS Filesystem )

-------------------------------------------------------------------------------------------------------------------------------------

在能夠使用之前,一個嶄新的 HDFS 安裝需要被格式化。格式化過程通過創建存儲目錄(storage directories) 和名稱節點(namenode) 的持久化數據

結構的初始化版本來創建一個空的文件系統。datanode 不包含在初始格式化過程中,因為 namenode 管理著所有文件系統元數據,而 datanode 可以

動態加入集群或從集群中移除。由於相同的原因,不需要說明創建多大的文件系統,因為這是由集群內 datanode 的數量決定的,可以在文件系統格式化

之後按需增加。

格式化操作非常快,運行下面命令:Run the following command as the hdfs user:

% hdfs namenode -format <cluster_name>

7. 啟動和停止 Daemons

-------------------------------------------------------------------------------------------------------------------------------------

Hadoop 自帶了一些腳本用於運行命令以及啟動和停止整個集群的 daemon 。使用這些腳本(可以在安裝目錄的 sbin 內找到),需要告知 Hadoop 有哪些

機器在集群中。有一個文件用於此目的,稱為 slaves, 包含一個機器的主機名或 IP 地址列表,每行一個。

slaves 文件列出 datanodes 和 node managers 運行在其上的機器。它存在於 Hadoop 的配置目錄,但它可以放置到其他地方或給出另外的名稱,通過

在 hadoop-env.sh 文件中改變 HADOOP_SLAVES 設置值。另外,這文件不需要分發給工作節點(to be distributed to worker nodes), 因為它們僅僅由

運行在 namenode 或 resource manager 的控制腳本使用。

The HDFS daemons are started by running the following command as the hdfs user:

% start-dfs.sh

namenode 和 secondary namenode 運行的機器通過查詢 Hadoop 配置屬性的主機名確定。例如,腳本通過執行如下指令,找到 namenode 的主機名:

% hdfs getconf -namenodes

默認情況下,指令從 fs.defaultFS 屬性找到 namenode 的主機名稱。

稍微相信一些, start-dfs.sh 腳本做如下這些事:

------------------------------------------------------------------------------------------------------------

① Starts a namenode on each machine returned by executing hdfs getconf -namenodes

② Starts a datanode on each machine listed in the slaves file

③ Starts a secondary namenode on each machine returned by executing hdfs getconf -secondarynamenodes

YARN daemons 以類似的方式啟動,yarn 用戶在 resource manager 機器上運行如下命令啟動:

% start-yarn.sh

resource manager 總是運行在 startyarn.sh 腳本運行的機器上。更明確地,腳本執行下列過程:

------------------------------------------------------------------------------------------------------------

① Starts a resource manager on the local machine

② Starts a node manager on each machine listed in the slaves file

也提供了 stop-dfs.sh 和 stop-yarn.sh 腳本來停止由相應啟動腳本啟動的守護進程。

% stop-yarn.sh

% stop-dfs.sh

這些腳本啟動和停止 Hadoop daemons 使用的是 hadoop-daemon.sh 腳本(或者是 yarn-daemon.sh,YARN 情形)。如果使用前述腳本,不應直接使用

hadoop-daemon.sh 腳本。但如果需要從另一個系統或從自己腳本控制 Hadoop daemon, hadoop-daemon.sh 腳本是一個好的結合點。同樣,在一組機

器上啟動相同的守護進程,hadoop-daemons.sh (with an 「s」) 是一個方便的工具。

最後,只有一個 MapReduce 守護進程 ———— job history server, 以 mapred 用戶通過如下命令啟動:

% mr-jobhistory-daemon.sh start historyserver

8. 創建用戶目錄 (Creating User Directories)

-------------------------------------------------------------------------------------------------------------------------------------

一旦有了一個 Hadoop 集群並處於運行中,需要讓用戶訪問它。這包括為每一個用戶創建主目錄並為之設置所有者許可許可權:

% hadoop fs -mkdir /user/username

% hadoop fs -chown username:username /user/username

這是為目錄設置空間限制的好時機。下面的指令為給定的用戶目錄設置 1 TB 限制:

% hdfs dfsadmin -setSpaceQuota 1t /user/username

3 Hadoop 配置 ( Hadoop Configuration )

-----------------------------------------------------------------------------------------------------------------------------------------

有很多控制 Hadoop 安裝的文件,最重要文件如下表所示:

Hadoop configuration files

+===============================+===================+===================================================================================+

| 文件名 | 格式 | 描述 |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| hadoop-env.sh | Bash script | Environment variables that are used in the scripts to run Hadoop |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| mapred-env.sh | Bash script | Environment variables that are used in the scripts to run MapReduce |

| | |(overrides variables set in hadoop-env.sh) |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| yarn-env.sh | Bash script | Environment variables that are used in the scripts to run YARN (overrides |

| | | variables set in hadoop-env.sh) |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| core-site.xml | Hadoop | Configuration settings for Hadoop Core, such as I/O settings that are common |

| | configuration XML | to HDFS, MapReduce, and YARN |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| hdfs-site.xml | Hadoop | Configuration settings for HDFS daemons: the namenode, the secondary |

| | configuration XML | namenode, and the datanodes |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| mapred-site.xml | Hadoop | Configuration settings for MapReduce daemons: the job history server |

| | configuration XML | |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| yarn-site.xml | Hadoop | Configuration settings for YARN daemons: the resource manager, the web app |

| | configuration XML | proxy server, and the node managers |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| slaves | Plain text | A list of machines (one per line) that each run a datanode and a node manager |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| hadoop-metrics2.properties | Java properties | Properties for controlling how metrics are published in Hadoop |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| log4j.properties | Java properties | Properties for system logfiles, the namenode audit log, and the task log for the |

| | | task JVM process |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

| hadoop-policy.xml | Hadoop | Configuration settings for access control lists when running Hadoop in secure |

| | configuration XML | mode |

+-------------------------------+-------------------+-----------------------------------------------------------------------------------+

這些配置文件在 Hadoop 發布包 etc/hadoop 目錄下。配置文件目錄可以遷移到文件系統其他位置(Hadoop 安裝目錄之外,這樣使得升級更容易些),只要 daemons

啟動的時候帶上 --config 選項(或者,與其等價的,設置 HADOOP_CONF_DIR 環境變數) 指定在本地文件系統上的配置目錄位置。

1. 配置管理 ( Configuration Management )

-------------------------------------------------------------------------------------------------------------------------------------

Hadoop 沒有一個單一的,全局的位置放置配置信息。相反,集群中每一個 Hadoop 節點有它自己的一套配置文件,並且系統管理員確保它們在系統中保

持同步。有些並發 shell 工具可以幫助做這些工作,例如,dsh 或 pdsh。這是 Hadoop 集群管理工具如 Cloudera Manager 和 Apache Ambari 真正

突出的領域,因為它們注重於配置變化跨集群傳播。

Hadoop 設計為可以使用一套配置文件用於所有的 master 和 worker 機器,這種方式最大的好處是簡單,不論是概念上(因為只有一個配置文件要處理)

還是操作上(因為 Hadoop 腳本管理一個單一的配置設置就足夠了)。

但有些集群,這種 one-size-fits-all 的配置模式不適用。例如,如果加入新機器擴展集群,而這些機器與現有機器相比有不同的硬體規範,對這些新

機器需要一個不同的配置來利用它們那些特別的資源。

這種場景下,需要有一類機器的概念(concept of a class of machine), 並為每一個類維護一個單獨的配置。 Hadoop 不為此提供工具,但有幾個優秀的

工具可以精確地處理這種類型的配置管理,例如 Chef, Puppet, CFEngine, 以及 Bcfg2 。

對於任何規模的集群,保持所有的機器同步可能是一個挑戰。考慮當移除一個更新時如果一台機器不可用會發生什麼。誰能確保獲得更新它就能變得可用?

這是個很大的問題並可能導致安裝分歧了,因此,儘管用戶能夠使用控制腳本來管理 Hadoop ,仍然推薦使用控制管理工具管理集群。

使用這些管理工具對日常維護也非常出色,例如為安全漏洞打補丁,升級系統包等。

環境設置 (Environment Settings)

-----------------------------------------------------------------------------------------------------------------------------------

hadoop-env.sh

mapred-env.sh

yarn-env.sh

Note that the MapReduce and YARN files override the values set in hadoop-env.sh

Java :

-------------------------------------------------------------------------------------------------------------------------------

要使用的 Java 實現的位置由 hadoop-env.sh 里的 JAVA_HOME 設置確定,或者,如果 hadoop-env.sh 沒有設置,使用 JAVA_HOME 的 shell 環境變數。

建議在 hadoop-env.sh 內設置,這樣在一個位置定義清晰,並確保整個集群使用同一版本的 Java 。

內存堆大小 (Memory heap size):

-------------------------------------------------------------------------------------------------------------------------------

默認情況下, Hadoop 為各個守護進程(daemon) 分配 1000 MB(1GB)內存。該內存值由 hadoop-env.sh 文件的 HADOOP_HEAPSIZE 變數設置。

也有環境變數可以改變單獨 daemon 的堆大小,例如,可以在 yarn-env.sh 里設置 YARN_RESOURCEMANAGER_HEAPSIZE 為 resource manager 重寫堆大小。

沒有為 HDFS daemon 設置的對應的環境變數,儘管一般會給 namenode 更多的堆空間。設置 namenode 堆大小有另外的方法。

HOW MUCH MEMORY DOES A NAMENODE NEED?

----------------------------------------------------------------------------------------------------------------------------

默認為 1000MB 的 namenode 內存對於幾百萬個文件,一般來說是足夠了,但憑經驗來說,內存大小可以保守地按每百萬個數據塊使用 1000MB

內存來估算。

可以在不改變其他 Hadoop daemon 內存分配的情況下,通過設置 hadoop-env.sh 里的 HADOOP_NAMENODE_OPTS JVM 選項來設置內存大小。

HADOOP_NAMENODE_OPTS 允許向 namenode 的 JVM 傳遞額外的選項。因此,例如,-Xmx2000m 指定2000MB 的內存分配給 namenode 。

如果改變了 namenode 的內存分配,不要忘了為 secondary namenode 做相同的更改 (使用 HADOOP_SECONDARYNAMENODE_OPTS 變數),因為

它的內存需求和 primary namenode 是差不多的。

除了守護進程的內存要求外, node manager 為應用程序分配容器,因此,對於工作機器(worker machine)需要把這部分因素考慮到整個內存佔用空間中去。

系統日誌文件 (System logfiles):

---------------------------------------------------------------------------------------------------------------------------------

默認情況下, Hadoop 生成的系統日誌文件存放在 $HADOOP_HOME/logs 目錄,可以通過 hadoop-env.sh 文件中的 HADOOP_LOG_DIR 設置更改。

修改默認值使日誌文件從 Hadoop 的安裝目錄獨立出來是個好的想法,這樣的話,即使 Hadoop 升級之後安裝路徑發生變化,也會保證日誌文件保持

在一個位置不變。通常選擇 /var/log/hadoop, 在 hadoop-env.sh 文件中包含下面的內容設置:

export HADOOP_LOG_DIR=/var/log/hadoop

如果日誌目錄不存在則會被創建。(如果沒有創建,確認相關的 Unix Hadoop user 是否擁有許可權創建該目錄).每個運行在一台機器上的 Hadoop

daemon 產生兩個日誌文件。

第一個是通過 log4j 輸出的,文件名以 .log 結尾,大多數應用程序日誌會寫到這個日誌文件中,因此是問題診斷的第一入口。

標準的 Hadoop log4j 採用每日滾動文件追加器( a daily rolling file appender )來滾動日誌文件。舊的日誌文件不會被刪除,因此用戶應該

安排定期刪除或存檔,以免本地節點磁碟空間耗盡。

第二個日誌文件是聯合標準輸出(standard output)和標準錯誤日誌(standard error log),這類日誌文件以 .out 結尾,由於 Hadoop 使用 log4j

記錄日誌,通常包含很少或沒有輸出。這類日誌只有在守護進程重新啟動時才輪轉。而且僅保留最後的5個日誌文件,舊的日誌文件由一個 1 至 5 的

數字作為後綴,後綴 5 是最早的文件。

日誌文件名(包括兩種類型)是一個聯合體,由運行守護進程的用戶名(user running the daemon),守護進程名稱(the daemon name),機器的

主機名(the machine hostname) 組成。例如,hadoop-hdfs-datanode-ip-10-45-174-112.log.2014-09-20 是一個輪轉後的日誌文件名稱。

這種命名結構使得在集群內將所有機器上的日誌文件存檔到一個單一的目錄內成為可能,因為文件名是唯一的。

日誌文件名中的 username 部分實際上是 hadoop-env.sh 文件內 HADOOP_IDENT_STRING 設置的默認值,如果為了命名日誌文件希望給 Hadoop 實例一個

不同的標識(identity),修改 HADOOP_IDENT_STRING 的值為一個想要的標識符。

SSH settings

-------------------------------------------------------------------------------------------------------------------------------

使用控制腳本(control scripts) 可以通過 SSH 在 master 節點上運行 worker(遠程)節點上的命令。自定義 SSH 有很多好處,各種理由。例如,

可以降低連接超時,使用 ConnectTimeout 選項。另一個有用的 SSH 設置是 StrictHostKeyChecking, 可以設置為 no 來自動添加新的 host keys

到 known hosts files ,默認是 ask ,提示用戶確認 key fingerprint has been verified, 這在大的集群環境下是不恰當的設置。

要向 SSH 傳遞更多的選項,在 hadoop-env.sh 文件中定義 HADOOP_SSH_OPTS 環境變數。

2. Hadoop 守護進程的重要屬性 (Important Hadoop Daemon Properties)

-----------------------------------------------------------------------------------------------------------------------------------

Hadoop 的配置屬性之多2讓人眼花繚亂。本節討論真實工作集群需要定義的重要屬性(至少理解為何默認屬性值是恰當的)。

這些屬性在 Hadoop site 文件中設置:

core-site.xml

hdfs-site.xml

yarn-site.xml

要查看運行中的 daemon 的實際配置,訪問它的 web server 的 /conf 頁,例如:http://resource-manager-host:8088/conf 顯示運行在此伺服器上的

資源管理器的配置。這個頁面顯示的是 site 和默認配置文件的組合屬性,也顯示了每個屬性是從哪個文件選出來的。

例子:

--------------------------------------------------------------------------------

<?xml version="1.0"?>

<!-- core-site.xml -->

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://namenode/</value>

</property>

</configuration>

---------------------------------------------------------------------------

<?xml version="1.0"?>

<!-- hdfs-site.xml -->

<configuration>

<property>

<name>dfs.namenode.name.dir</name>

<value>/disk1/hdfs/name,/remote/hdfs/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>/disk1/hdfs/data,/disk2/hdfs/data</value>

</property>

<property>

<name>dfs.namenode.checkpoint.dir</name>

<value>/disk1/hdfs/namesecondary,/disk2/hdfs/namesecondary</value>

</property>

</configuration>

----------------------------------------------------------------------------

<?xml version="1.0"?>

<!-- yarn-site.xml -->

<configuration>

<property>

<name>yarn.resourcemanager.hostname</name>

<value>resourcemanager</value>

</property>

<property>

<name>yarn.nodemanager.local-dirs</name>

<value>/disk1/nm-local-dir,/disk2/nm-local-dir</value>

</property>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce.shuffle</value>

</property>

<property>

<name>yarn.nodemanager.resource.memory-mb</name>

<value>16384</value>

</property>

<property>

<name>yarn.nodemanager.resource.cpu-vcores</name>

<value>16</value>

</property>

</configuration>

HDFS

------------------------------------------------------------------------------------------------------------------------------------

運行 HDFS ,需要指定一台機器作為 namenode ,本例中,屬性 fs.defaultFS 是 HDFS 文件系統 URI , 它的主機(host) 是 namenode 的主機名(

hostname) 或 IP 地址,埠是 namenode 將要監聽的RPC埠,如果沒有指定埠,默認使用8020 。

fs.defaultFS 屬性也兼顧指定的默認文件系統。默認文件系統用於解析相對路徑,這很便於使用,可以減少鍵盤輸入(避免硬編碼特定 namenode 的地址

信息), 例如上個例子中,相對 URI /a/b 被解析為 hdfs://namenode/a/b

提示:

--------------------------------------------------------------------------------------------------------------------------------

如果正在運行 HDFS, 在伺服器配置中指定 fs.defaultFS 同時用於指定 HDFS 的 namenode 和默認文件系統的事實意味著 HDFS 必須是默認的文件

系統。然而,出於方便性,在客戶端配置中指定一個不同的文件系統也是可以的。

例如,如果要同時使用 HDFS 和 S3 文件系統,在客戶端配置中可以指定其中一個作為默認文件系統,作為相對 URI 參考的默認值,而另外一個

使用絕對 URI。

還有幾個其他的配置屬性用於設置 HDFS: 這些用於為 namenode 和 datanode 設置存儲目錄。

□ dfs.namenode.name.dir 屬性:

-------------------------------------------------------------------------------------------------------------------------------------

用於指定一個目錄列表,namenode 在這些目錄內存儲持久化文件系統元數據(編輯日誌和文件系統映像 —— filesystem image)。

每個目錄存儲一份元數據文件的拷貝用於冗餘備份。通常配置 dfs.namenode.name.dir 為使 namenode 元數據寫入一個或兩個

本地磁碟和一個遠程磁碟,例如 NFS 掛載的(NFS-mounted)目錄。這樣的設置可以防護本地磁碟故障以及整個 namenode 失效

因為在這兩種狀況下,文件可以恢復並啟動一個新的 namenode 。(secondary namenode 只是定期保存 namenode 的監測點,因此,

它不能提供一個最新的 namenode 的備份)

□ dfs.datanode.data.dir 屬性:

--------------------------------------------------------------------------------------------------------------------------------------

為 datanode 指定一個目錄列表來存儲它的數據塊(to store its blocks in)。不像 namenode, 使用多個目錄提供冗餘備份,

datanode 在它列出的多個存儲目錄中循環地寫入,因此,出於性能考慮應該為每個本地磁碟指定一個存儲目錄。讀性能也能夠從

多個磁碟存儲中獲益,因為數據塊分布到不同的磁碟中,對不同數據塊的並發讀操作會相應地分布到不同的磁碟上,從而提高性能。

提示:

------------------------------------------------------------------------------------------------------------------

為了充分發揮性能,應該使用 noatime 選項掛載磁碟。這個設置意味著在進行文件讀操作時,accessed time 信息不會寫入到文件

中,這會獲得顯著的性能提升。

□ dfs.namenode.checkpoint.dir 屬性:

---------------------------------------------------------------------------------------------------------------------------------------

為 secondary namenode 配置文件系統 checkpoint 的存儲位置,指定一個目錄列表來保存檢查點。類似於 namenode 的存儲目錄,

為 namenode metadata 保存冗餘拷貝,檢查點的文件系統映像(checkpointed filesystem image) 會存儲到每個檢查點目錄,用於

冗餘備份。

注意:

----------------------------------------------------------------------------------------------------------------------------------------

HDFS 的存儲目錄默認都在 Hadoop 的臨時目錄下(由 hadoop.tmp.dir 屬性配置,它的默認值是 /tmp/hadoop-${user.name})。因此,設置這些目錄是極其

重要的,這樣,當系統清除臨時目錄時數據才不會丟失。

Important HDFS daemon properties

+===============================+===================+===============================================+===============================================================+

| 屬性名 | 類型 | 默認值 | 描述 |

+-------------------------------+-------------------+-----------------------------------------------+---------------------------------------------------------------+

| fs.defaultFS | URI | file:/// | The default filesystem. The URI defines the hostname |

| | | | and port that the namenode』s RPC server runs on. The default |

| | | | port is 8020. This property is set in core-site.xml. |

+-------------------------------+-------------------+-----------------------------------------------+---------------------------------------------------------------+

| dfs.namenode.name.dir | Commaseparated | file://${hadoop.tmp.dir}/dfs/name | The list of directories where the namenode stores its |

| | directory names | | persistent metadata. The namenode stores a copy of the |

| | | | metadata in each directory in the list. |

+-------------------------------+-------------------+-----------------------------------------------+---------------------------------------------------------------+

| dfs.datanode.data.dir | Commaseparated | file://${hadoop.tmp.dir}/dfs/data | A list of directories where the datanode stores blocks. |

| | directory names | | Each block is stored in only one of these directories. |

+-------------------------------+-------------------+-----------------------------------------------+---------------------------------------------------------------+

| dfs.namenode.checkpoint.dir | Commaseparated | file://${hadoop.tmp.dir}/dfs/namesecondary | A list of directories where the secondary namenode stores |

| | | | checkpoints. It stores a copy of the checkpoint in each |

| | directory names | | directory in the list. |

+-------------------------------+-------------------+-----------------------------------------------+---------------------------------------------------------------+

YARN

-----------------------------------------------------------------------------------------------------------------------------------------

運行 YARN ,需要指定一台機器作為 resource manager 。最簡單的方法是設置 yarn.resourcemanager.hostname 屬性指向運行 resource manager 的主機名

或 IP 地址。多個資源管理器的伺服器地址從這個屬性衍生出來,例如,yarn.resourcemanager.address 使用主機-埠對(host-port pair), host 的默認值

是 yarn.resourcemanager.hostname, 在 MapReduce 客戶端配置中,這個屬性用於在 RPC 上連接 resource manager 。

在 MapReduce 作業期間,中間數據和工作文件被寫入到臨時的本地文件,因為這些數據包括可能非常大的 map 任務輸出,因此,需要確保

yarn.nodemanager.local-dirs 屬性配置使用的磁碟分區要足夠大,它控制者 YARN 容器的本地臨時存儲的位置。這個屬性使用一個逗號分隔的名稱列表,最好

將這些目錄分散到所有的本地磁碟,以提升磁碟 I/O 操作效率(這些目錄採用循環方式 —— in round-robin fashion)。典型地,應該為 YARN 本地存儲使用

與 datanode 塊存儲相同的磁碟和分區,由 dfs.datanode.data.dir 屬性控制的內容。

與 MapReduce 1 不同, YARN 沒有 tasktracker 來處理 map 輸出到 reduce 任務,它依賴於 shuffle handlers 來處理這類操作,是一些在節點管理器上長期

運行的輔助服務(auxiliary services)。由於 YARN 是一個通用的服務(a general-purpose service), MapReduce 的 shuffle handlers 需要在 yarn-site.xml

中明確啟用,通過設置 yarn.nodemanager.aux-services 屬性值為 mapreduce_shuffle 。

Important YARN daemon properties

+=======================================+===================+===============================+===================================================================================+

| 屬性名 | 類型 | 默認值 | 描述 |

+---------------------------------------+-------------------+-------------------------------+-----------------------------------------------------------------------------------+

| yarn.resourcemanager.hostname | Hostname | 0.0.0.0 | The hostname of the machine the |

| | | | resource manager runs on. Abbreviated ${y.rm.hostname} below. |

+---------------------------------------+-------------------+-------------------------------+-----------------------------------------------------------------------------------+

| yarn.resourcemanager.address | Hostname and port | ${y.rm.hostname}:8032 | The hostname and port that the resource manager』s RPC server runs on. |

+---------------------------------------+-------------------+-------------------------------+-----------------------------------------------------------------------------------+

| yarn.nodemanager.local-dirs | Comma-separated | ${hadoop.tmp.dir}/nmlocal-dir | A list of directories where node managers allow containers to store |

| | directory names | | intermediate data. The data is cleared out when the application ends. |

+---------------------------------------+-------------------+-------------------------------+-----------------------------------------------------------------------------------+

| yarn.nodemanager.aux-services | Commaseparated | | A list of auxiliary services run by the node manager. A service is |

| | | | implemented by the class defined by the property yarn.nodemanager.auxservices. |

| | service names | | service-name.class. By default, no auxiliary services are specified. |

+---------------------------------------+-------------------+-------------------------------+-----------------------------------------------------------------------------------+

| yarn.nodemanager.resource.memory-mb | int | 8192 | The amount of physical memory (in MB) that may be allocated to containers |

| | | | being run by the node manager. |

+---------------------------------------+-------------------+-------------------------------+-----------------------------------------------------------------------------------+

| yarn.nodemanager.vmem-pmem-ratio | float | 2.1 | The ratio of virtual to physical memory for containers. Virtual memory usage |

| | | | may exceed the allocation by this amount. |

+---------------------------------------+-------------------+-------------------------------+-----------------------------------------------------------------------------------+

| yarn.nodemanager.resource.cpu-vcores | int | 8 | The number of CPU cores that may be allocated to containers being run by the |

| | | | node manager. |

+---------------------------------------+-------------------+-------------------------------+-----------------------------------------------------------------------------------+

Memory settings in YARN and MapReduce:

-------------------------------------------------------------------------------------------------------------------------------------

YARN 以一種比 MapReduce 1 更細膩的方式處理內存,不是指定一個在一個節點上一次運行固定的最多數量的 map 和 reduce 槽(slot), YARN允許應用

程序為任務請求任意數量的內存(在限制範圍內). 在 YARN 模型上,節點管理器從內存池分配內存,因此在一個特定節點上能運行的任務數量取決於它們

內存需求的總和,而不是簡單的一個固定的槽的數量。

計算一個節點管理器有多少內存用於運行任務容器取決於這台機器上有多少物理內存。每個 Hadoop daemon 佔用 1000 MB,因此對於數據節點,運行一個

datanode 和 一個 node manager 所佔用內存總數為 2000MB, 再留出足夠的內存運行本機上的其他進程,然後剩下的可以提供給節點管理器的容器使用,

通過設置配置屬性:

yarn.nodemanager.resource.memory-mb

設置總的分配,單位為 MB, 默認為 8192

下一步是該確定如何為單個作業設置內存選項了。有兩個主要的控制:一個是由 YARN 分配的容器(container) 的大小,另一個是容器內運行的 Java

進程的堆大小。

提示:

----------------------------------------------------------------------------------------------------------------------------

MapReduce 的內存控制都由客戶端在 job configuration 設置, YARN 設置是集群設置並且不能被客戶端修改。

容器內存大小通過 mapreduce.map.memory.mb 和 mapreduce.reduce.memory.mb 確定,它們的默認值都是 1024MB 。

Java 進程的堆大小由 mapred.child.java.opts 設置,默認值是 200MB 。也可以分別指定 map 和 reduce 任務。

MapReduce job memory properties (set by the client)

+===============================+===========+===========+=======================================================================+

| 屬性名 | 類型 | 默認值 | 描述 |

+-------------------------------+-----------+-----------+-----------------------------------------------------------------------+

| mapreduce.map.memory.mb | int | 1024 | The amount of memory for map containers. |

+-------------------------------+-----------+-----------+-----------------------------------------------------------------------+

| mapreduce.reduce.memory.mb | int | 1024 | The amount of memory for reduce containers. |

+-------------------------------+-----------+-----------+-----------------------------------------------------------------------+

| mapred.child.java.opts | String | -Xmx200m | The JVM options used to launch the container process that runs |

| | | | map and reduce tasks. In addition to memory settings, this property |

| | | | can include JVM properties for debugging, for example. |

+-------------------------------+-----------+-----------+-----------------------------------------------------------------------+

| mapreduce.map.java.opts | String | -Xmx200m | The JVM options used for the child process that runs map tasks. |

+-------------------------------+-----------+-----------+-----------------------------------------------------------------------+

| mapreduce.reduce.java.opts | String | -Xmx200m | The JVM options used for the child process that runs reduce tasks. |

+-------------------------------+-----------+-----------+-----------------------------------------------------------------------+

舉例,假設 mapred.child.java.opts 設置為 -Xmx800m 並且 mapreduce.map.memory.mb 保持其默認值 1024 MB ,當一個 map 任務運行時,node manager

會分配一個 1024 MB 的 container(會降低內存池的大小為任務運行佔用的內存數量) 並以配置為 800 MB 的最大堆內存運行任務 JVM 。

注意, JVM 進程會有比堆內存稍大些的內存佔用,這個開銷取決於是否使用了本地庫(native libraries), 永久性生成空間的大小,等等。

比較重要的是, JVM 進程使用的物理內存,包括它產生的任何子進程,例如 Streaming 進程,不會超過它的分配內存(1024 MB)。如果一個 container

使用了比分配給它的更多的內存,它會被 node manager 終止並標記為失敗的。

YARN 調度器(schedulers) 受限於一個最小或最大內存分配,最小值默認為 1024 MB(由 yarn.scheduler.minimum-allocation-mb 設置),最大值默認為

8192 MB(由 yarn.scheduler.maximum-allocation-mb 設置)。

也有容器必須滿足的虛擬內存的約束,如果容器的虛擬內存使用超出了一個給定的分配的物理內存的倍數, node manager 可能會終止進程。倍數由

yarn.nodemanager.vmem-pmem-ratio 屬性設置,默認為 2.1 。例如,超出任務可能被終止的虛擬內存閾值是 2150 MB , 由 2.1 x 1024 MB 計算而來。

配置內存參數時,能夠在任務運行期間監視實際的內存使用是非常有用的,這可以通過 MapReduce 計數器(counter)。計數器 PHYSICAL_MEMORY_BYTES,

VIRTUAL_MEMORY_BYTES, and COMMITTED_HEAP_BYTES 提供了內存使用的快照值因此非常適合於在任務嘗試過程中觀察。

CPU settings in YARN and MapReduce

--------------------------------------------------------------------------------------------------------------------------------------

除了內存, YARN 將 CPU 的使用(usage), 也作為可管理的資源,並且應用程序能夠按需請求線程的數量(the number of cores)。一個 node manager 能

夠分配給容器的核心(core)數量由 yarn.nodemanager.resource.cpu-vcores 屬性控制,它應該設置為機器上總的線程數量,減去本機上運行的每個 daemon

進程對應一個後核心後剩餘的值(datanode, node manager, 以及其他長期運行的進程)。

MapReduce jobs 能夠控制分配給 map 和 reduce 容器的核心數量,通過設置 mapreduce.map.cpu.vcores 和 mapreduce.reduce.cpu.vcores 屬性,這兩個

值默認為 1,適合於一般情況下單線程(single-threaded) MapReduce 任務,佔用一個單一的內核(core)。

3. Hadoop 守護進程的地址和埠 (Hadoop Daemon Addresses and Ports)

----------------------------------------------------------------------------------------------------------------------------------------------------

Hadoop 守護進程通常會同時運行兩個進程, RPC 伺服器用於守護進程間通信,HTTP 伺服器用於為用戶交互提供 web 頁面。每個伺服器都要進行配置,設置其網路地址

和監聽埠。埠號為 0 指示伺服器在一個空閑的埠上啟動服務,但一般不推薦使用,因為會與集群範圍的防火牆策略不兼容。

通常,設置伺服器的 RPC 和 HTTP 地址具有雙重職責:確定伺服器綁定的網路介面,以及用於客戶端或集群中其他機器連接到該伺服器。例如,節點管理器使用

yarn.resourcemanager.resource-tracker.address 屬性找到資源管理器的地址。

將伺服器綁定到多個網路介面一般情況下是可取的。但把網路地址設置成 0.0.0.0 ,對伺服器來說可以工作,而另一方面的職責無法工作,因為這個地址不會被客戶端或

集群內其他機器解析。一個解決方案是為客戶端和伺服器分別配置,但更好的方法是為伺服器設置綁定主機。通過設置 yarn.resourcemanager.hostname 為主機名或 IP

地址,再設置 yarn.resourcemanager.bind-host 為 0.0.0.0, 確保資源管理器綁定到本機的所有地址上,同時也為 node manager 和客戶端提供了可解析的地址。

除了一個 RPC server, 數據節點為數據塊傳輸運行一個 TCP/IP 伺服器,伺服器的地址和埠通過 dfs.datanode.address 屬性設置,默認值為 0.0.0.0:50010

RPC server properties

+===============================================+=======================+===================================================================================================+

| 屬性名 | 默認值 | 描述 |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| fs.defaultFS | file:/// | When set to an HDFS URI, this property determines the namenode』s |

| | | RPC server address and port. The default port is 8020 if not specified. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| dfs.namenode.rpc-bind-host | | The address the namenode』s RPC server will bind to. If not set (the default), the bind |

| | | address is determined by fs.defaultFS. It can be set to 0.0.0.0 to make the namenode |

| | | listen on all interfaces. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| dfs.datanode.ipc.address | 0.0.0.0:50020 | The datanode』s RPC server address and port. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| mapreduce.jobhistory.address | 0.0.0.0:10020 | The job history server』s RPC server address and port. This is used by the |

| | | client (typically outside the cluster) to query job history. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| mapreduce.jobhistory.bind-host | | The address the job history server』s RPC and HTTP servers will bind to. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.resourcemanager.hostname | 0.0.0.0 | The hostname of the machine the resource manager runs on. |

| | | Abbreviated ${y.rm.hostname} below. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.resourcemanager.bind-host | | The address the resource manager』s RPC and HTTP servers will bind to. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.resourcemanager.address | ${y.rm.hostname}:8032 | The resource manager』s RPC server address and port. This is used by the client (typically |

| | | outside the cluster) to communicate with the resource manager. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.resourcemanager.admin.address | ${y.rm.hostname}:8033 | The resource manager』s admin RPC server address and port. This is used by the admin |

| | | client (invoked with yarn rmadmin, typically run outside the cluster) to communicate with |

| | | the resource manager. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.resourcemanager.scheduler.address | ${y.rm.hostname}:8030 | The resource manager scheduler』s RPC server address and port. This is used by (incluster) |

| | | application masters to communicate with the resource manager. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.resourcemanager.resource-tracker.address | ${y.rm.hostname}:8031 | The resource manager resource tracker』s RPC server address and port. This is used by (incluster) |

| | | node managers to communicate with the resource manager. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.nodemanager.hostname | 0.0.0.0 | The hostname of the machine the node manager runs on. Abbreviated ${y.nm.hostname} below. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.nodemanager.bind-host | | The address the node manager』s RPC and HTTP servers will bind to. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.nodemanager.address | ${y.nm.hostname}:0 | The node manager』s RPC server address and port. This is used by (in-cluster) application |

| | | masters to communicate with node managers. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

| yarn.nodemanager.localizer.address | ${y.nm.hostname}:8040 | The node manager localizer』s RPC server address and port. |

+-----------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------+

HTTP server properties

+=======================================+=======================+===============================================================================================+

| 屬性名 | 默認值 | 描述 |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

| dfs.namenode.http-address | 0.0.0.0:50070 | The namenode』s HTTP server address and port. |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

| dfs.namenode.http-bind-host | | The address the namenode』s HTTP server will bind to. |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

| dfs.namenode.secondary.http-address | 0.0.0.0:50090 | The secondary namenode』s HTTP server address and port. |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

| dfs.datanode.http.address | 0.0.0.0:50075 | The datanode』s HTTP server address and port. |

| | | (Note that the property name is inconsistent with the ones for the namenode.) |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

| mapreduce.jobhistory.webapp.address | 0.0.0.0:19888 | The MapReduce job history server』s address and port. This property is set in mapred-site.xml. |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

| mapreduce.shuffle.port | 13562 | The shuffle handler』s HTTP port number. This is used for serving map outputs, and is not a |

| | | useraccessible web UI. This property is set in mapred-site.xml. |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

| yarn.resourcemanager.webapp.address | ${y.rm.hostname}:8088 | The resource manager』s HTTP server address and port. |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

| yarn.nodemanager.webapp.address | ${y.nm.hostname}:8042 | The node manager』s HTTP server address and port. |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

| yarn.web-proxy.address | | The web app proxy server』s HTTP server address and port. If not set (the default), then the |

| | | web app proxy server will run in the resource manager process. |

+---------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------+

也有一個設置用於控制 datanode 使用哪個網路介面作為它的 IP 地址(HTTP 和 RPC 伺服器),相關屬性為 dfs.datanode.dns.interface, 設置為 default 使用默認網路介面。

可以明確設置為指定的介面來作為地址(例如 eho0 )

4. Hadoop 其他屬性 (Other Hadoop Properties)

----------------------------------------------------------------------------------------------------------------------------------------------------

集群成員(Cluster membership)

------------------------------------------------------------------------------------------------------------------------------------------------

為了幫助將來添加和移除節點,可以指定一個文件包含一個授權機器的列表允許加入集群作為 datanode 或 node manager 。這類文件由 dfs.hosts 和

yarn.resourcemanager.nodes.include-path 屬性設置(分別用於指定 datanode 和 node manager),默認為空表示允許所有機器加入。對應的 dfs.hosts.exclude

和 yarn.resourcemanager.nodes.exclude-path 屬性用於指定不允許加入集群的主機文件列表。

緩衝區大小(Buffer size)

------------------------------------------------------------------------------------------------------------------------------------------------

Hadoop 使用 4KB(4096 bytes)的緩衝區進行 I/O 操作。這是一個很保守的設置,對於現代的硬體和操作系統來說,增大緩衝區會顯著提高性能,128KB (131072

bytes) 是一個比較常用的選擇,通過 core-site.xml 文件中 io.file.buffer.size 屬性設置以位元組為單位的值來設置緩衝區大小。

HDFS 數據塊大小 (HDFS block size)

------------------------------------------------------------------------------------------------------------------------------------------------

HDFS 數據塊默認大小為 128MB,但很多集群使用更大的塊(例如, 256 MB,即 268,435,456 bytes)以緩解 namenode 的內存壓力,並給 mapper 提供更多的數據

進行操作。可以通過 hdfs-site.xml 文件中的 dfs.blocksize 屬性設置以位元組為單位的值指定塊大小。

保留的存儲空間(Reserved storage space)

------------------------------------------------------------------------------------------------------------------------------------------------

默認情況下, datanode 會使用存儲目錄上所有閑置的空間。如果計劃將這些存儲空間保留一部分給其他應用程序(非 HDFS ),可以設置 dfs.datanode.du.reserved

以位元組為單位的數值,用於存儲空間保留。

回收站 (Trash)

------------------------------------------------------------------------------------------------------------------------------------------------

Hadoop 文件系統也有回收站設施,被刪除文件並未真正被刪除,而是移到回收站文件夾中,回收站中的文件在被系統永久刪除之前會保留一個最小期限。文件在回收

站內保留的最小期限由 core-site.xml 文件內的 fs.trash.interval 配置屬性設置,單位為分鐘(in minutes)。默認值為 0 ,表示禁用回收站機制。

類似許多操作系統, Hadoop 的回收站設施是用戶級特性,也就是說,只有使用文件系統 shell 直接刪除的文件才會被放入回收站。編程實現的文件刪除會被立即刪除。

然而,編程使用回收站也是可以的,構造一個 Trash 實例,然後調用它的 moveToTrash() method, 提供要刪除的文件的 Path 參數。該方法返回值指定操作是否成功,

值 false 意味著或者回收站沒有啟用,或者該文件已存在於回收站中。

當回收站啟用時,每個用戶都有其自己的回收站目錄,在其自己的 home 目錄內,名為 .Trash 。文件恢復很簡單:在 .Trash 子目錄內找到要恢復的文件,並把它

移出.Trash 子目錄。

HDFS 能自動刪除回收站文件夾中的文件,但其他文件系統不會,因此,應該安排定期刪除。可以清理(expunge)回收站,刪除回收站內已經超過最小期限的文件。使用

如下文件系統 shell 命令:

% hadoop fs -expunge

Trash 類的 expunge() method 具有相同的效果。

作業調度 (Job scheduler)

------------------------------------------------------------------------------------------------------------------------------------------------

特別在多用戶設置中,考慮升級作業調度器(job scheduler) 隊列配置以反映組織的需要。例如,可以設置為每個使用集群的組使用一個隊列。

慢啟動 reduce (Reduce slow start)

------------------------------------------------------------------------------------------------------------------------------------------------

默認情況下,調度器會等待作業中有 5% 的 map 任務完成後調度同一作業中的 reduce 任務。對於大型作業來說,這可能會導致集群的利用率問題,因為在等待 map

任務完成期間會佔用 reduce container. 設置 mapreduce.job.reduce.slowstart.completedmaps 為一個更高的值,例如 0.80 (80%), 能夠幫助提升吞吐量。

短路本地讀取 (Short-circuit local reads)

------------------------------------------------------------------------------------------------------------------------------------------------

當從 HDFS 讀取一個文件的時候,客戶端聯繫 datanode, 然後數據通過 TCP 連接發送給客戶端。如果要讀取的數據塊與客戶端在同一節點上,那會非常高效,因為

客戶端不需要經過(bypass)網路,直接從磁碟讀取塊數據,這被稱為短路本地讀取( short-circuit local read ), 這使應用程序像 HBase 一樣執行高效執行。

可以通過設置 dfs.client.read.shortcircuit 值為 true 來啟用短路本地讀取。本地短路讀取使用 Unix domain sockets Unix domain sockets 實現,使用一個

本地路徑為 client-datanode 提供通信。路徑(path) 由 dfs.domain.socket.path 設置,而且必須是一個只能 datanode user (typically hdfs) 或 root 創建的

路徑,例如, /var/run/hadoop-hdfs/dn_socket.

*

*

*

4 安全性 ( Security )

---------------------------------------------------------------------------------------------------------------------------------------------------------

雅虎公司在 2009 年組織了一個工程師團隊來實現 Hadoop 的安全認證。

在這個設計中, Hadoop 本身不管理用戶憑證(user credentials), 而是依賴於 Kerberos ———— 一個成熟的開源網路認證協議,來認證用戶。

然而,Kerberos 並不管理許可許可權(permissions), Kerberos 的職責在於鑒定一個用戶是她所聲稱的那個人,確定這個用戶是否有許可權執行一個給定的操作

是 Hadoop 的工作。

1. Kerberos 和 Hadoop (Kerberos and Hadoop)

----------------------------------------------------------------------------------------------------------------------------------------------------

從高級的角度看,使用 Kerberos ,客戶端必須通過三個步驟才可以訪問一個服務,每一個步驟都包含一個與一個伺服器交換的消息:

① 認證(Authentication) :客戶端向認證伺服器(Authentication Server) 認證自己,並接收一個帶有時間戳的 Ticket-Granting Ticket(TGT)

② 授權(Authorization) :客戶端使用 TGT 向授權伺服器 Ticket-Granting Server 請求一個服務票據(service ticket).

③ 服務請求(Service request):客戶端將 service ticket 提供給客戶端要使用服務的伺服器,來認證它自己。在 Hadoop 場景內,這可能是一個namenode 或者

resource manager 等。

認證伺服器(Authentication Server)和 授權伺服器(Ticket Granting Server) 一起構成了密鑰分配中心( Key Distribution Center —— KDC) 。

授權和服務請求步驟不是用戶級(user-level)操作,客戶端代表用戶執行這兩個步驟。認證階段則通常由用戶使用 kinit 命令明確執行,這個命令會提示用戶口令。這並不

意味著每次運行一個作業或訪問 HDFS 都需要輸入口令,因為 TGT 默認有10個小時的有效期(可以更新至一周)。通常的做法是在操作系統登錄時自動認證,從而提供單次登

錄(single sign-on) 到 Hadoop 。

在有些場景下不期望被提示輸入密碼(例如執行一個無人職守的 MapReduce 作業), 可以使用 ktutil 命令創建一個 Kerberos keytab 文件。 keytab 文件保存了用戶密碼,

可以通過 -t 選項提供給 kinit 命令。

示例:

-------------------------------------------------------------------------------------------------------------------------------------------------

第一步,通過 core-site.xml 中設置 hadoop.security.authentication 屬性值為 kerberos 來啟用 Kerberos 認證,默認值是 simple, 表示傳統的向後兼容(

backward-compatible)方式 ———— 但不安全,即利用操作系統用戶名確定登錄者身份。

也需要設置 hadoop.security.authorization 值為 true 來啟用服務級別授權(service-level authorization), 可以在hadoop-policy.xml 配置文件中配置訪問控制

列表(access control lists, ACLs) 來控制哪些用戶和組具有連接各個 Hadoop 服務的許可許可權(permission)。服務定義在協議級別,因此有針對 MapReduce 作業提

交的,有針對 namenode 通信的,等等。

默認情況下,所有的 ACLs 都設置為 * ,意味著所有的用戶都有訪問各個服務的許可許可權;而在實際的集群中,應該將 ACL 僅僅鎖定在那些需要訪問的用戶和組上。

ACL 的格式是一個逗號分隔的用戶名列表,後跟一個空格,後面是一個逗號分隔的組名稱列表。例如,這個 ACL:

preston,howard directors,inventors

授權訪問給用戶名為 preston 或 howard, 或者在 directors 或 inventors 組中的用戶。

Kerberos 認證啟用之後,需要從 KDC 獲取 Kerberos ticket ,然後才能工作:

% kinit

Password for hadoop-user@LOCALDOMAIN: password

% hadoop fs -put quangle.txt .

% hadoop fs -stat %n quangle.txt

quangle.txt

拿到 ticket 之後,各項工作就跟平常情況下一樣了。

2. 委託令牌 (Delegation Tokens)

-----------------------------------------------------------------------------------------------------------------------------------------------------

在如 HDFS 或 MapReduce 的分散式系統中,有眾多的客戶端-伺服器交互,每次交互都必須認證。例如,一個 HDFS 的讀操作包括幾次的 namenode 調用和一或多次的

datanode 調用。並非每次調用都使用 Kerberos ticket 的三步交換協議認證,那會給一個繁忙集群中的 KDC 造成很高的負載, Hadoop 使用委託令牌來支持後續的認證

不必再次訪問 KDC 。委託令牌的創建和使用透明地由 Hadoop 代表用戶的行為進行,因此用戶使用 kinit 登錄之後就沒有什麼需要做的了。

對於默認的 HDFS 實例,委託令牌會自動獲得,但如果一個作業需要訪問其他的 HDFS 集群,需要設置 mapreduce.job.hdfs-servers 作業屬性的值為逗號分隔的 HDFS URI

列表才能載入那個集群的委託令牌。

3. 其他安全性改進 (Other Security Enhancements)

----------------------------------------------------------------------------------------------------------------------------------------------------

Hadoop stack 已全面強化安全性來防護未授權的資源訪問,顯著的特性如下:

① 任務可以使用提交作業的操作系統帳號運行,而不必由運行 node manager 的用戶運行。這意味著操作系統可以用於隔離任務運行,使它們彼此不能發送信號(

例如,殺掉另一用戶的任務), 同時,本地的信息,例如任務數據,會通過本地文件系統許可權保持私有。

這個特性通過設置 yarn.nodemanager.container-executor.class 屬性為 org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor 啟用。另外,

管理員要確保每個用戶在集群的每個節點上都有一個帳號(通常使用 LDAP).

② 當任務以提交作業的用戶運行時,分散式緩存(distributed cache)是安全的。

③ 用戶只能看到和修改他們自己的作業,無法操作其他人的作業。啟用這個特性需要設置 mapreduce.cluster.acls.enabled 值為 true 。有兩個作業配置屬性

mapreduce.job.acl-view-job 和 mapreduce.job.acl-modify-job, 可以設置一個逗號分隔的用戶列表,用於控制哪些用戶可以查看或修改一個特定的作業。

④ shuffle 是安全的,阻止惡意用戶請求獲取其他用戶的 map 輸出。

⑤ 正確配置之後,可以阻止惡意用戶運行虛假的 secondary namenode, datanode, 或 nodemanager 加入集群,潛在地竊取集群上存儲的數據。可以通過強制要求

daemon 與它要連接的 master 節點間認證來實現。要啟用這個特性,首先需要配置 Hadoop 使用一個由 ktutil 命令生成的 keytab 文件。例如,對於一個

datanode, 需要設置 dfs.datanode.keytab.file 值為 keytab 文件名,並且設置 dfs.datanode.kerberos.principal 的值為使用這個 datanode 的用戶名。

最後,hadoop-policy.xml 文件中 DataNodeProtocol 的 ACL 必須設置(用於 datanode 和 namenode 間通信),限制 security.datanode.protocol.acl 為

datanode 的用戶名。

⑥ datanode 可以運行在專有埠上(小於1024),使客戶端確信它是安全啟動的。

⑦ 任務僅與其父 application master 通信,因而阻止攻擊者從其他的用戶作業獲取到 MapReduce 作業 。

⑧ Hadoop 的很多部分可以加密網路數據,包括 RPC (hadoop.rpc.protection), HDFS 塊傳輸 (dfs.encrypt.data.transfer), MapReduce shuffle (

mapreduce.shuffle.ssl.enabled), web UI (hadoop.ssl.enabled)

*

*

*

5 利用基準評測程序測試 Hadoop 集群 (Benchmarking a Hadoop Cluster)

--------------------------------------------------------------------------------------------------------------------------------------------------------

基準測試程序(Benchmarks)能進行很好的測試,用戶可以拿測試結果與其他集群進行比較,以檢查新集群是否粗略地按預期效果執行。還可以使用評測結果調整集群,以榨取

它的最佳性能。一般通過監視系統,觀察集群上資源的使用情況。

1. Hadoop 基準評測程序 (Hadoop Benchmarks)

---------------------------------------------------------------------------------------------------------------------------------------------------

Hadoop 自帶幾個基準評測程序,極小的安裝開銷,運行方便。基準評測程序都打包到 tests JAR 文件中,通過無參數調用,可以獲得這些程序的列表及其描述:

% hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-*-tests.jar

當使用無參數調用時,大多數基準評測程序都顯示其使用方法,例如:

% hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-*-tests.jar TestDFSIO

TestDFSIO.1.7

Missing arguments.

Usage: TestDFSIO [genericOptions] -read [-random | -backward |

-skip [-skipSize Size]] | -write | -append | -clean [-compression codecClassName]

[-nrFiles N] [-size Size[B|KB|MB|GB|TB]] [-resFile resultFileName]

[-bufferSize Bytes] [-rootDir]

使用 TeraSort 評測 MapReduce (Benchmarking MapReduce with TeraSort)

------------------------------------------------------------------------------------------------------------------------------------------------

Hadoop 自帶的 MapReduce 程序 TeraSort 對它的輸入進行全部排序。它對同時評測 HDFS 和 MapReduce 是很有用的,因為整個數據集都是通過 shuffle 傳輸的。

測試過程經過三個步驟:創建隨機數,執行排序和驗證結果。

首先,使用 teragen 生成一些隨機數據。

It runs a map-only job that generates a specified number of rows of binary data. Each row is 100 bytes long, so to generate one

terabyte of data using 1,000 maps, run the following (10t is short for 10 trillion)

% hadoop jar

$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar

teragen -Dmapreduce.job.maps=1000 10t random-data

下一步,運行 terasort:

% hadoop jar

$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar

terasort random-data sorted-data

最後的檢查,驗證 sorted-data 中的數據,是否正確排序了:

% hadoop jar

$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar

teravalidate sorted-data report

其他基準測試程序 (Other benchmarks))

-----------------------------------------------------------------------------------------------------------------------------------------------

Hadoop 自帶了很多基準測試程序,但下面內容的使用廣泛:

TestDFSIO :測試 HDFS 的 I/O 性能,它使用個 MapReduce 作業並發地讀寫文件。

MRBench (invoked with mrbench) :多次運行一個小型作業,與 TeraSort 不同,該基準測試的目的是檢驗小型作業能否快速響應。

NNBench (invoked with nnbench) :用於 namenode 硬體載入測試 (load-testing)

Gridmix : 一個基準測試套件,設計通過模擬真實常見的數據訪問模式來為集群負載建模。

SWIM, or the Statistical Workload Injector for MapReduce :is a repository of real-life MapReduce workloads that you can use to generate

representative test workloads for your system.

TPCx-HS :is a standardized benchmark based on TeraSort from the Transaction Processing Performance Council.

2. 用戶作業 (User Jobs)

----------------------------------------------------------------------------------------------------------------------------------------------------

為了集群調優,最好包含一些用戶運行的代表性作業,這樣集群調優針對這些作業而不僅僅是標準基準測試。如果這是第一個 Hadoop 集群,還沒有任何的用戶作業,

Gridmix 或 SWIM 是一個很好的替代。

如果運行自己的作業作為基準測試,應該為自己的用戶作業選擇一個數據集,並且每次運行都使用它能對不同的運行結果進行比較。當設置新的集群或升級時,可以

使用相同的數據集比較前後的運行性能。

構建 Hadoop 集群

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

使用包定長FixedLengthFrameDecoder解決半包粘包
Swoole實現基於WebSocket的群聊私聊

TAG:程序員小新人學習 |