用 Hadoop 進行分佈式數據處理(進階)

本文是嵌入式固件架構師M. Tim Jones所撰寫的,本系列的用 Hadoop 進行分佈式數據處理,第 1 部分:入門 展示瞭如何在一個單節點集羣中使用 Hadoop。本文在此基礎之上繼續介紹一個更加高級的設置,即使用多個節點進行並行處理。展示了多節點集羣所需的各種節點類型,並探討了一個並行環境中的 MapReduce 功能。本文還深入探究了 Hadoop 的管理方面 — 同時基於命令行和 Web。

Hadoop 分佈式計算架構的真正實力在於其分佈性。換句話說,向工作並行分佈多個節點的能力使 Hadoop 能夠應用於大型基礎設施以及大量數據的處理。本文首先對一個分佈式 Hadoop 架構進行分解,然後探討分佈式配置和使用。

分佈式 Hadoop 架構

根據 用 Hadoop 進行分佈式數據處理,第 1 部分:入門,所有 Hadoop 守護進程都在同一個主機上運行。儘管不運用 Hadoop 的並行性,這個僞分佈式配置提供一種簡單的方式來以最少的設置測試 Hadoop 的功能。現在,讓我們使用機器集羣探討一下 Hadoop 的並行性。

根據第 1 部分,Hadoop 配置定義了讓所有 Hadoop 守護進程在一個節點上運行。因此,讓我們首先看一下如何自然分佈 Hadoop 來執行並行操作。在一個分佈式 Hadoop 設置中,您有一個主節點和一些從節點(見圖 1)。

圖 1. Hadoop 主從節點分解

如圖 1 所示,主節點包括名稱節點、從屬名稱節點和 jobtracker 守護進程(即所謂的主守護進程)。此外,這是您爲本演示管理集羣所用的節點(使用 Hadoop 實用程序和瀏覽器)。從節點包括 tasktracker 和數據節點(從屬守護進程)。兩種設置的不同之處在於,主節點包括提供 Hadoop 集羣管理和協調的守護進程,而從節點包括實現 Hadoop 文件系統(HDFS)存儲功能和 MapReduce 功能(數據處理功能)的守護進程。

對於該演示,在一個 LAN 上創建一個主節點和兩個從節點。設置如圖 2 所示。現在,我們來探討用於多節點分佈的 Hadoop 的安裝和配置。

圖 2. Hadoop 集羣配置

爲簡化部署,要運用虛擬化技術,該技術有幾個好處。儘管在該設置中使用虛擬化技術看不出性能優勢,但是它可以創建一個 Hadoop 安裝,然後爲其他節點克隆該安裝。爲此,您的 Hadoop 集羣應顯示如下:在一個主機上的虛擬機監控程序上下文中將主從節點作爲虛擬機(VM)運行(見圖 3)。

圖 3. 虛擬環境中的 Hadoop 集羣配置

升級 Hadoop

在 用 Hadoop 進行分佈式數據處理,第 1 部分:入門 中,我們安裝了在一個節點上運行的 Hadoop 的一個特殊分佈(僞配置)。在本文中,我們要更新分佈式配置。如果您沒有看過本系列的第 1 部分,那麼請閱讀第 1 部分,瞭解如何首先安裝 Hadoop 僞配置。

在僞配置中,您沒有進行任何配置,因爲單個節點已經過預先配置。現在,您需要更新配置。首先,使用 update-alternatives 命令檢查當前配置,如清單 1 所示。該命令告訴您,配置在使用 conf.pseudo(最高優先級)。

清單 1. 檢查當前 Hadoop 配置

$ update-alternatives --display

hadoop-0.20-conf

hadoop-0.20-conf - status is auto.

link currently points to /etc/hadoop-0.20/conf.pseudo

/etc/hadoop-0.20/conf.empty - priority 10

/etc/hadoop-0.20/conf.pseudo - priority 30

