標籤:style blog http color java 使用 os io
來自:http://heipark.iteye.com/blog/1171923
通過 "conf.set("tmpjars", jars);" 可以設定第三方jar,之前一直只是添加一個jar,運行OK,今天打算添加多個jar的時候發現mapreduce在運行時找不到 class(ClassNotFoundException),跟蹤代碼發現jar檔案的確上傳到了HDFS中,所以甚是無解,後來上傳jar到 hdfs,然後使用DistributedCache.addFileToClassPath()方法也不行。鬱悶半天,後來看到job.xml中有一段 奇怪的設定,mapred.job.classpath.files的value為"/user/heipark/lib/commons-lang- 2.3.jar;/user /heipark/lib/guava-r08.jar",可以看到這個分隔字元是分號(我的OS是windows),在linux系統和hadoop系統 一般都是逗號和冒號分隔,然後我繼續挖,發現DistributedCache.addArchiveToClassPath()方法(tmpjars也 會用這個方法)中使用了“System.getProperty("path.separator")”,於是靈感閃現,修改該值為linux系統的冒 號,我嚓,居然成功了,搞了我4個小時,eclipse終於可以添加多個第三方jar包了。封裝了方法,在main方法直接添加jar包就可以了。
調用:
addTmpJar("D:/Java/new_java_workspace/scm/lib/guava-r08.jar", conf);
方法定義:
/**
* 為Mapreduce添加第三方jar包
*
* @param jarPath
* 舉例:D:/Java/new_java_workspace/scm/lib/guava-r08.jar
* @param conf
* @throws IOException
*/
public static void addTmpJar(String jarPath, Configuration conf) throws IOException {
System.setProperty("path.separator", ":");
FileSystem fs = FileSystem.getLocal(conf);
String newJarPath = new Path(jarPath).makeQualified(fs).toString();
String tmpjars = conf.get("tmpjars");
if (tmpjars == null || tmpjars.length() == 0) {
conf.set("tmpjars", newJarPath);
} else {
conf.set("tmpjars", tmpjars + "," + newJarPath);
}
}