如何讓你的作業(yè)在Hadoop集群中真正實現(xiàn)分布式運行?
搭建過hadoop之后,如何讓程序在hadoop集群中分布式運行成了一件令人頭痛的事。
可能有人會說在eclipse的類文件中右鍵點擊-》“run on hadoop”不就行了嘛,注意:eclipse中的“run on hadoop”默認只是運行在單機上的,因為要想在集群中讓程序分布式運行還要經(jīng)歷上傳類文件、分發(fā)到各個節(jié)點等過程的,一個簡單的“run on hadoop”只是啟動了本地hadoop類庫來運行你的程序而已,在Hadoop JobTracker的web管理頁面(http://localhost:50030)上是看不到任何作業(yè)信息的,因為你的作業(yè)根本就沒有運行在集群上。
《Hadoop:the Definitive Guide 3rd edition》上介紹的是使用打jar包的方式,然后用hadoop腳本命令的jar選項來運行分布式程序。如下所示:
hadoop jar hadoop-examples.jar v3.MaxTemperatureDriver -conf conf/hadoop-cluster.xml input/ncdc/all max-temp |
但問題是這本書里面是使用maven來編譯類文件的,通過pom.xml他很容易就解決了jar包的依賴問題,這讓我等平常使用eclipse來編程的灰常依賴IDE的程序猿們情何以堪啊,maven的配置及使用方法到現(xiàn)在還沒搞懂,索性不學了,自己打jar包吧
自己打jar包就要解決類文件引用的問題,以我在程序中使用的Hbase的jar包(hbase-0.94.3.jar)為例,我先后嘗試了各種試圖解決類文件引用及打jar包的方法,無論如何,總會提示我找不到org.apache.hadoop.hbase.util.Bytes class文件(它就在hbase-0.94.3.jar中),以下為我嘗試的各種方法:
1.設(shè)置classpath到hbase-0.94.3.jar 2.設(shè)置HADOOP_CLASSPATH到hbase-0.94.3.jar 3.設(shè)置HADOOP_CLASSPATH到HBASE_HOME 4.把hbase-0.94.3.jar打包到運行的jar包中(其中包括了1.直接打進jar包;2.放入lib文件夾再打入jar包;3.通過manifest文件設(shè)置Class-Path選項指向hbase-0.94.3.jar) 5.把hbase-0.94.3.jar復(fù)制到HADOOP_HOME/lib下面
直至這個時候我已要接近崩潰了,要知道光是解決這個問題已花費了我接近三天的時間,仍是一無所獲,索性不做了改弄其他東西,如此10多天過去了。
等忙完這10多天,另一個解決問題的角度出現(xiàn)了,既然自己在命令行下打包不行,為何不使用eclipse呢(說到底還是屈服于IDE了,我鄙視我自己?。?。剛開始是直接把整個項目導(dǎo)出成jar包,但這樣只是包含了自己編寫的源文件及l(fā)ib文件夾下的依賴jar包,并沒有包含hadoop-core之類的引用第三方j(luò)ar包,按著這個思路就去google了下如何完整的把引用的第三方j(luò)ar包也包含進來的打包方式,還真給找到了:Fat-jar!(下載地址)
下載之后解壓縮,會得到一個名為net.sf.fjep.fatjar_0.0.31.jar(版本不同,名字可能不同)的jar包,把它拷到eclipse_home/plugins中然后重啟eclipse,如果在Windows=>prefernce=>fat jar preference看到它就說明已經(jīng)安裝成功了。
接下來,在需要導(dǎo)出的Java項目上右擊,選擇“導(dǎo)出”,選擇”其他”中的”Fat Jar EXporter”,即可進行打包操作。注意選擇好”Main-class”以及需要打包的文件。“finish”之后你就會得到一個完整的jar包了,這樣便可以在任何地方通過hadoop jar命令來運行了,以我的程序為例:
hadoop jar HDG3.jar cf/RateDataImporter //HDG3.jar為我的jar包的名字,共64Mb,cf/RateDataImporter為我要運行的類文件名字 |
在jobtracker的web管理界面可以很清楚的看到此作業(yè)的信息,以及正在運行的進度、狀態(tài)等,感覺很爽的有木有(雖然我的集群只有兩個節(jié)點)!
至此,折騰了許久的hadoop集群運行分布式作業(yè)問題終于解決!