Current `best' version is /etc/hadoop-0.20/conf.pseudo.

$

下一步,通過複製現有配置(本例中爲 conf.empty,如清單 1 所示)創建一個新配置:

$ sudo cp -r /etc/hadoop-0.20/

conf.empty /etc/hadoop-0.20/conf.dist

$

最後,激活並檢查新配置:

清單 2. 激活並檢查 Hadoop 配置

$ sudo update-alternatives --install

/etc/hadoop-0.20/conf hadoop-0.20-conf \

/etc/hadoop-0.20/conf.dist 40

$ update-alternatives --display hadoop-0.20-conf

hadoop-0.20-conf - status is auto.

link currently points to /etc/hadoop-0.20/conf.dist

/etc/hadoop-0.20/conf.empty - priority 10

/etc/hadoop-0.20/conf.pseudo - priority 30

/etc/hadoop-0.20/conf.dist - priority 40

Current `best' version is /etc/hadoop-0.20/conf.dist.

$

現在,您有一個名爲 conf.dist 的新配置,您要將其用於您的新分佈式配置。此時該節點運行於一個虛擬環境中,將該節點克隆到另外兩個要充當數據節點的節點中。

配置 Hadoop 以實現分佈式操作

下一步是要使所有節點互聯互通。這可以 /etc/hadoop-0.20/conf.dist/ 中的兩個名爲 masters 和 slaves 的文件中實現。本例中的三個節點的 IP 地址是靜態分配的,如清單 3 所示(來自 /etc/hosts):

清單 3. 該設置的 Hadoop 節點(/etc/hosts)

master 192.168.108.133

slave1 192.168.108.134

slave2 192.168.108.135

因此,在主節點上,更新 /etc/hadoop-0.20/conf.dist/masters 來確定主節點,如下所示:

master

然後在 /etc/hadoop-0.20/conf.dist/slaves 中確定從節點, 其中包括以下兩行:

slave1

slave2

接下來,從每個節點上,將 Secure Shell (ssh) 連接到所有其他節點,確保 pass-phraseless ssh 在運行。所有這些文件(masters,slaves)都由本系列第 1 部分中使用過的 Hadoop 啓動和停止工具使用。

下一步,在 /etc/hadoop-0.20/conf.dist 子目錄中繼續進行 Hadoop 配置。以下變更需要應用於所有節點(主節點和從節點),如同 Hadoop 文檔中所定義的。首先,在 core-site.xml 文件(清單 4)中確定 HDFS 主節點,它定義名稱節點的主機和端口(注意主節點的 IP 地址的使用)。core-site.xml 文件定義 Hadoop 的核心屬性。

清單 4. 在 core-site.xml 中定義 HDFS 主節點

<configuration>

<property>

<name>fs.default.name<name>

<value>hdfs://master:54310<value>

<description>The name and URI of the default FS.</description>

<property>

<configuration>

下一步,確認 MapReduce jobtracker。jobtracker 位於其自己的節點上,但對於本配置,將其放在主節點上,如清單 5 所示。mapred-site.xml 文件包含 MapReduce 屬性。

清單 5. 在 mapred-site.xml 中定義 MapReduce jobtracker

<configuration>

<property>

<name>mapred.job.tracker<name>

<value>master:54311<value>

<description>Map Reduce jobtracker<description>

<property>

<configuration>

最後,定義默認複製因子(清單 6)。該值定義將創建的副本數,一般小於 3。在本例中,將其定義爲 2(數據節點的數量)。該值在包含 HDFS 屬性的 hdfs-site.xml 中定義。

清單 6. 在 hdfs-site.xml 中定義默認數據副本

<configuration>

<property>

<name>dfs.replication<name>

<value>2<value>

<description>Default block replication<description>

<property>

<configuration>

配置項如 清單 4 所示,分佈式設置所需的元素見 清單 5 和 清單 6。Hadoop 在這裏提供大量配置選項,支持您按需定製整個環境。參考資料 部分含有關於這些選項的更多信息。

完成配置之後,下一步是要格式化名稱節點(HDFS 主節點)。對於該操作,使用 hadoop-0.20 實用程序指定名稱節點和操作(-format):

清單 7. 格式化名稱節點

user@master:~# sudo su -

root@master:~# hadoop-0.20 namenode -format

10/05/11 18:39:58 INFO namenode.NameNode: STARTUP_MSG:

/************************************************************

STARTUP_MSG: Starting NameNode

STARTUP_MSG: host = master/127.0.1.1

STARTUP_MSG: args = [-format]

STARTUP_MSG: version = 0.20.2+228

STARTUP_MSG: build = -r cfc3233ece0769b11af9add328261295aaf4d1ad;

************************************************************/

10/05/11 18:39:59 INFO namenode.FSNamesystem: fsOwner=root,root

