用 Linux 和 Apache Hadoop 進行雲計算

來源:互聯網
上載者:User

IBM®、Google、VMWare 和 Amazon 等公司已經開始提供雲計算產品和戰略。 本文講解如何使用 Apache Hadoop 構建一個 MapReduce 框架以建立 Hadoop 集群,以及如何創建在 Hadoop 上運行的示例 MapReduce 應用程式。 還將討論如何在雲上設置耗費時間/磁片的任務。

雲計算簡介

近來雲計算越來越熱門了,雲計算已經被看作 IT 業的新趨勢。 雲計算可以粗略地定義為使用自己環境之外的某一服務提供的可伸縮計算資源,並按使用量付費。 可以通過 Internet 訪問 「雲」 中的任何資源,而不需要擔心計算能力、頻寬、存儲、安全性和可靠性等問題。

本文簡要介紹 Amazon EC2 這樣的雲計算平臺,可以租借這種平臺上的虛擬 Linux® 伺服器;然後介紹開放源碼 MapReduce 框架 Apache Hadoop,這個框架將構建在虛擬 Linux 伺服器中以建立雲計算框架。 但是,Hadoop 不僅可以部署在任何廠商提供的 VM 上,還可以部署在物理機器上的一般 Linux OS 中。

在討論 Apache Hadoop 之前,我們先簡要介紹一下雲計算系統的結構。 圖 1 顯示雲計算的各個層以及現有的一些服務。

基礎設施即服務 (Infrastructure-as-a-Service,IaaS)是指以服務的形式租借基礎設施(計算資源和存儲)。 IaaS 讓使用者可以租借電腦(即虛擬主機)或資料中心,可以指定特定的服務品質約束,比如能夠運行某些作業系統和軟體。 Amazon EC2 在這些層中作為 IaaS,向使用者提供虛擬的主機。 平臺即服務 (Platform-as-a-Service,PaaS)主要關注軟體框架或服務,提供在基礎設施中進行 「雲」 計算所用的 API。 Apache Hadoop 作為 PaaS,它構建在虛擬主機上,作為雲計算平臺。


圖 1. 雲計算的層和現有服務

Amazon EC2

Amazon EC2 是一個 Web 服務,它允許使用者請求具有各種資源(CPU、磁片、記憶體等)的虛擬機器器。 使用者只需按使用的計算時間付費,其他事情全交給 Amazon 處理。

這些實例 (Amazon Machine Image,AMI) 基於 Linux,可以運行您需要的任何應用程式或軟體。 在從 Amazon 租借伺服器之後,可以像對待物理伺服器一樣使用一般的 SSH 工具設置連接和維護伺服器。

對 EC2 的詳細介紹超出了本文的範圍。

部署 Hadoop 雲計算框架的最好方法是把它部署在 AMI 上,這樣可以利用雲資源,不需要考慮計算能力、頻寬、存儲等問題。 但是,在本文的下一部分中,我們將在本地的 Linux 伺服器 VMWare 映射中構建 Hadoop,因為 Hadoop 不僅適用于雲解決方案。 在此之前,我們先介紹一下 Apache Hadoop。

Apache Hadoop

Apache Hadoop 是一個軟體框架(平臺),它可以分散式地操縱大量資料。 它于 2006 年出現,由 Google、Yahoo! 和 IBM 等公司支援。 可以認為它是一種 PaaS 模型。

它的設計核心是 MapReduce 實現和 HDFS (Hadoop Distributed File System),它們源自 MapReduce(由一份 Google 檔引入)和 Google File System。

MapReduce

MapReduce 是 Google 引入的一個軟體框架,它支援在電腦(即節點)集群上對大型資料集進行分散式運算。 它由兩個過程組成,映射(Map)和縮減(Reduce)。

在映射過程中,主節點接收輸入,把輸入分割為更小的子任務,然後把這些子任務分佈到工作者節點。

工作者節點處理這些小任務,把結果返回給主節點。

然後,在縮減過程中,主節點把所有子任務的結果組合成輸出,這就是原任務的結果。

圖 2 說明 MapReduce 流程的概念。

