hadoop編譯生成jar包
Ⅰ 如何重新編譯hadoop jar包
首先我們要打包程序,,打包完畢,我們該如何運行
首先顯示一個比較簡單的:
上面命令:hadoop jar x.jar 是運行包的一種方式,完成的方式為
hadoop jar x.jar ×××.MainClassName inputPath outputPath
同時解釋一下:
x.jar為包的名稱,包括路徑,直接寫包名稱,則為默認路徑
×××.MainClassName為運行的類名稱
inputPath為輸入路徑
outputPath為輸出路徑。
Ⅱ 求教,zookeeper 修改源碼後如何重新生成jar包
adoop的release二進制包,將common、HDFS和MapRece都打包在hadoop-0.20.0-core.jar一個JAR文件中,但如果使用eclipse編譯,則會分別生成三個不同的包文件,如:hadoop-core-0.22.0-SNAPSHOT.jar,hadoop-hdfs-0.22.0-SNAPSHOT.jar和hadoop-mapred-0.22.0-SNAPSHOT.jar,如何使用eclipse編譯生成的JAR了?方法很簡單:將eclipse編譯生成的core、和三個JAR文件放到hadoop/lib目錄下,將原hadoop目錄下的hadoop-0.20.0-core.jar刪除或重命名成不以「.jar」結尾的名字即可,master和slave節點都應當如此操作方可。另外,不同的版本FSImage格式可能不一致,具體請查看:http://bbs.hadoopor.com/thread-387-1-1.html。如果想按照自己的需求或規則存放JAR,那麼可以修改bin/hadoop腳本的如下等代碼段:# for releases, add core hadoop jar & webapps to CLASSPATHif [ -d "$HADOOP_HOME/webapps" ]; then CLASSPATH=${CLASSPATH}:$HADOOP_HOMEfi// 下面三行可以考慮刪除,因為JAR直接放到了lib目錄下for f in $HADOOP_HOME/hadoop-*-core.jar; do CLASSPATH=${CLASSPATH}:$f;done# add libs to CLASSPATHfor f in $HADOOP_HOME/lib/*.jar; do CLASSPATH=${CLASSPATH}:$f;done復制代碼更多可修改的地方請查看hadoop文件,如果是一位java熟手,完成上面的操作應當是非常容易的,主要是理解classpath,之後怎麼折騰都可以,相當於C中的LD_LIBRARY_PATH要設置好一樣,而且有先後順序關系 .在Haoop的release中common、HDFS和MapRece只有一個包文件,而使用eclipse分開編譯也只生成了三個包文件。如果頻繁修改、編譯和測試,效率會很低,所以最好可以再在common、HDFS和MapRece之下分解成多個不同的包,比如common中的ipc、conf、util和net等就可以獨立成一個JAR文件。
Ⅲ 編譯hadoop eclipse插件要聯網么
這里用到的hadoop版本是1.1.2,但此插件的編譯方面在1.2.0下也通過。)
1)hadoop的eclipse插件源碼位於hadoop.home(這里的hadoop.home為你的hadoop主目錄)/src/contrib/eclipse-plugin。
ant不外乎是一個build.xml,我們先拿它開刀。
我們找到<target name="jar",裡面的元素<相關的先全部刪了,然後添加如下的,當然,這里的hadoop-core-XXX.jar,這個XXX是版本號,請根據你下載的hadoop的版本進行設置,也可以在後面的build-contrib.xml中進行設置,這里用變數進行替換,等一下我們再看。
< file="${hadoop.root}/hadoop-core-1.1.2.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>
< file="${hadoop.root}/lib/commons-cli-1.2.jar" todir="${build.dir}/lib" verbose="true"/>
< file="${hadoop.root}/lib/commons-configuration-1.6.jar" tofile="${build.dir}/lib/commons-configuration-1.6.jar" verbose="true"/>
< file="${hadoop.root}/lib/commons-httpclient-3.0.1.jar" tofile="${build.dir}/lib/commons-httpclient-3.0.1.jar" verbose="true"/>
< file="${hadoop.root}/lib/commons-lang-2.4.jar" tofile="${build.dir}/lib/commons-lang-2.4.jar" verbose="true"/>
< file="${hadoop.root}/lib/jackson-core-asl-1.8.8.jar" tofile="${build.dir}/lib/jackson-core-asl-1.8.8.jar" verbose="true"/>
< file="${hadoop.root}/lib/jackson-mapper-asl-1.8.8.jar" tofile="${build.dir}/lib/jackson-mapper-asl-1.8.8.jar" verbose="true"/>
網上很多文章都說只要這一步就OK了,但實驗證明,我們編譯的時候會出現找不到類的情況,主要是沒有載入那些JAR包。
2)添加JAR包到classpath
還是build.xml文件中,我們找到<path id="classpath">
在其末尾加上:
<fileset dir="${hadoop.root}">
<include name="*.jar"/>
</fileset>
這里把hadoop根目錄下的所有JAR包加入到classpath,至於這里為什麼要加,我沒怎麼用Ant,就留給有興趣的朋友去研究了。
3)改完上面的,當我們在編譯的時候,那些需要的JAR包並沒有同時添加到生成的JAR內,這樣會有錯誤,所以我們要修改MANIFIEST.MF文件,相信搞過可運行JAR包的朋友都清楚這個文件用一個JAR來說是多麼的重要。
在同級目錄下找到META-INF/MANIFEST.MF,找到Bundle-ClassPath:,然後添加如下:
classes/,lib/hadoop-core.jar,lib/commons-configuration-1.6.jar,lib/commons-httpclient-3.0.1.jar,lib/commons-lang-2.4.jar,lib/jackson-core-asl-1.8.8.jar,lib/commons-cli-1.2.jar
注意,這一大段不要換行,否則在生成JAR包時會報錯。
4)加完這些,可以說實際上編譯就已經OK了,但我們需要跟特定的eclipse相結合,所以我們需要配置eclipse的路徑,回到我們剛才build.xml文件的上層文件夾,也就是hadoop.home/src/contrib文件夾下。
找到build-contrib.xml文件,找到project,在property最前面加多一個:
<property name="eclipse.home" value="D:/developerTools/eclipse/eclipse" />
這里的D:/xxx是我的eclipse安裝路徑,注意,需要把原來windows下的\換成linux樣式的/,否則會有問題的。
接下來就開始我們正式的編譯工作了,假設ant那些我們都配置好了,已經在path中了,並且ant版本高於1.7.2(建議下最新的),然後我們直接在cmd下執行:
可以看到這樣的結果:
這里已經生成成功了,接下來我們就可以到hadoop.home/build/contrib/eclipse-plugin下找到hadoop-eclipse-plugin-${version}.jar這樣的一個文件,${version}是什麼來的?
這里就涉及到一個前面說的版本變數的問題,我們在build-contrib.xml的eclipse.home下面添加一個:
<property name="version" value="1.1.2" />
這里的版本號請根據你自己下的版本來填,填好後,我們再生成後,就可以看到hadoop-eclipse-plugin-1.1.2.jar這樣的一個JAR包,這個版本號根據你設的version值來生成的。
我在另外一台電腦編譯時,遇到了報找不到log4j配置文件的錯誤,類似什麼master之類的,如果遇到類似這樣的錯誤,錯誤如下:
可以嘗試修改ivy.xml,把裡面的dependency裡面的conf裡面的master修改為default,一般就可以解決了,這個暫時沒發現是什麼造成的,遇到類似的問題就可以找找ivy.xml裡面的問題。
編譯完成後,我們把hadoop-eclipse-plugin-XXX.jar包丟進eclipse的plugins目錄下,然後重啟eclipse就OK了,啟動後就可以看到Map/Rece窗口了,這也方便我們運行WordCount等例子。
Ⅳ hadoop 程序 打成jar包 跑測試時 報錯(在eclipse裡面正常運行)
WARNmapred.JobClient:..
看到警告了沒? 你的代碼有問題。
所有的map task已完成,證明你的map class沒有問題, rece task failed (rece task ID: attempt_201312060554_0003_r_000000_0),證明你的rece class沒有辦法正常運行。GenericOptionsParser可以被ToolRunner類使用,所以有可能是你沒有implements Tool inteference, 也可能是你的code 有錯誤。貼出代碼來。
Ⅳ 如何在hadoop2.5.2使用命令行編譯打包運行自己的maprece程序
在你的IDE中將程序打成jar包,之後在shell中:
hadoopjarjar包名包名.類名
或者參考hadoop streaming:
http://hadoop.apache.org/docs/r2.5.2/hadoop-maprece-client/hadoop-maprece-client-core/HadoopStreaming.html
Ⅵ eclipse下怎麼打包java代碼成jar到hadoop下運行
(1)首先將好的Hadoop源碼解壓,將解壓後頂級目錄和lib中的壓縮文件載入到你的工程中(他們包括了hadoop源碼和一些需要的第三方源碼),然後就可以編寫hadoop程序了。
(2)編寫好hadoop程序,調試沒有錯誤後,就可以通過(jar -cvf yourname.jar -C bin/ .),將工程中bin目錄下編譯好的.class文件打包成你想要的.jar壓縮文件包。
(3)將yourname.jar壓縮包復制到你的hadoop目錄下,通過命令hadoop jar yourname.jar yourMainClass /data/inputfile /data/outputfile。如果是在完全分布式的hadoop配置環境下,需要通過hadoop命令在hadoop的hdfs系統中創建文件目錄然後將本地的輸入數據復制到hdfs系統中,命令有:
hadoop fs -mkdir data:創建一個名問data的文件夾
hadoop fs -ls :查看hdfs文件系統中的文件目錄
hadoop fs -FromLocal /data/input /user/data :將本地文件input復制到hdfs系統的/user/data目錄下
hadoop fs -ToLocal /user/data/output/ /data/ :將hdfs系統中的output文件夾復制到本地系統中。
Ⅶ 如何在hadoop-2.6.0上編譯運行自己編寫的java代碼
在不使用eclipse情況使java程序在hadoop 2.2中運行的完整過程。整個過程中其實分為java程序的編譯,生成jar包,運行測試。
這三個步驟運用的命令都比較簡單,主要的還是如何找到hadoop 2.2提供給java程序用來編譯的jar包。具體可以查看:
HADOOP_HOME/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib目錄
下面會通過一個在hadoop中創建一個目錄的JAVA例子來進行演示
具體代碼如下:
package com.wan.demo;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HADemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
mkdir(args[0]);
}
public static void mkdir(String dir){
Configuration configuration=new Configuration();
FileSystem fs;
try {
fs = FileSystem.get(configuration);
fs.mkdirs(new Path(dir));
fs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
把HADemo.java文件拷貝到linux環境中
配置HADOOP_HOME/bin到環境中,啟動集群,進入HADemo.java文件目錄中
注:下面的lib目錄裡面的文件由HADOOP_HOME/share/hadoop/httpfs/tomcat/webapps/ webhdfs/WEB-INF/lib目錄中獲取,下面做的目的是為了縮減命令長度
1.編譯java
# mkdir class
#Javac -classpath .:lib/hadoop-common-2.2.0.jar:lib/hadoop-annotations-2.2.0.jar -d class HADemo.java
2.生成jar包
#jar -cvf hademo.jar -C class/ .
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/wan/(in = 0) (out= 0)(stored 0%)
adding: com/wan/demo/(in = 0) (out= 0)(stored 0%)
adding: com/wan/demo/HADemo.class(in = 844) (out= 520)(deflated 38%)
3.測試運行
#hadoop jar hademo.jar com.wan.demo.HADemo /test
檢測:
#hadoop fs -ls /
結束!
Ⅷ 如何在Windows中使用Intellij idea搭建遠程Hadoop開發環境
(1)准備工作
1) 安裝JDK 6或者JDK 7
2) 安裝scala 2.10.x (注意版本)
2)下載Intellij IDEA最新版(本文以IntelliJ IDEA Community Edition 13.1.1為例說明,不同版本,界面布局可能不同)
3)將下載的Intellij IDEA解壓後,安裝scala插件,流程如下:
依次選擇「Configure」–> 「Plugins」–> 「Browse repositories」,輸入scala,然後安裝即可
(2)搭建Spark源碼閱讀環境(需要聯網)
一種方法是直接依次選擇「import project」–> 選擇spark所在目錄 –>
「SBT」,之後intellij會自動識別SBT文件,並下載依賴的外部jar包,整個流程用時非常長,取決於機器的網路環境(不建議在windows
下操作,可能遇到各種問題),一般需花費幾十分鍾到幾個小時。注意,下載過程會用到git,因此應該事先安裝了git。
第二種方法是首先在linux操作系統上生成intellij項目文件,然後在intellij IDEA中直接通過「Open
Project」打開項目即可。在linux上生成intellij項目文件的方法(需要安裝git,不需要安裝scala,sbt會自動下載)是:在
spark源代碼根目錄下,輸入sbt/sbt gen-idea
註:如果你在windows下閱讀源代碼,建議先在linux下生成項目文件,然後導入到windows中的intellij IDEA中。
(3)搭建Spark開發環境
在intellij IDEA中創建scala project,並依次選擇「File」–> 「project structure」
–> 「Libraries」,選擇「+」,將spark-hadoop
對應的包導入,比如導入spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar(只需導入該jar
包,其他不需要),如果IDE沒有識別scala 庫,則需要以同樣方式將scala庫導入。之後開發scala程序即可:
編寫完scala程序後,可以直接在intellij中,以local模式運行,方法如下:
點擊「Run」–> 「Run Configurations」,在彈出的框中對應欄中填寫「local」,表示將該參數傳遞給main函數,如下圖所示,之後點擊「Run」–> 「Run」運行程序即可。
如果想把程序打成jar包,通過命令行的形式運行在spark 集群中,可以按照以下步驟操作:
依次選擇「File」–> 「Project Structure」 –> 「Artifact」,選擇「+」–>
「Jar」 –> 「From Moles with
dependencies」,選擇main函數,並在彈出框中選擇輸出jar位置,並選擇「OK」。
最後依次選擇「Build」–> 「Build Artifact」編譯生成jar包。