10/05/11 18:39:59 INFO namenode.FSNamesystem: supergroup=supergroup

10/05/11 18:39:59 INFO namenode.FSNamesystem: isPermissionEnabled=true

10/05/11 18:39:59 INFO common.Storage: Image file of size 94 saved in 0 seconds.

10/05/11 18:39:59 INFO common.Storage:

Storage directory /tmp/hadoop-root/dfs/name has been successfully formatted.

10/05/11 18:39:59 INFO namenode.NameNode: SHUTDOWN_MSG:

/************************************************************

SHUTDOWN_MSG: Shutting down NameNode at master/127.0.1.1

************************************************************/

root@master:~#

格式化名稱節點之後,就可以啓動 Hadoop 守護進程了。可以對第 1 部分中的僞分佈式配置執行同樣的操作,但進程爲分佈式配置完成同樣的工作。注意,這裏的代碼啓動名稱節點和從屬名稱節點(正如 jps 命令所指示):

清單 8. 啓動名稱節點

root@master:~# /usr/lib/hadoop-0.20

/bin/start-dfs.sh

starting namenode, logging to

/usr/lib/hadoop-0.20/bin/../logs/hadoop-root-namenode-mtj-desktop.out

192.168.108.135: starting datanode, logging to

/usr/lib/hadoop-0.20/bin/../logs/hadoop-root-datanode-mtj-desktop.out

192.168.108.134: starting datanode, logging to

/usr/lib/hadoop-0.20/bin/../logs/hadoop-root-datanode-mtj-desktop.out

192.168.108.133: starting secondarynamenode,

logging to /usr/lib/hadoop-0.20/logs/hadoop-root-secondarynamenode-mtj-desktop.out

root@master:~# jps

7367 NameNode

7618 Jps

7522 SecondaryNameNode

root@master:~#

現在,如果使用 jps 節點檢測其中一個從節點(數據節點),您會看到每個節點上都有一個數據節點守護進程:

清單 9. 檢測其中一個從節點上的數據節點

root@slave1:~# jps

10562 Jps

10451 DataNode

root@slave1:~#

下一步是要啓動 MapReduce 守護進程(jobtracker 和 tasktracker)。如 清單 10 所示執行該操作。注意,腳本啓動主節點上的 jobtracker(正如配置所定義的;參見 清單 5)和每個從節點上的 tasktrackers。主節點上的一個 jps 命令顯示 jobtracker 正在運行。

清單 10. 啓動 MapReduce 守護進程

root@master:~# /usr/lib/hadoop-0.20

/bin/start-mapred.sh

starting jobtracker, logging to

/usr/lib/hadoop-0.20/logs/hadoop-root-jobtracker-mtj-desktop.out

192.168.108.134: starting tasktracker, logging to

/usr/lib/hadoop-0.20/bin/../logs/hadoop-root-tasktracker-mtj-desktop.out

192.168.108.135: starting tasktracker, logging to

/usr/lib/hadoop-0.20/bin/../logs/hadoop-root-tasktracker-mtj-desktop.out

root@master:~# jps

7367 NameNode

7842 JobTracker

7938 Jps

7522 SecondaryNameNode

root@master:~#

最後,使用 jps 檢查一個從節點。這裏您可以看到,一個 tasktracker 守護進程將數據節點守護進程聯接到每個從數據節點上:

清單 11. 檢測其中一個從節點上的數據節點

root@slave1:~# jps

7785 DataNode

8114 Jps

7991 TaskTracker

root@slave1:~#

啓動腳本、節點和啓動的守護進程之間的關係如圖 4 所示。如您所見,start-dfs 腳本啓動名稱節點和數據節點,而 start-mapred 腳本啓動 jobtracker 和 tasktrackers。

圖 4. 每個節點的啓動腳本和守護進程的關係

測試 HDFS

既然 Hadoop 已經開始在整個集羣中運行了,您可以運行一些測試來確保其正常運作(見清單 12)。首先,通過 hadoop-0.20 實用程序發出一個文件系統命令(fs),並請求一個 df(disk free)操作。與在 Linux® 中一樣,該命令僅確定特定設備的已用空間和可用空間。因此,對於新格式化的文件系統,就沒有已用空間。下一步,在 HDFS 的根上執行一個 ls 操作,創建一個子目錄,列出其內容,並刪除它。最後,在 hadoop-0.20 實用程序內,您可以使用 fsck 命令在 HDFS 上執行一個 fsck(文件系統檢查)。這一切 — 以及各種其他信息(比如檢測到兩個數據節點)— 都告訴您文件系統是正常的。

