天天看點

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

繼續閱讀