跳到主要內容

Hadoop with Netbeans 函式包裹至單一專案JAR檔

75580003

 

 

在Hadoop雲端環境執行程式時,

主要是將程式先包裹為一個JAR檔後,由Master 將其做為Task送出到各個node進行處理,

然而當系統較為複雜時,程式內引用的處理程序往往更為繁雜,

以生物資訊的案例來說,

一個專案中可能會需要用到如:連結遠端特定服務的library ( Ex:BLAST) , XML 的Library (Ex: JDOM) , 網路連結套件 (Ex: httpclient), WSDL, SAAJ …. 等許許多多的外部函式庫。

 

這狀況若以Web Service 來說並不會造成問題,

因為Netbeans 會自動Deploy 成一個 war檔進行部署。

 

但在一般的專案中,

Netbeans只會將專案本身包為 JAR檔,其餘外部的函式( 如引入在 /lib/下的外部jar檔)

在build後並不會包入JAR中,而僅是存放在dist/中的lib/目錄下。

 

這在平常或許沒什麼太大問題,

只要設定classpath或放到公用java classpath (ext/lib)中即可。

 

但在雲端環境中,由於JAR是做為Task傳送到不同的node server執行,

除非是每個node都預先存放好 library,否則在執行時便會因為僅將專案JAR檔送出,

造成 node server找不到外部library 而引發ClassNotFoundException導致task falue 。

 

解決上述問題的方式,有以下幾種方法:

  1. 將library放入各node Server的共用函式資料夾
  2. 將外部涵式解開JAR後,將package複製到自己的專案內,再令其重新build包裹在一起
  3. 直接將JAR檔包進JAR中

 

然而在雲端環境中,若要逐一對node server預先設定外部library,

不只耗時費工 (node server可能高達百臺),更有可能因為外部server而無法進行設定。

 

以上作法最便利的便是第三種方式:將外部的JAR包入專案的JAR中

此方法類似 Eclipse中的 “Fat Jar” plugin ,可以將外部的JAR直接包裝進JAR中,

而 Netbeans的作法則僅需修改ANT的build.xml便可達成。

 

唯編輯ANT的方式較為複雜,以下推薦一個網友分享的方式讓大家參考。

( From: Fat JARs out of NetBeans – by Joshua Born )

 

作法如下 (以下採用 Netbeans IDE 6.9.1):

 

  • 1. 將外部函式匯入 lib

image

 

  • 2. 點選專案視窗的Files分頁

image

 

  • 3. 開啟專案中的build.xml檔,並於<project> </project> 範圍內加入以下Tag,並存檔
  <target name="-unjar-and-copy-lib-jars">
<unjar dest="${build.classes.dir}">
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<patternset>
<exclude name="META-INF/**"/>
<exclude name="/*"/>
</patternset>
</unjar>
</target>

<target depends="init,compile,-pre-pre-jar,-pre-jar,-unjar-and-copy-lib-jars" name="fat-jar">
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
<jar destfile="${dist.jar}">
<fileset dir="${build.classes.dir}"/>
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</jar>
<echo>To run this application from the command line without Ant, try:</echo>
<property location="${dist.jar}" name="dist.jar.resolved"/>
<echo>java -jar "${dist.jar.resolved}"</echo>
</target>

<target depends="clean,fat-jar" name="clean-and-fat-jar"/>
 


  • 4. build.xml修改完成後,在該檔案上按右鍵選[Run Target] –> [Other Targets] ,當中便會出現[fat-jar] , [clean-and-fat-jar],執行[fat-jar]後即可在dist中編出單一個JAR檔
 image
 
 

image
 
 
透過上述的方法便可以很輕鬆的進行JAR包裝,
這對想要移植過去的JAVA專案至雲端應用上是非常有幫助的,
 
不過這個作法有許多缺點,
最大的問題是包裹後的JAR檔相當肥大(檔案大小),
因此在Master Server進行task分派時勢必會造成流量的增加,
以單JAR 5mb來說,
若有100個task運行於100個node,則一個job造成的流量便會超過500mb,
這對系統來說會是非常大的負擔,尤其是node server不在鄰近區域時更會影響,

 


因此,盡可能的精減外部Library的使用,


並且將未用到的library 刪除,更甚至用解JAR的方式來取出僅需要的部份,


這樣的方式便可以減少傳輸流量的暴增,降低系統負擔。


 


BP  2011.06.10


 


相關文章:


  ‧『Hadoop with Netbeans 雲端開發環境

留言

這個網誌中的熱門文章

醫學健康跨領域合作的開始:資料工程

