關於Hadoop MapReduce 執行少包問題解決
這是一個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);
}