文章出處

  繼續研究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插件的界面:

  圖片一:

  圖片二:

  生成時候要注意的問題:

  1. hadoop的不同版本需要針對不同版本的eclipse插件,一般版本不對應,eclipse插件可能不能正常的使用,如果有些童鞋不想自己生成,那么就得在網路上下載對應的版本的eclipse插件,要是想自己制作,就得在自己使用的hadoop版本下生成eclipse插件。
  2. 制作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的理解。

 

 

 

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()