這是一個Hadoop中極為常見的丢包少類的問題,希望能幫到大家
問題描述
指令:hadoop jar 運作包 主函數 參數-1 參數-2
運作産生異常
異常一:
Exit code: 1 Stack trace: ExitCodeException exitCode=1: at org.apache.hadoop.util.Shell.runCommand(Shell.java:604) at org.apache.hadoop.util.Shell.run(Shell.java:507)
異常二:
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.orc.mapreduce.OrcOutputFormat not found
解決思路
MR程式運作少包有二種: 1.程式運作目前環境少包 2.Yarn運作環境Executor少包
如果剛運作指令,還任務甚至還未送出Yarn産生了異常,可以了解為目前環境少包通過導入環境變量即可運作:
注意多個Jar包使用 : 隔開
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:lib/orc-mapreduce-1.1.0.jar
如果程式已經送出Yarn了,注意觀察資源管理界面,檢視運作日志
方法一:
hadoop jar 運作包 主函數
-libjars lib/*.jar
參數-1 參數-2
可将依賴包送出Executor運作環境,
注意位置不可變,多個lib使用,隔開
方法二
但是需要使用Tools工具類運作任務,否則無法識别參數-libjars, 會被識别為Main的參數,具體請看後面補充
程式中使用分布式緩存,緩存Jar檔案,具體看補充
補充 : 方法一
//通過實作工具類,Run方法執行Job,-libjars才可被識别
public class MapredOrcFileConvert extends Configured implements Tool {
static Logger logger = LoggerFactory.getLogger("MapredOrcFileConvert");
@Override
public int run(String[] strings) throws Exception {
// 重要: 必須要用:父類方法getConf() .
Configuration conf = getConf();
Job job = Job.getInstance(conf, "NAME");
/*JAR*/
job.setJarByClass(MapredOrcFileConvert.class);
/*Format*/
...
/*Map*/
...
/*Reduce*/
...
/*Param*/
...
FileInputFormat.addInputPath(job, new Path(strings[1]));
FileOutputFormat.setOutputPath(job, new Path(strings[2]));
return job.waitForCompletion(true) ? 0 : 1;
}
public static void main(String args[]) throws Exception {
//工具類運作
int status = ToolRunner.run(new Configuration(), new MapredOrcFileConvert(), args);
System.exit(status);
}
補充 : 方法二
//分布式緩存,依賴包需要上傳HDFS,指定檔案路徑,導入緩存,即可解決依賴
Configuration conf = new Configuration();
FileSystem fileSystem = FileSystem.get(conf);
FileStatus[] status = fileSystem.listStatus("HDFS JAR Lib PATH");
for (FileStatus statu : status) {
System.out.println("+" + statu.getPath().toString());
DistributedCache.addArchiveToClassPath(statu.getPath(), conf);
}