繼續研究hadoop,有童鞋問我,為啥不接著寫hive的文章了,原因主要是時間不夠,我對hive的研究基本結束,現在主要是hdfs和mapreduce,能寫文章的時間也不多,只有周末才有時間寫文章,所以最近的文章都是寫hdfs和mapreduce。不過hive是建立在hdfs和mapreduce之上,研究好hdfs和mapreduce也是真正用好hive的前提。
今天的內容是mapreduce,經過這么長時間的學習,我對hadoop的相關技術理解更加深入了,這回我會盡全力講解好mapreduce。
第一篇文件時研究mapreduce前的準本工作。
研究hadoop的準備工作
要研究好hadoop,一定得有個完善的開發環境(對任何編程技術都是這樣的,因為it技術是一個實踐技術,光看書是很難對it技術有深入的理解)。我現在為自己建立的開發環境包括:
在公司
用4臺服務器搭建了一個hadoop集群,里面裝好了hdfs,mapreduce,hive和hbase,工作機上為eclipse安裝了mapreduce插件,可以在本地開發mapreduce程序,執行時候可以遠程調用搭建好的hadoop集群(缺憾是遠程調試沒有部署好,但是我覺得大部分開發使用本地調試就足夠)。Hadoop集群的安裝,博客園里蝦皮的博客寫的十分全面,這里我就不在累述了,貼出蝦皮博文的地址:
http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503949.html
至于eclipse插件的問題,我在后面會做詳細論述。
在我自己筆記本里
在window7系統下安裝了一個hadoop偽分布式的集群,不過這個集群不太好,非常慢,可能是我電腦配置太低了,偽分布式的安裝我就不做描述了,實際意義不大,因為我覺得要是真想研究hadoop還是使用linux安裝真實集群比較好,不過根據我個人實踐偽分布式安裝我碰到的問題最多,如果有些童鞋想在windows下安裝個偽分布式系統玩玩,碰到啥問題不知道怎么解決,可以加入我建立的QQ群,我有空會在群里解答。在我自己電腦里我也安裝了eclipse插件,連接本地偽分布式集群。
Hadoop的eclipse插件的制作
這里我要重點講講hadoop的eclipse插件的制作。我最早安裝hadoop的eclipse插件時候是從網上下載的,當時我搭建集群上使用的hadoop版本是1.0.4,下載到的插件式1.0版本以下,安裝到eclipse里面后沒辦法正常使用,因此我研究了下hadoop的eclipse插件生成的技術,下面我就闡述如何制作hadoop的eclipse插件。
Hadoop的eclipse插件包含在hadoop的安裝包(這個安裝包是指包含源程序的安裝包,不是指二進制的安裝包),如下圖所示:
大家解壓程序后,找到下面的文件夾,我的筆記本里路徑是:
E:\hadooptest\hadoop-1.1.2\src\contrib\eclipse-plugin
這下面放的就是eclipse插件的相關程序。
制作eclipse插件前我們要確認自己電腦是不是安裝了jdk,jdk的版本一定要1.6以上,還要安裝ant,這兩個都安裝好后就可以開始制作eclipse插件了。
首先要改下相關的配置文件:
第一個配置文件:
E:\hadooptest\hadoop-1.1.2\src\contrib\eclipse-plugin\build.xml
在<target name="jar" depends="compile" unless="skip.contrib">下面加入:
<copy file="${hadoop.root}/lib/commons-configuration-1.6.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/commons-lang-2.4.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/jackson-core-asl-1.8.8.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/jackson-mapper-asl-1.8.8.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/commons-httpclient-3.0.1.jar" todir="${build.dir}/lib" verbose="true"/>
在build.xml文件里我們發現,它還依賴:E:\hadooptest\hadoop-1.1.2\src\contrib\ build-contrib.xml文件,在該文件里我們也要做相應的修改,這個修改很簡單,修改這個配置即可:
<property name="hadoop.root" location="E:/hadooptest/hadoop-1.1.2"/>
Location指向你本地安裝的hadoop路徑。
還有個文件要做相應的修改,文件路徑是:
E:\hadooptest\hadoop-1.1.2\src\contrib\eclipse-plugin\META-INF\MANIFEST.MF,
修改的選項是Bundle-ClassPath:下面的內容,我的修改是:
Bundle-ClassPath: classes/,lib/hadoop-core-1.1.2.jar,lib/commons-cli-1.2.jar,commons-configuration-1.6.jar,commons-lang-2.4.jar,jackson-core-asl-1.8.8.jar,jackson-mapper-asl-1.8.8.jar,commons-httpclient-3.0.1.jar
這樣所有的配置都配好了,下面我們使用ant命令來生成eclipse插件,首先我們要打開命令行的操作界面,使用cmd開啟,如果將路徑定位到E:\hadooptest\hadoop-1.1.2\src\contrib\eclipse-plugin\,輸入如下命令:
ant –Declipse-home= E:\work\eclipse-jee-juno-win32\eclipse -Dversion=1.1.2
運行成功后,就會在 E:\hadooptest\hadoop-1.1.2\src\contrib\eclipse-plugin目錄下生成eclipse插件的jar包,我們將生成的jar包復制到E:\work\eclipse-jee-juno-win32\eclipse\plugins文件夾下,重新啟動eclipse,插件就安裝成功了,該插件的目的是本地編寫的mapreduce程序可以遠程調用集群上的hadoop應用,下面是我安裝好的eclipse插件的界面:
圖片一:
圖片二:
生成時候要注意的問題:
- hadoop的不同版本需要針對不同版本的eclipse插件,一般版本不對應,eclipse插件可能不能正常的使用,如果有些童鞋不想自己生成,那么就得在網路上下載對應的版本的eclipse插件,要是想自己制作,就得在自己使用的hadoop版本下生成eclipse插件。
- 制作eclipse插件時候,我們也會指定eclipse.home的路徑,這就會導致插件制作時候對eclipse版本相關,我制作插件時候,在我自己的筆記本上使用的是Juno版本,那么它在Juno版本下安裝插件沒有任何問題,在公司電腦里使用的eclipse版本是helio版本,我發現生成的插件不能在Juno下正常安裝,當然這個問題是否真的按我所述,我也不能完全確定,但至少我實踐中覺得版本還是很重要。
Eclipse開發環境讀取源碼的方式
It行業的競爭越來越激烈,it公司對程序員的要求也越來越高,很多公司重要崗位都要求程序員研究過某某程序的源碼,但是我們專門去讀源碼其實是一件很困難的事情,除非你對這個框架使用極其熟悉,要不一定是越看越迷糊,越看越沒信心,如果我們可以把學習某個框架編程同時也能讀讀源碼的程序,這樣操作一定會對你的學習事半功倍。
下面我將我的一個經驗貼出來,這個方式很簡單,很多人都使用到,但是可能都沒留意,具體如下:
首先我建一個工程JavaJar,如圖所示:
代碼如下:
package cn.com.jar; import java.util.StringTokenizer; public class StringJar { public String line; public StringJar(String line) { super(); this.line = line; } public String testftn(){ String strs = null; StringTokenizer st = new StringTokenizer(line); while(st.hasMoreElements()){ strs += st.nextToken() + "@!@"; } return strs; } public static void main(String[] args) { StringJar jar = new StringJar("I am XXX hello world"); System.out.println(jar.testftn()); } }
然后我將工程編譯成一個jar包,如圖所示:
下面,我再建一個工程:testprj,導入該jar包,如圖所示:
我們編寫測試程序,如下所示:
package cn.com.test; import cn.com.jar.StringJar; public class TestMain { /** * @param args */ public static void main(String[] args) { StringJar jar = new StringJar("I am XXX hello world"); System.out.println(jar.testftn()); } }
下面我將StringJar類移入到testprj工程,如圖所示:
我們在程序里設置斷點,再debug運行程序,我們會發現,斷點進入了。
由上面的現象給我一個啟示,我們使用插件編寫mapreduce程序時候,如果我們對某些代碼感興趣,就把源碼放到工程里,可以有針對的進行調試。當然有些童鞋會說把源碼直接導入到eclipse里面,不是全有了嗎?我覺得那樣做法不是太清晰,有針對的放入源碼能縮小我們學習的范圍,更有針對性。
此外,hadoop遠程調用時候很容易會不能正常運行,這個時候需要更改源碼,如果我們沒有上面的方式,那么我們就必須重新編譯hadoop-core-XXX.jar包,這就增加了操作難度,那么上面的操作方式會給我們帶來便利,例如下圖所示:
紅框里面就是我注釋的代碼。
好了,早上的文章寫完了,下午我將詳細講解我對mapreduce的理解。
文章列表