MapReduce 的優點是它允許對映射和縮減操作進行分散式處理。 因為每個映射操作都是獨立的,所有映射都可以並存執行,這會減少總計算時間。

HDFS

對 HDFS 及其使用方法的完整介紹超出了本文的範圍。

從最終使用者的角度來看,HDFS 就像傳統的檔案系統一樣。 可以使用目錄路徑對檔執行 CRUD 操作。 但是,由於分散式存儲的性質,有 「NameNode」 和 「DataNode」 的概念,它們承擔各自的責任。

NameNode 是 DataNode 的主節點。 它在 HDFS 中提供中繼資料服務。 中繼資料說明 DataNode 的檔案對應。 它還接收操作命令並決定哪些 DataNode 應該執行操作和複製。

DataNode 作為 HDFS 的存儲塊。 它們還回應從 NameNode 接收的塊創建、刪除和複製命令。

JobTracker 和 TaskTracker

在提交應用程式時,應該提供包含在 HDFS 中的輸入和輸出目錄。 JobTracker 作為啟動 MapReduce 應用程式的單一控制點,它決定應該創建多少個 TaskTracker 和子任務,然後把每個子任務分配給 TaskTracker。 每個 TaskTracker 向 JobTracker 報告狀態和完成後的任務。

通常,一個主節點作為 NameNode 和 JobTracker,從節點作為 DataNode 和 TaskTracker。 Hadoop 集群的概念視圖和 MapReduce 的流程見圖 2。


圖 2. Hadoop 集群的概念視圖和 MapReduce 的流程

設置 Apache Hadoop

現在在 Linux VM 上設置 Hadoop 集群,然後就可以在 Hadoop 集群上運行 MapReduce 應用程式。

Apache Hadoop 支援三種部署模式:

單獨模式:在預設情況下,Hadoop 以非分佈的單獨模式運行。 這個模式適合應用程式調試。 偽分佈模式:Hadoop 還可以以單節點的偽分佈模式運行。 在這種情況下,每個 Hadoop 守護進程作為單獨的 JAVA™ 進程運行。 全分佈模式:Hadoop 配置在不同的主機上,作為集群運行。

要想以單獨或偽分佈模式設置 Hadoop,請參考 Hadoop 的網站。 在本文中,我們只討論以全分佈模式設置 Hadoop。

準備環境

在本文中,我們需要三台 GNU/Linux 伺服器;一個作為主節點,另外兩個作為從節點。

表 1. 伺服器資訊

伺服器 IP

伺服器主機名稱

角色

9.30.210.159

Vm-9-30-210-159

主節點(NameNode 和 JobTracker)

9.30.210.160

Vm-9-30-210-160

從節點 1 (DataNode 和 TaskTracker)

9.30.210.161

Vm-9-30-210-161

從節點 2 (DataNode 和 TaskTracker)

每台機器都需要安裝 JAVA SE 6 和 Hadoop 二進位代碼。 本文使用 Hadoop version 0.19.1。

還需要在每台機器上安裝 SSH 並運行 sshd。 SUSE 和 RedHat 等流行的 Linux 發行版本在預設情況下已經安裝了它們。

設置通信

更新 /etc/hosts 檔,確保這三台機器可以使用 IP 和主機名稱相互通信。

因為 Hadoop 主節點使用 SSH 與從節點通信,所以應該在主節點和從節點之間建立經過身份驗證的無密碼的 SSH 連接。 在每台機器上執行以下命令,從而生成 RSA 公共和私有金鑰。

ssh-keygen –t rsa


這會在 /root/.ssh 目錄中生成 id_rsa.pub。 重命名主節點的 id_rsa.pub(這裡改名為 59_rsa.pub)並把它複製到從節點。 然後執行以下命令,把主節點的公共金鑰添加到從節點的已授權金鑰中。

cat /root/.ssh/59_rsa.pub >> /root/.ssh/authorized_keys


現在嘗試使用 SSH 連接從節點。 應該可以成功連接,不需要提供密碼。

設置主節點

把 Hadoop 設置為全分佈模式需要配置 <Hadoop_home>/conf/ 目錄中的設定檔。