清單 12. 檢查 HDFS

root@master:~# hadoop-0.20

fs -df

File system Size Used Avail Use%

/ 16078839808 73728 3490967552 0%

root@master:~# hadoop-0.20 fs -ls /

Found 1 items

drwxr-xr-x - root supergroup 0 2010-05-12 12:16 /tmp

root@master:~# hadoop-0.20 fs -mkdir test

root@master:~# hadoop-0.20 fs -ls test

root@master:~# hadoop-0.20 fs -rmr test

Deleted hdfs://192.168.108.133:54310/user/root/test

root@master:~# hadoop-0.20 fsck /

.Status: HEALTHY

Total size: 4 B

Total dirs: 6

Total files: 1

Total blocks (validated): 1 (avg. block size 4 B)

Minimally replicated blocks: 1 (100.0 %)

Over-replicated blocks: 0 (0.0 %)

Under-replicated blocks: 0 (0.0 %)

Mis-replicated blocks: 0 (0.0 %)

Default replication factor: 2

Average block replication: 2.0

Corrupt blocks: 0

Missing replicas: 0 (0.0 %)

Number of data-nodes: 2

Number of racks: 1

The filesystem under path '/' is HEALTHY

root@master:~#

執行一個 MapReduce 作業

下一步是執行一個 MapReduce 作業,以驗證整個設置運作正常(見清單 13)。該進程的第一步是要引入一些數據。因此,首先創建一個目錄來容納您的輸入數據(稱爲 input),創建方式是使用 hadoop-0.20 實用程序的 mkdir 命令。然後,使用 hadoop-0.20 的 put 命令將兩個文件放到 HDFS 中。您可以使用 Hadoop 實用程序的 ls 命令檢查輸入目錄的內容。

清單 13. 生成輸入數據

root@master:~# hadoop-0.20 fs

-mkdir input

root@master:~# hadoop-0.20 fs -put \

/usr/src/linux-source-2.6.27/Doc*/memory-barriers.txt input

root@master:~# hadoop-0.20 fs -put \

/usr/src/linux-source-2.6.27/Doc*/rt-mutex-design.txt input

root@master:~# hadoop-0.20 fs -ls input

Found 2 items

-rw-r--r-- 2 root supergroup 78031 2010-05-12 14:16 /user/root/input/memory-barriers.txt

-rw-r--r-- 2 root supergroup 33567 2010-05-12 14:16 /user/root/input/rt-mutex-design.txt

root@master:~#

下一步,啓動 wordcount MapReduce 作業。與在僞分佈式模型中一樣,指定輸入子目錄(包含輸入文件)和輸出目錄(不存在,但會由名稱節點創建並用結果數據填充):

清單 14. 在集羣上運行 MapReduce wordcount 作業

root@master:~# hadoop-0.20

jar \

/usr/lib/hadoop-0.20/hadoop-0.20.2+228-examples.jar wordcount input output

10/05/12 19:04:37 INFO input.FileInputFormat: Total input paths to process : 2

10/05/12 19:04:38 INFO mapred.JobClient: Running job: job_201005121900_0001

10/05/12 19:04:39 INFO mapred.JobClient: map 0% reduce 0%

10/05/12 19:04:59 INFO mapred.JobClient: map 50% reduce 0%

10/05/12 19:05:08 INFO mapred.JobClient: map 100% reduce 16%

10/05/12 19:05:17 INFO mapred.JobClient: map 100% reduce 100%

10/05/12 19:05:19 INFO mapred.JobClient: Job complete: job_201005121900_0001

10/05/12 19:05:19 INFO mapred.JobClient: Counters: 17

10/05/12 19:05:19 INFO mapred.JobClient: Job Counters

10/05/12 19:05:19 INFO mapred.JobClient: Launched reduce tasks=1

10/05/12 19:05:19 INFO mapred.JobClient: Launched map tasks=2

10/05/12 19:05:19 INFO mapred.JobClient: Data-local map tasks=2

10/05/12 19:05:19 INFO mapred.JobClient: FileSystemCounters

10/05/12 19:05:19 INFO mapred.JobClient: FILE_BYTES_READ=47556

