問題描述
寫MR程序往往需要依賴第三方依賴庫,或者需要讀取自己的配置文件,
本文就的目的就是為了用靠譜的方法解決這兩個(gè)問題!
解決方案
步驟
- 在 Driver 端添加依賴
export HADOOP_CLASSPATH="thirdpartlib_1.jar,thirdpartlib_2.jar ..."
- 在 Task 端添加依賴(或配置文件)
hadoop jar application.jar \
-libjars "thirdpartlib_1.jar,thirdpartlib_2.jar ..." \
-files "file1, file2 ..." \
userparam1, userparam2 ...
注意1: 必須保證 "-libjars" 和 "-files" 在 "hadoop jar application.jar" 后面 并且在 "userparam1, userparam2 ..." 前面!如果在 "userparam1, userparam2 ..." 后面,則會(huì)被當(dāng)做 userparam 處理。
注意2: 此種方法會(huì)把配置文件放到application.jar的同級目錄
- 代碼
Configuration conf = new Configuration();
String[] userparams = new GenericOptionsParser(conf, args).getRemainingArgs();
Job job = Job.getInstance(conf);
//process business logic ...
System.exit(job.waitForCompletion(true) ? 0 : 1)
public class ApplicationDriver extends Configured implements Tool {
//設(shè)定并讀取應(yīng)用程序相關(guān)的,自己定義的一些參數(shù)
public int run(String[] args) throws Exception {
if(args.length < 2) {
printUsage();
return 2;
}
Job job = new Job(getConf());
//process business logic ...
return job.waitForCompletion(true) ? 0 : 1;
}
//真正的main函數(shù)
public static void main(String[] args) throws Exception{
int res = ToolRunner.run(new Configuration(), new ApplicationDriver(), args);
System.exit(res);
}
}
注意:必須使用 "方法1" 或者 "方法2" 才能使 "1" 和 "2" 生效!
原理
-files:Hadoop 將指定的本地/hdfs上的文件通過HDFS分發(fā)到各個(gè)Task的工作目錄下,不對文件進(jìn)行任何處理
-libjars:Hadoop 將指定的本地/hdfs上的jar包通過HDFS分發(fā)到各個(gè)Task的工作目錄下,并將其自動(dòng)添加到任務(wù)的CLASSPATH環(huán)境變量中
原理是基于 Hadoop 的 DistributedCache,詳解見如下鏈接: http://dongxicheng.org/mapreduce-nextgen/hadoop-distributedcache-details/
常見問題
- 增加了 "export HADOOP_CLASSPATH" 環(huán)境變量, Driver 端仍然找不到類
原因a: 在 "hadoop jar application.jar ..." 后面用了 sudo,導(dǎo)致環(huán)境變量不能傳遞給子進(jìn)程
解決:"sudo" 替換為 "sodu -E",使父進(jìn)程的環(huán)境變量不被抹除
- 增加了 -libjars 操作, 但是 Task 端仍然找不到類
原因a: 沒有使用 "步驟3" 的兩種方法使 "-libjars" 生效
解決: 使用 "步驟3" 中的兩種方法的任意一個(gè)
原因b: "-libjars" 放在了 "userparam1, userparam2 ..." 的后面
解決: 將 "-libjars" 在 "hadoop jar application.jar" 后面 并且在 "userparam1, userparam2 ..." 前面!
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。