在 hadoop-site.xml 中配置 Hadoop 部署。 這裡的配置覆蓋 hadoop-default.xml 中的配置。


表 2. 配置屬性

屬性 解釋 fs.default.name NameNode URI mapred.job.tracker JobTracker URI dfs.replication 複製的數量 hadoop.tmp.dir 臨時目錄

hadoop-site.xml

&lt;?xml version="1.0"?&gt;&lt;?xml-stylesheet type="text/xsl" href="configuration.xsl"?&gt;&lt;!-- Put site-specific property overrides in this file. --&gt;&lt;configuration&gt; &lt;property&gt; &lt;name&gt;fs.default.name&lt;/name&gt; &lt;value&gt;hdfs:// 9.30.210.159:9000&lt;/value&gt; &lt;/property&gt; &lt;property&gt; &lt;name&gt;mapred.job.tracker&lt;/name&gt; &lt;value&gt;9.30.210.159:9001&lt;/value&gt; &lt;/property&gt; &lt;property&gt; &lt;name&gt;dfs.replication&lt;/ name&gt; &lt;value&gt;1&lt;/value&gt; &lt;/property&gt; &lt;property&gt; &lt;name&gt;hadoop.tmp.dir&lt;/name&gt; &lt;value&gt;/root/hadoop/tmp/&lt;/value&gt; &lt;/property&gt;&lt;/configuration&gt;


通過配置 hadoop-env.sh 檔指定 JAVA_HOME。 注釋掉這一行並指定自己的 JAVA_HOME 目錄。

export JAVA_HOME=&lt;JAVA_HOME_DIR&gt;


在 master 檔中添加主節點的 IP 位址。

9.30.210.159


在 slave 檔中添加從節點的 IP 位址。

9.30.210.1609.30.210.161


設置從節點

把 hadoop-site.xml、hadoop-env.sh、masters 和 slaves 複製到每個從節點;可以使用 SCP 或其他複製工具。

對 HDFS 進行格式化

運行以下命令對 HDFS 分散式檔案系統進行格式化。

&lt;Hadoop_home&gt;/bin/hadoop namenode -format


檢查 Hadoop 集群

現在,可以使用 bin/start-all.sh 啟動 Hadoop 集群。 命令輸出指出主節點和從節點上的一些日誌。 檢查這些日誌,確認一切正常。 如果弄亂了什麼東西,可以格式化 HDFS 並清空 hadoop-site.xml 中指定的臨時目錄,然後重新開機。

訪問以下 URL,確認主節點和從節點是正常的。

NameNode: HTTP://9.30.210.159:50070JobTracker: HTTP://9.30.210.159:50030


現在,已經在雲中設置了 Hadoop 集群,該運行 MapReduce 應用程式了。

創建 MapReduce 應用程式

MapReduce 應用程式必須具備 「映射」 和 「縮減」 的性質,也就是說任務或作業可以分割為小片段以進行並行處理。 然後,可以縮減每個子任務的結果,得到原任務的結果。 這種任務之一是網站關鍵字搜索。 搜索和抓取任務可以分割為子任務並分配給從節點,然後在主節點上聚合所有結果並得到最終結果。

試用應用程式範例

Hadoop 附帶一些用於測試的應用程式範例。 其中之一是單詞計數器,它統計某一單詞在幾個檔中出現的次數。 通過運行這個應用程式檢查 Hadoop 集群。

首先,把輸入檔放在分散式檔案系統中(conf/ 目錄下面)。 我們將統計單詞在這些檔中出現的次數。

$ bin/hadoop fs –put conf input


然後,運行這個應用程式範例,以下命令統計以 「dfs」 開頭的單詞出現的次數。

$ bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.] +'


命令的輸出說明映射和縮減過程。

前兩個命令會在 HDFS 中生成兩個目錄,「input」 和 「output」。 可以使用以下命令列出它們。

$ bin/hadoop fs –ls


查看分散式檔案系統中已經輸出的檔。 它以鍵-值對的形式列出以 「dfs*」 開頭的單詞出現的次數。

