1. 程式人生 > >關於Hadoop MapReduce 執行少包問題解決

關於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);
       }