用 Hadoop 进行分布式并行编程, 第 3 部分 部署到分布式环境
一 前言
在本系列文章的第一篇:用 Hadoop 進(jìn)行分布式并行編程,第 1 部分: 基本概念與安裝部署中,介紹了 MapReduce 計(jì)算模型,分布式文件系統(tǒng) HDFS,分布式并行計(jì)算等的基本原理, 并且詳細(xì)介紹了如何安裝 Hadoop,如何在單機(jī)及偽分布式環(huán)境 (在一臺(tái)單機(jī)中用多進(jìn)程模擬) 運(yùn)行基于 Hadoop 的并行程序。在本系列文章的第二篇:用 Hadoop 進(jìn)行分布式并行編程,第 2 部分:程序?qū)嵗c分析中,介紹了如何針對(duì)一個(gè)具體的計(jì)算任務(wù),基于 Hadoop 編寫(xiě) MapReduce 并行程序。 本文將介紹真實(shí)的 Hadoop 分布式運(yùn)行環(huán)境, 包括如何在多臺(tái)普通的計(jì)算機(jī)上部署分布式運(yùn)行環(huán)境,如何將 MapReduce 程序遠(yuǎn)程部署并運(yùn)行在這個(gè)分布式環(huán)境上,并簡(jiǎn)略介紹了”云計(jì)算平臺(tái)” 以及計(jì)算能力按需租用服務(wù)。
回頁(yè)首
二 準(zhǔn)備工作
1. 硬件與網(wǎng)絡(luò)
使用三臺(tái)機(jī)器,機(jī)器名分別為 homer06, homer07, homer08,均安裝 Redhat Enterprise Linux 5.0 (其它 Linux 發(fā)行版亦可), 確保各臺(tái)機(jī)器之間網(wǎng)絡(luò)暢通,機(jī)器名與 IP 地址之間解析正確,從任一臺(tái)機(jī)器都可以 ping 通其它機(jī)器的機(jī)器名。如有機(jī)器名的解析問(wèn)題,可通過(guò)設(shè)置 /etc/hosts 文件解決,當(dāng)然更好的解決方法是在你的網(wǎng)絡(luò)中配置 DNS 服務(wù)器。此外,需要在三臺(tái)機(jī)器上創(chuàng)建相同的用戶帳號(hào),如 caoyuz, 或直接使用 root 帳號(hào)亦可。
我們將使用 homer06 作為分布式文件系統(tǒng) HDFS 的 Name Node 及 MapReduce 運(yùn)行過(guò)程中的 Job Tracker 結(jié)點(diǎn),我們將 homer06 稱之為主結(jié)點(diǎn)。其它兩臺(tái)機(jī)器 (homer07, homer08) 作為 HDFS 的 Data Node 以及 MapReduce 運(yùn)行過(guò)程中的 Task Tracker 結(jié)點(diǎn),這些結(jié)點(diǎn)可統(tǒng)稱為從結(jié)點(diǎn)。如你需要部署更多的機(jī)器,也是很容易的,將新加入的機(jī)器作為 Data Node 以及 Task Tracker 結(jié)點(diǎn)即可,其配置過(guò)程與本文介紹的三臺(tái)機(jī)器的環(huán)境類似,此不贅述。
2. SSH 配置
在 Hadoop 分布式環(huán)境中,Name Node (主節(jié)點(diǎn)) 需要通過(guò) SSH 來(lái)啟動(dòng)和停止 Data Node (從結(jié)點(diǎn))上的各類進(jìn)程。我們需要保證環(huán)境中的各臺(tái)機(jī)器均可以通過(guò) SSH 登錄訪問(wèn),并且 Name Node 用 SSH 登錄 Data Node 時(shí),不需要輸入密碼,這樣 Name Node 才能在后臺(tái)自如地控制其它結(jié)點(diǎn)。可以將各臺(tái)機(jī)器上的 SSH 配置為使用無(wú)密碼公鑰認(rèn)證方式來(lái)實(shí)現(xiàn)。
現(xiàn)在流行的各類 Linux 發(fā)行版一般都安裝了 SSH 協(xié)議的開(kāi)源實(shí)現(xiàn) OpenSSH, 并且已經(jīng)啟動(dòng)了 SSH 服務(wù), 即這些機(jī)器缺省應(yīng)該就是支持 SSH 登錄的。如果你的機(jī)器缺省不支持 SSH, 請(qǐng)下載安裝 OpenSSH。
以下是配置 SSH 的無(wú)密碼公鑰認(rèn)證的過(guò)程。首先,在 homer06 機(jī)器上執(zhí)行命令,如代碼清單 1 所示:
代碼清單1
homer06: $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/caoyuz/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/caoyuz/.ssh/id_rsa. Your public key has been saved in /home/caoyuz/.ssh/id_rsa.pub. The key fingerprint is: 2e:57:e2:bf:fd:d4:45:5c:a7:51:3d:f1:51:3c:69:68 root@krusty04這個(gè)命令將為 homer06 上的當(dāng)前用戶 caoyuz 生成其密鑰對(duì),密鑰對(duì)的保存路徑使用缺省的 /home/caoyuz/.ssh/id_rsa, 要求輸入 passphrase 的時(shí)候,直接回車。這樣生成的證書(shū)以及公鑰將存儲(chǔ)在 /home/caoyuz/.ssh 目錄,形成兩個(gè)文件 id_rsa,id_rsa.pub。然后將 id_rsa.pub 文件的內(nèi)容復(fù)制到每一臺(tái)機(jī)器(包括本機(jī) homer06)的 /home/caoyuz/.ssh/authorized_keys 文件的尾部,如果機(jī)器上不存在 /home/caoyuz/.ssh/authorized_keys 文件,可以自行創(chuàng)建一個(gè)。請(qǐng)注意 id_rsa.pub 文件的內(nèi)容是長(zhǎng)長(zhǎng)的一行,復(fù)制時(shí)需注意,不要遺漏字符或混入了多余換行符。
接下來(lái)可以做一下 SSH 連接測(cè)試,從 homer06 分別向 homer06, homer07, homer08 發(fā)起 SSH 連接請(qǐng)求,確保不需要輸入密碼就能 SSH 連接成功。 注意第一次 SSH 連接時(shí)會(huì)出現(xiàn)如下提示信息:
The authenticity of host [homer06] can't be established. The key fingerprint is: 74:32:91:f2:9c:dc:2e:80:48:73:d4:53:ab:e4:d3:1a Are you sure you want to continue connecting (yes/no)?
請(qǐng)輸入 yes, 這樣 OpenSSH 會(huì)把連接過(guò)來(lái)的這臺(tái)主機(jī)的信息自動(dòng)加到 /home/caoyuz/.ssh/know_hosts 文件中去,第二次再連接時(shí),就不會(huì)有這樣的提示信息了。
回頁(yè)首
三 安裝部署 Hadoop
1. 安裝 Hadoop 及 jre1.5
我們首先在主控結(jié)點(diǎn) homer06 上安裝和配置好 Hadoop,安裝過(guò)程可以參考本系列文章的第一篇。 假定我們把 Hadoop 安裝在 /home/caoyuz/hadoop-0.16.0目錄中,并且 JRE 1.5 安裝在 /home/caoyuz/jre 目錄下。
2. 修改 conf/hadoop-env.sh 文件
在其中設(shè)置 JAVA_HOME 環(huán)境變量:export JAVA_HOME=”/home/caoyuz/jre”
3. 修改 conf/hadoop-site.xml 文件
在本系列文章的第一篇中,我們通過(guò)修改此文件,配置了 Hadoop 的偽分布式運(yùn)行模式。現(xiàn)在,我們同樣可以通過(guò)配置此文件,配置 Hadoop 的真實(shí)的分布式運(yùn)行環(huán)境。請(qǐng)參照代碼清單 2 修改 conf/hadoop-site.xml:
代碼清單2
<configuration> <property> <name>fs.default.name</name> <value>homer06.austin.ibm.com:9000</value> <description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description> </property> <property> <name>mapred.job.tracker</name> <value>homer06.austin.ibm.com:9001</value> <description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task.</description> </property> <name>dfs.name.dir</name> <value>/home/caoyuz/hadoopfs/name</value> <description>Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. </description> </property> <property> <name>dfs.data.dir</name> <value>/home/caoyuz/hadoopfs/data</value> <description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.</description> </property> <property> <name>dfs.replication</name> <value>2</value> <description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.</description> </property> </configuration>參數(shù) fs.default.name 指定 Name Node 的 IP 地址和端口號(hào),此處我們將其設(shè)定為 homer06 及 9000 端口,參數(shù) mapred.job.tracker 指定 JobTracker 的 IP 地址和端口號(hào),此處我們將其設(shè)定為 homer06 及 9001 端口。 參數(shù) dfs.name.dir 指定 Name Node 相關(guān)數(shù)據(jù)在本地文件系統(tǒng)上的存放位置, 此處我們將其設(shè)定為 /home/caoyuz/hadoopfs/name ,參數(shù) dfs.data.dir 指定 Data Node 相關(guān)數(shù)據(jù)在本地文件系統(tǒng)上的存放位置,此處我們將其設(shè)定為 /home/caoyuz/hadoopfs/data 。注意, Hadoop 會(huì)自動(dòng)創(chuàng)建這兩個(gè)目錄,無(wú)需事先創(chuàng)建。
更多的參數(shù)配置,可以參考 conf/hadoop-default.xml 文件,并在 conf/hadoop-site.xml 文件中設(shè)置。
4. 設(shè)定主從節(jié)點(diǎn)
修改 conf/masters 文件,將其中的 localhost 改為 homer06 ,修改 conf/slaves 文件, 刪掉其中的 localhost, 將我們的另兩臺(tái)機(jī)器 homer07, homer08 加入, 注意每個(gè)機(jī)器一行。
5. 將 Hadoop 部署到其它機(jī)器上去
至此, 我們已經(jīng)在 homer06 上安裝和配置好了 hadoop 和 jre, 現(xiàn)在需要將其部署到其它機(jī)器上去,通過(guò) scp 命令即可完成,如代碼清單 3 所示:
代碼清單3
homer06: $ scp -r /home/caoyuz/hadoop-0.16.0 homer07:/home/caoyuz/hadoop-0.16.0 homer06: $ scp -r /home/caoyuz/jre homer07:/home/caoyuz/jre homer06: $ scp -r /home/caoyuz/hadoop-0.16.0 homer08:/home/caoyuz/hadoop-0.16.0 homer06: $ scp -r /home/caoyuz/jre homer08:/home/caoyuz/jre其中用 scp 拷貝 jre 目錄到其它機(jī)器上去不是必須的。你只需保證你的所有機(jī)器上均安裝了 JRE1.5 以上版本,并且都是安裝在同一目錄。
6. 在 homer06 上格式化一個(gè)新的分布式文件系統(tǒng)
如代碼清單 4 所示:
代碼清單4
homer06: $ cd /home/caoyuz/hadoop-0.16.0 homer06: $ bin/hadoop namenode -format7. 在 homer06 上啟動(dòng) hadoop 進(jìn)程
如代碼清單5所示:
代碼清單5
homer06: $ cd /home/caoyuz/hadoop-0.16.0 homer06: $ bin/start-all.sh啟動(dòng)完成之后,運(yùn)行 ps -ef 命令應(yīng)該可以看到 homer06 上啟動(dòng)了 3 個(gè)新的 java 進(jìn)程 (namenode, secondary namenode, jobtracker), 同時(shí),我們可以到 homer07, homer08 兩臺(tái)機(jī)器上用 ps –ef 查看,這兩臺(tái)機(jī)器上應(yīng)該已經(jīng)自動(dòng)啟動(dòng)了 2 個(gè)新的 java 進(jìn)程 (datanode, tasktracker)
回頁(yè)首
四 運(yùn)行 Hadoop 程序
至此,整個(gè) Hadoop 分布式環(huán)境已經(jīng)部署完畢,并已啟動(dòng)相關(guān)后臺(tái)進(jìn)程。現(xiàn)在我們可以嘗試運(yùn)行一下我們?cè)诘诙恼轮薪榻B的 wordcount 程序,如代碼清單 6 所示:
代碼清單 6
homer06: $ mkdir -p /home/test-in # 請(qǐng)先將待測(cè)的文件放到本地文件系統(tǒng)的/home/test-in目錄 homer06: $ cd /home/caoyuz/hadoop-0.16.0 homer06: $ bin/hadoop dfs –put /home/test-in input # 將本地文件系統(tǒng)上的 /home/test-in 目錄拷到 HDFS 的根目錄上,目錄名改為 input $ bin/hadoop jar hadoop-0.16.0-examples.jar wordcount input output #查看執(zhí)行結(jié)果: # 將文件從 HDFS 拷到本地文件系統(tǒng)中再查看: $ bin/hadoop dfs -get output output $ cat output/* # 也可以直接查看 $ bin/hadoop dfs -cat output/*代碼清單 6 所示的執(zhí)行 wordcount 程序的過(guò)程,與我們?cè)诘谝黄恼轮薪榻B的在偽分布式運(yùn)行環(huán)境運(yùn)行完全一致,但我們現(xiàn)在擁有了一個(gè)真正的分布式執(zhí)行環(huán)境,我們的數(shù)據(jù)分布存儲(chǔ)于數(shù)據(jù)節(jié)點(diǎn) homer07 及 homer08 上,可以在這兩臺(tái)機(jī)器的 /home/caoyuz/hadoopfs/data 目錄 (這是我們?cè)?conf/hadoop-site.xml 中指定的 dfs.data.dir 參數(shù)) 下看到一些數(shù)據(jù)文件,并且整個(gè) wordcount 的計(jì)算過(guò)程神奇地由 homer06, homer07, homer08 三臺(tái)機(jī)器并行協(xié)同完成,我們還可以很方便的增加更多的機(jī)器來(lái)參與運(yùn)算。這就是分布式并行程序的優(yōu)勢(shì): 可以很容易地通過(guò)加入新的機(jī)器來(lái)獲得更多的存儲(chǔ)空間和計(jì)算能力, 部署的機(jī)器越多, 就越能有效地完成海量數(shù)據(jù)的計(jì)算。
回頁(yè)首
五 使用 IBM MapReduce Tools 部署分布式程序
在第二篇文章中,已經(jīng)介紹了 IBM MapReduce Tools 的基本功能和用法。現(xiàn)在我們重點(diǎn)介紹如何使用 IBM MapReduce Tools 將 MapReduce 程序遠(yuǎn)程部署到 Hadoop 分布式環(huán)境中去運(yùn)行。
假定我們還是使用上一節(jié)部署完成的分布式環(huán)境,然后是在另一臺(tái)機(jī)器上使用 Eclipse 開(kāi)發(fā) MapReduce 程序。
1. 定義 Hadoop server 的位置
首先請(qǐng)確保你的 Eclipse 已經(jīng)安裝了 IBM MapReduce Tools 這個(gè)插件。啟動(dòng) Eclipse, 選擇 Window -> Open Perspective ->other, 再?gòu)膹棾隹蛑羞x擇 MapReduce, 這樣 Eclipse 會(huì)進(jìn)入專門(mén)的 MapReduce 視圖 ( perspective )。
隨后,請(qǐng)檢查你的 MapReduce perspective中是否有一個(gè)專門(mén)的 MapReduce Servers view, 如果沒(méi)有,請(qǐng)選擇 Window -> Show View ->other, 再?gòu)膹棾隹蛑羞x擇 MapReduce Tools 類別下面的 MapReduce Servers, 打開(kāi)這個(gè) view.
然后,請(qǐng)點(diǎn)擊 MapReduce Servers view 右上角的藍(lán)色圖標(biāo),就會(huì)出現(xiàn)如圖一所示的設(shè)置 Hadoop Server 的位置的界面。此處所說(shuō)的 Hadoop server,具體到本文,就是 homer06 這臺(tái)機(jī)器。在輸入各項(xiàng)參數(shù)之后,請(qǐng)點(diǎn)擊 ”Validate location” 按鈕,檢查是否能夠正確的找到并連接上你的 Hadoop server. 如果出錯(cuò),請(qǐng)嘗試在命令行下執(zhí)行命令:ssh the_hostname_of_your_hadoop_server, (或使用圖形界面的 SSH 遠(yuǎn)程登錄軟件), 確保 ssh 能夠連接成功。
圖一 定義 Hadoop server 的位置
2. 創(chuàng)立一個(gè) MapReduce Project
在 Eclipse 中新創(chuàng)建一個(gè) MapReduce Project, 將我們?cè)诘诙恼轮卸x的 WordCount 類加到此 Project 中。這個(gè)類需要略作修改才能直接遠(yuǎn)程部署到我們已經(jīng)搭建好的分布式環(huán)境中去運(yùn)行,因?yàn)槲覀冊(cè)瓉?lái)在 WordCount 程序中是通過(guò)讀取命令行參數(shù)獲得計(jì)算任務(wù)的輸入路徑和輸出路徑,而當(dāng)前版本的 IBM MapReduce Tools 不支持遠(yuǎn)程部署時(shí)讀取命令行參數(shù)。為測(cè)試的簡(jiǎn)便起見(jiàn),我在程序中直接將輸入路徑定義為 input, 輸出路徑定義為 output。在測(cè)試 WordCount 程序之前,需要事先將需要做詞頻統(tǒng)計(jì)的一批文件拷貝到分布式文件系統(tǒng)的 input 目錄下去。
完整的 WordCount 類的代碼如代碼清單 7 所示:
代碼清單7
//import 語(yǔ)句省略 public class WordCount extends Configured implements Tool {public static class MapClass extends MapReduceBaseimplements Mapper<LongWritable, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();private String pattern="[^\\w]";public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {String line = value.toString().toLowerCase();line = line.replaceAll(pattern, " ");StringTokenizer itr = new StringTokenizer(line);while (itr.hasMoreTokens()) {word.set(itr.nextToken());output.collect(word, one);}}}public static class Reduce extends MapReduceBaseimplements Reducer<Text, IntWritable, Text, IntWritable> {public void reduce(Text key, Iterator<IntWritable> values,OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {int sum = 0;while (values.hasNext()) {sum += values.next().get();}output.collect(key, new IntWritable(sum));}}public int run(String[] args) throws Exception {Path tempDir = new Path("wordcount-temp-" + Integer.toString(new Random().nextInt(Integer.MAX_VALUE)));JobConf conf = new JobConf(getConf(), WordCount.class);try {conf.setJobName("wordcount");conf.setOutputKeyClass(Text.class);conf.setOutputValueClass(IntWritable.class);conf.setMapperClass(MapClass.class);conf.setCombinerClass(Reduce.class);conf.setReducerClass(Reduce.class);conf.setInputPath(new Path(args[0]));conf.setOutputPath(tempDir);conf.setOutputFormat(SequenceFileOutputFormat.class);JobClient.runJob(conf);JobConf sortJob = new JobConf(getConf(), WordCount.class);sortJob.setJobName("sort");sortJob.setInputPath(tempDir);sortJob.setInputFormat(SequenceFileInputFormat.class);sortJob.setMapperClass(InverseMapper.class);sortJob.setNumReduceTasks(1); sortJob.setOutputPath(new Path(args[1]));sortJob.setOutputKeyClass(IntWritable.class);sortJob.setOutputValueClass(Text.class);sortJob.setOutputKeyComparatorClass(IntWritableDecreasingComparator.class);JobClient.runJob(sortJob);} finally {FileSystem.get(conf).delete(tempDir);}return 0;}private static class IntWritableDecreasingComparator extends IntWritable.Comparator {public int compare(WritableComparable a, WritableComparable b) {return -super.compare(a, b);}public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {return -super.compare(b1, s1, l1, b2, s2, l2);}}public static void main(String[] args) throws Exception {String[] paths = {"input" , "output"};int res = ToolRunner.run(new Configuration(), new WordCount(), paths);System.exit(res);} }3. 遠(yuǎn)程部署與運(yùn)行
在左側(cè)的 Project Explorer 中選中 WordCount 類,在右鍵彈出菜單中選擇 Run As->Run on hadoop, 如圖二 所示:
圖二
然后在 “select hadoop server” 彈出框中選擇我們已經(jīng)定義好的 Hadoop server, 點(diǎn)擊 Finish 之后,MapReduce Tool 會(huì)自動(dòng)將 WordCount project打包成一個(gè) jar 并拷到遠(yuǎn)程 Hadoop server 上運(yùn)行起來(lái), 整個(gè)運(yùn)行過(guò)程的輸出在 Eclipse 的 console 中即可看到,非常方便。
4. 查看運(yùn)行結(jié)果
當(dāng)定義好 Hadoop server 的位置之后,在左側(cè)的 Project Explorer 會(huì)出現(xiàn)一個(gè)新的 project( 項(xiàng)目名前面有一個(gè)藍(lán)色的小象圖標(biāo)), , 通過(guò)這個(gè) project 可以瀏覽 Hadoop 分布式文件系統(tǒng)中的文件。雙擊 output 目錄下的 part-0000 文件,我們就可以直接在 Eclipse 中查看 WordCount 程序的輸出結(jié)果,如圖三所示:
圖三
回頁(yè)首
六 云計(jì)算與 Hadoop
我們知道,在分布式集群環(huán)境中才能發(fā)揮 Hadoop 的并行優(yōu)勢(shì),擁有的機(jī)器數(shù)量越多,越能快速有效的處理海量數(shù)據(jù)。現(xiàn)實(shí)問(wèn)題是,雖然很多公司都有處理海量數(shù)據(jù)的需求,卻又不可能專門(mén)投資去搭建大規(guī)模的集群環(huán)境,Hadoop 于他們,不免淪為”屠龍之技”,無(wú)處發(fā)揮其優(yōu)勢(shì),如之奈何?在過(guò)去,這個(gè)問(wèn)題還真是難以解決,今天的情況就不一樣了。讀者如果關(guān)注 IT 業(yè)界動(dòng)態(tài),當(dāng)知現(xiàn)在 IT 業(yè)界正在極力鼓吹”云計(jì)算”, 并有一些公司開(kāi)始投資搭建所謂的”云計(jì)算平臺(tái)”,這里的”云”, 就是一堆機(jī)器組成的分布式環(huán)境外加一些基礎(chǔ)構(gòu)架軟件和管理軟件,其中便會(huì)有類似于 Hadoop 這樣的分布式計(jì)算軟件,HDFS 這樣的分布式文件系統(tǒng),有需求的公司和個(gè)人可以到這樣的”云計(jì)算平臺(tái)”上去租用存儲(chǔ)空間,租用計(jì)算結(jié)點(diǎn)(計(jì)算能力)做分布式運(yùn)算。
比如 Amazon 公司基于 Hadoop 推出了 Amazon S3 ( Amazon Simple Storage Service ),提供可靠,快速,可擴(kuò)展的網(wǎng)絡(luò)存儲(chǔ)服務(wù),以及一個(gè)商用的云計(jì)算平臺(tái) Amazon EC2 ( Amazon Elastic Compute Cloud )。用戶可以將其數(shù)據(jù)存儲(chǔ)在 Amazon S3 分布式存儲(chǔ)平臺(tái)上, 然后到 Amazon EC2 上去租用計(jì)算能力,完成對(duì)數(shù)據(jù)的計(jì)算。Amazon EC2 提供所謂的按需租用服務(wù),目前的收費(fèi)標(biāo)準(zhǔn)是每臺(tái)虛擬計(jì)算機(jī) (Amazon EC2 稱之為一個(gè) instance) 每小時(shí)0.10美元。與傳統(tǒng)的主機(jī)租用服務(wù)完全不同,用戶可以根據(jù)自己某次運(yùn)算處理的規(guī)模,租用相應(yīng)數(shù)量的虛擬計(jì)算機(jī),運(yùn)算完畢后就可以釋放你租用的虛擬計(jì)算機(jī),Amazon 則會(huì)根據(jù)你租用的虛擬計(jì)算機(jī)的數(shù)量以及本次計(jì)算的實(shí)際運(yùn)行時(shí)間向你收費(fèi),等于說(shuō)你花錢(qián)租用計(jì)算能力,但不會(huì)浪費(fèi)一個(gè)子兒。IBM 公司的云計(jì)算平臺(tái)"藍(lán)云"也面向企業(yè)用戶提供了類似的功能。
如果我們打算基于 Hadoop 編寫(xiě)分布式并行程序來(lái)處理大量的數(shù)據(jù),完全可以到 IBM, Amazon 等提供的云計(jì)算平臺(tái)上去進(jìn)行計(jì)算,對(duì)于 IBM 藍(lán)云,Amazon S3, Amazon EC2 的詳細(xì)介紹超出了本文范圍,有興趣的讀者可以去其官方網(wǎng)站了解更多的信息。
回頁(yè)首
七 結(jié)束語(yǔ)
這是系列文章的最后一篇。第一篇文章介紹了 MapReduce 計(jì)算模型,分布式文件系統(tǒng) HDFS,分布式并行計(jì)算等的基本原理, 如何安裝和部署單機(jī) Hadoop 環(huán)境, 在第二篇文章中,我們實(shí)際編寫(xiě)了一個(gè) Hadoop 并行計(jì)算程序,并了解了一些重要的編程細(xì)節(jié),了解了如何使用 IBM MapReduce Tools 在 Eclipse 環(huán)境中編譯,運(yùn)行和調(diào)試 Hadoop 并行計(jì)算程序。本篇文章則詳細(xì)介紹了如何部署分布式 Hadoop 環(huán)境,如何利用 IBM MapReduce Tools 將程序部署到分布式環(huán)境中運(yùn)行,并簡(jiǎn)略介紹了現(xiàn)在流行的”云計(jì)算平臺(tái)” 以及計(jì)算能力按需租用服務(wù)。
希望這三篇文章能起到一個(gè)拋磚引玉的作用,讓你感受到 MapReduce 分布式并行編程的樂(lè)趣并從此入門(mén)且樂(lè)在其中,為即將到來(lái)的所謂”云計(jì)算”時(shí)代提前熱熱身。
聲明:本文僅代表作者個(gè)人之觀點(diǎn),不代表 IBM 公司之觀點(diǎn)。
參考資料
學(xué)習(xí)
- 訪問(wèn)?Hadoop 官方網(wǎng)站,了解 Hadoop 及其子項(xiàng)目 HBase 的信息。
- Hadoop wiki上, 有許多 Hadoop 的用戶文檔,開(kāi)發(fā)文檔,示例程序等。
- 閱讀 Google Mapduce 論文:?MapReduce: Simplified Data Processing on Large Clusters, 深入了解 Mapreduce 計(jì)算模型。
- 深入了解 Hadoop 分布式文件系統(tǒng) HDFS:?The Hadoop Distributed File System:Architecture and Design
- 深入了解 Google 文件系統(tǒng) GFS:?The Google File System, Hadoop HDFS 實(shí)現(xiàn)了與 GFS 類似的功能。
- IBM MapReduce Tools:?http://www.alphaworks.ibm.com/tech/mapreducetools,
總結(jié)
以上是生活随笔為你收集整理的用 Hadoop 进行分布式并行编程, 第 3 部分 部署到分布式环境的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用 Hadoop 进行分布式并行编程,
- 下一篇: 决策树算法介绍及应用