10/05/12 19:05:19 INFO mapred.JobClient: HDFS_BYTES_READ=111598

10/05/12 19:05:19 INFO mapred.JobClient: FILE_BYTES_WRITTEN=95182

10/05/12 19:05:19 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=30949

10/05/12 19:05:19 INFO mapred.JobClient: Map-Reduce Framework

10/05/12 19:05:19 INFO mapred.JobClient: Reduce input groups=2974

10/05/12 19:05:19 INFO mapred.JobClient: Combine output records=3381

10/05/12 19:05:19 INFO mapred.JobClient: Map input records=2937

10/05/12 19:05:19 INFO mapred.JobClient: Reduce shuffle bytes=47562

10/05/12 19:05:19 INFO mapred.JobClient: Reduce output records=2974

10/05/12 19:05:19 INFO mapred.JobClient: Spilled Records=6762

10/05/12 19:05:19 INFO mapred.JobClient: Map output bytes=168718

10/05/12 19:05:19 INFO mapred.JobClient: Combine input records=17457

10/05/12 19:05:19 INFO mapred.JobClient: Map output records=17457

10/05/12 19:05:19 INFO mapred.JobClient: Reduce input records=3381

root@master:~#

最後一步是探索輸出數據。由於您運行了 wordcount MapReduce 作業,結果是一個文件(從已處理映射文件縮減而來)。該文件包含一個元組列表,表示輸入文件中找到的單詞和它們在所有輸入文件中出現的次數:

清單 15. 檢測 MapReduce 作業的輸出

root@master:~# hadoop-0.20

fs -ls output

Found 2 items

drwxr-xr-x - root supergroup 0 2010-05-12 19:04 /user/root/output/_logs

-rw-r--r-- 2 root supergroup 30949 2010-05-12 19:05 /user/root/output/part-r-00000

root@master:~# hadoop-0.20 fs -cat output/part-r-00000 | head -13

!= 1

"Atomic 2

"Cache 2

"Control 1

"Examples 1

"Has 7

"Inter-CPU 1

"LOAD 1

"LOCK" 1

"Locking 1

"Locks 1

"MMIO 1

"Pending 5

root@master:~#

Web 管理界面

儘管 hadoop-0.20 實用程序的功能極其豐富,但有時使用一個 GUI 會更方便。在執行文件系統檢測時,您可以通過 http://master:50070 鏈接到名稱節點,通過 http://master:50030 連接到 jobtracker 。您可以通過名稱節點檢測 HDFS,如圖 5 所示,在這裏您檢測輸入目錄(包含輸入數據 — 見上面 清單 13)。

圖 5. 通過名稱節點檢測 HDFS

通過 jobtracker,您可以檢測運行中或已完成的作業。在圖 6 中,您可以看到對最後一個作業的檢測(來自 清單 14)。該圖展示了作爲 Java 存檔(JAR)請求的輸出發出的各種數據,以及任務的狀態和數量。注意,這裏執行了兩個映射任務(每個輸入文件一個映射)和一個縮減任務(用於縮減兩個映射輸入)。

圖 6. 檢查一個已完成作業的狀態

最後,您可以通過名稱節點檢查數據節點的狀態。名稱節點主頁確定活動節點和死節點(作爲鏈接)的數量,且允許您進一步檢測它們。圖 7 所示的頁面顯示了活動數據節點以及每個節點的統計數據。

圖 7. 檢查活動數據節點的狀態

通過名稱節點和 jobtracker Web 界面,可以查看許多其他視圖,但出於簡潔,只顯示該樣例集。在名稱節點和 jobtracker Web 頁面內,您會找到大量鏈接,從而引導您獲取有關 Hadoop 配置和操作的其他信息(包括運行時日誌)。

更進一步

在本期中,您瞭解瞭如何將一個僞分佈式配置從 Cloudera 轉化爲一個完全分佈式配置。寥寥無幾的步驟以及 MapReduce 應用程序的一個相同接口,就使 Hadoop 成爲一個能實現分佈式處理的有用工具。另一個有趣的部分就是 Hadoop 的可伸縮性探討。通過添加新數據節點(並更新其 XML 文件和 master 中的 slave 文件),您可以輕鬆伸縮 Hadoop 來進行更高級別的平行處理。第 3 部分,也就是本 Hadoop 系列的最後一期,將探討如何爲 Hadoop 開發一個 MapReduce 應用程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章