Hadoop作業提交分析(二)

     上一篇我們分析了bin/hadoop腳本,知道了提交一個Hadoop作業所需要的基本設置以及真正執行任務提交的類。這一篇我們就來分析這個提交任務的類org.apache.hadoop.util.RunJar,看它內部具體又做了些什麼。

     RunJar是Hadoop中的一個工具類,結構很簡單,只有兩個方法:main和unJar。我們從main開始一步步分析。

     main首先檢查傳遞參數是否符合要求,然後從第一個傳遞參數中獲取jar包的名字,並試圖從jar中包中獲取manifest信息,以查找mainclass name。如果查找不到mainclass name,則把傳遞參數中的第二個設爲mainclass name。

     接下去,就是在"hadoop.tmp.dir"下創建一個臨時文件夾,並掛載上關閉刪除線程。這個臨時文件夾用來放置解壓後的jar包內容。jar包的解壓工作由unJar方法完成,通過JarEntry逐個獲取jar包內的內容,包括文件夾和文件,然後釋放到臨時文件夾中。

     解壓完畢後,開始做classpath的添加,依次把解壓臨時文件夾、傳遞進來的jar包、臨時文件夾內的classes文件夾和lib裏的所有jar包加入到classpath中。接着以這個classpath爲搜索URL新建了一個URLClassLoader(要注意這個類加載器的parent包括了剛纔bin/hadoop腳本提交時給的classpath),並設置爲當前線程的上下文類加載器。

     最後,利用Class.forName方法,以剛纔的那個URLClassLoader爲類加載器,動態生成一個mainclass的Class對象,並獲取它的main方法,然後以傳遞參數中剩下的參數作爲調用參數來調用這個main方法。

     好了,從上分析看來,這個RunJar類是一個很簡單的類,就是解壓傳遞進來的jar包,再添加一些classpath,然後動態調用jar包裏的mainclass的main方法。看到這裏,我想你應該知道如何利用java代碼來編寫一個替代bin/hadoop的程序了,主要就是兩步:

  • 添加Hadoop的依賴庫和配置文件;
  • 解壓jar包,再添加一些classpath,並動態調用相應方法。最偷懶的方法,直接用RunJar類就行了。

     下一節,講述如何實現這樣的一個java程序。

     To be continued…

--------------------------------------------------------------------

轉載原文地址爲:http://www.cnblogs.com/spork/archive/2010/04/11/1709380.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章