$ bin/hadoop fs -cat ouput/*


現在,訪問 JobTracker 網站查看完成的作業日誌。

創建 Log Analyzer MapReduce 應用程式

現在創建一個 Portal (IBM WebSphere® Portal v6.0) Log Analyzer 應用程式,它與 Hadoop 中的 WordCount 應用程式有許多共同點。 這個分析程式搜索所有 Portal 的 SystemOut*.log 檔,顯示在特定的時間段內應用程式在 Portal 上啟動了多少次。

在 Portal 環境中,所有日誌分割為 5MB 的片段,很適合由幾個節點並行地分析。


hadoop.sample.PortalLogAnalyzer.java

public class PortalLogAnalyzer { public static class Map extends MapReduceBase implements Mapper&lt;LongWritable, Text, T ext, IntWritable&gt; { private static String APP_START_TOKEN = "Application started:"; private Text application = new Text(); public void map(LongWritable key, Text value, OutputCollector&lt;Text, IntWritable&gt; output, Reporter reporter) throws I OException { String line = value.toString(); if(line.indexOf(APP_START_TOKEN) &gt; -1) { int startIndex = line.indexOf(APP _START_TOKEN); startIndex += APP_START_TOKEN.length(); String appName = line.substring(startIndex).trim(); application.set(appName); output.collect(application, new IntWritable(1)); } }} public static class Reduce extends MapReduceBase implements Reducer&lt;Text, IntWritable, Text, IntWritable&gt; { pub lic void reduce(Text key, Iterator&lt;IntWritable&gt; values, OutputCollector&lt;Text, IntWritable&gt; output, Reporter reporter) throws IOException { int sum = 0; while(values.hasNext()) { sum += values.next().get(); } output.collect(key, new IntWritable(sum)); }} public static void main(String[] args) throws IOException { JobConf jobConf = new JobConf(PortalLogAnalyzer.class); job Conf.setJobName("Portal Log Analizer"); jobConf.setOutputKeyClass(Text.class); jobConf.setOutputValueClass(IntWritable.class); jobConf.setMapperClass(Map.class); jobConf.setCombinerClass(Reduce.class); jobConf.setReducerClass(Reduce.class); jobConf.setInputFormat(TextInputFormat.class); jobConf.setOutputFormat(TextOutputFormat.class); FileInputFormat.setInputPaths(jobConf, new Path(args[0])); FileOutputFormat.setOutputPath(jobConf, new Path(args[1])); JobClient.runJob(jobConf);}}


對 Hadoop API 的完整解釋請參見 Hadoop 網站上的 API 文檔。 這裡只做簡要說明。

Map 類實現映射功能,它搜索日誌檔的每一行,尋找應用程式的名稱。 然後把應用程式名稱以鍵-值對的形式放在輸出集合中。

Reduce 類計算具有相同鍵(相同應用程式名稱)的所有值的總和。 因此,這個應用程式最終輸出的鍵-值對表示每個應用程式在 Portal 上啟動的次數。

Main 函數配置並運行 MapReduce 作業。

運行 PortalLogAnalyzer

首先,把這些 JAVA 代碼複製到主節點並編譯。 把 JAVA 代碼複製到<hadoop_home>/workspace 目錄中。 對它執行編譯並存檔在一個 Jar 檔中,後面 hadoop 命令將運行這個檔。

$ mkdir classes$ javac –cp .. /hadoop-0.19.1-core.jar –d classes hadoop/sample/PortalLogAnalyzer.java$ jar –cvf PortalLogAnalyzer.jar –C classes/ .


把 Portal 日誌複製到 workspace/input 中。 假設有多個日誌檔,其中包含 2009 年 5 月的所有日誌。 把這些日誌放到 HDFS 中。

$ bin/hadoop fs –put workspace/input input2


在運行 PortalLogAnalyzer 時,輸出說明映射和縮減過程。

$ bin/hadoop jar workspace/PortalLogAnalizer.jar hadoop.sample.PortalLogAnalizer input2 output2



圖 3. 任務的輸出

應用程式執行完之後,輸出應該與圖 4 相似。

$ bin/hadoop fs –cat output2/*



圖 4. 部分輸出

在訪問 JobTracker 網站時,會看到另一個完成的作業。 注意圖 5 中的最後一行。


圖 5. 完成的作業

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.