一直都很喜歡在會議上與跨領域的專家、醫師、學者分享我們在數據工程與分析應用上的發展經驗。 許多的專家學者,對於大數據應用的認知都仍侷限在一個超大型結構化資料集的子集合應用,在規劃好的條件設定下,針對特定的目標(疾病、行為)進行篩選,將數據narrow down到可以被個人電腦或是單一伺服器架構處理的小型資料集。 這樣的半手工處理方式,對於專一(Specific)領域主題的資料追蹤計算或許已經十分足夠,但當中倘若資料清理方式有改變、篩選條件增減,所有的數據都要從raw重新處理,不僅造成大量的時間與人力浪費,對於專案計畫進度的延宕更是麻煩。這些還不包含

Google 資料庫方案–Spreadsheet–(1)資料呈現

HEMiDEMi 的標籤: Google , Google SpreadSheet , 雲端 早在規劃『 教育,意義! 』project時, 便有打算將整個網站建立過程撰寫一篇教學,讓有興趣以google 服務為基礎進行開發的朋友參考。 沒想到這個想法擺著就拖了好幾個月, 好在學生提出了問題,就趁這機會寫一寫吧。 基本上『 教育,意義! 』網站的架構完全建立在Google提供的服務, 廣義來說也是個雲端的系統, 所有的資料是分散在不同的服務架構下,再用GAE, Javascrript將服務資訊串接起來, 由Blogspot 統一呈現。 省了租主機的費用,或架站的硬體、電費, 最好的地方在於不用管理主機維運的問題, 只要專心做我的創意、嘗鮮就好了!!   多棒! 若將『 教育,意義! 』網站依功能層次來分類,可以分為三層結構, 當中的層次與使用技術大致如下: UI 介面層 服務 : Blogspot (網站介面) , Picasa (相簿空間), Google Apps 技術 : Javascript , AJAX ( JQuery ) App應用層  服務 : Google App Engine (GAE) 技術 : Java, Java Server Page (JSP) 資料層 服務 : Google Docs (文件), Google Spreadsheet (試算表) 技術/函式庫 : Java, Google Data APIs 本篇文章將著重在介紹以Google Spreadsheet 做為雲端資料庫, 其他主題將會陸續推出。 若對Google API 與 Google App Engine 初步建置有興趣, 可以參考之前文章: 佛心來著的 Google Data API – for JAVA 雲端的開始:Netbeans 無痛 Google App Engine Java 服務開發 Google Spreadsheet 做為資料庫系統 對於小型的資料系統來說, 採用Google Spreadsheet做為應用程式資料庫(如問卷調查或線上系統) 也算堪用, 目前的儲存限制為 : 40 萬個儲存格 每張工作表最多...

歡迎引戰的Threads演算法機制

  最近受到江老師 江振維的啟發,開始測試Threads的演算法機制,發現它驚人的傳播速度 先講成果,一篇thread文: 第17小時,10,689瀏覽,106則回覆 第24小時,22,122瀏覽,179則回覆  帳號追蹤數僅104位  簡單來說,Threads的機制跟過去Facebook大多鎖定在親朋好友社交網絡之間的內容不一樣,它會大量收集有相關興趣的人來觸及,內容散亂主題分散觸及效果越差,但太過專業不是一般人能理解的效果會更差,所以主題明確直白淺顯易懂,可以快速激發討論的內容,就是容易被擴散的。 這次實驗做了一個策略,文章很簡單,短短三行: 『小朋友為什麼不能學ai?  學生交作業為什麼不能用ai?  為什麼要阻礙進化?』 (文章連結) 策略設計 用爭議性內容(Controversial topics)並參考坎寧安定律(Cunningham's Law)方式,讓主題有開放性討論(疑問句、ai)、敏感性主題(小朋友、學生),最後錨定一個負面且帶有爭議性的價值論述 (阻礙進化),來引發討論 每一個回文,都按愛心 回覆一人只回一次,不深追討論 回覆時回疑問句(諷刺、引戰),但不評斷價值 結果~~ 碰🔥  快速大量瀏覽以及對立式發言,中午時刻短短三小時擴增5000人瀏覽,當回覆互動增加時,會在一個短時間內快速吸人進來討論,直到24小時後觸及就自動下降幾乎歸零。 對比前後實驗的發文,專業文、分享文,效果都非常有限。 可以了解,在這樣同溫特化以及互動至上的平台,"引戰"對於流量製造的效果非常好,但是否能產生導流效果,不得而知,未來可以再嘗試☕ 最後,我自己還是不喜歡這種操作, 認真看待事物、追求專業、理想與和諧,這種人格特質,對於製造混亂、誘發對立討論,雖然還是可以引導教育意義,但互動過於浪費時間、缺少實質回饋、仇恨言論造成心理疙瘩,這都是自己不喜歡的特性😅 還是留給有心理素質的人去玩吧! XD PAN 20240704 Reference Berger, J., & Milkman, K. L. (2012). What Makes Online Content Viral? "Content that evokes high-arousal emotions such as awe, anger, and anxiet...