首页 > 其他分享 >Hadoop学习第四天--MapReduce提交过程

Hadoop学习第四天--MapReduce提交过程

时间:2024-08-10 17:27:33浏览次数:15  
标签:String -- args jar MapReduce Hadoop mainClassName new main

MapReduce提交过程

在Xshell中输入bash -X命令可以在Bash shell中启用debug模式,显示执行过程中的详细信息,例如每条命令的执行结果以及执行的步骤。

  • Hadoop提交执行

  • 开始使用Java命令执行 java org.apache.hadoop.util.RunJar hadoop-1.0-SNAPSHOT.jar com.shujia.mr.worcount.WordCount

  • 开始运行RunJar类中的main方法

    public static void main(String[] args) throws Throwable {
        new RunJar().run(args); => args表示Java命令运行时对应的传参 
           // 参数:  hadoop-1.0-SNAPSHOT.jar com.shujia.mr.worcount.WordCount
    }
    
  • 开始调用run方法

    public void run(String[] args) throws Throwable {
        String usage = "RunJar jarFile [mainClass] args...";
    	
        if (args.length < 1) {
          System.err.println(usage);
          System.exit(-1);
        }
    
        int firstArg = 0;
        // fileName = hadoop-1.0-SNAPSHOT.jar
        String fileName = args[firstArg++];
        File file = new File(fileName);
        if (!file.exists() || !file.isFile()) {
          System.err.println("JAR does not exist or is not a normal file: " +
              file.getCanonicalPath());
          System.exit(-1);
        }
        //  mainClassName 主类名称 => Hadoop jar包中要运行的具体类 
        String mainClassName = null;
    
        JarFile jarFile;
        try {
          jarFile = new JarFile(fileName);
        } catch (IOException io) {
          throw new IOException("Error opening job jar: " + fileName)
            .initCause(io);
        }
    	// 获取jar包中定义的主类   不用
        Manifest manifest = jarFile.getManifest();
        if (manifest != null) {
          mainClassName = manifest.getMainAttributes().getValue("Main-Class");
        }
        jarFile.close();
    	
        //  mainClassName在jar包中没有定义 => maven打包 
        if (mainClassName == null) {
          if (args.length < 2) {
            System.err.println(usage);
            System.exit(-1);
          }
            // firstArg =1 => 对应 com.shujia.mr.worcount.WordCount
          mainClassName = args[firstArg++];
        }
        // 类路径的名称 
        mainClassName = mainClassName.replaceAll("/", ".");
    	// java.io.tmpdir 临时的目录 
        File tmpDir = new File(System.getProperty("java.io.tmpdir 临时的目录 "));
        ensureDirectory(tmpDir);
    
       ...
    	
        //   createClassLoader 类加载器方法 
        ClassLoader loader = createClassLoader(file, workDir);
    	
        // 通过创建的类加载器loader 可以加载给定jar包中的类 
        Thread.currentThread().setContextClassLoader(loader);
        // Class.forName 可以构建 WordCount.class的类对象 
        Class<?> mainClass = Class.forName(mainClassName, true, loader);
        // WordCount.class的类对象 getMethod通过反射的方式获取类中的main方法 
        Method main = mainClass.getMethod("main", String[].class);
        // 将剩余的参数包装 再传入 main方法中 
        List<String> newArgsSubList = Arrays.asList(args)
            .subList(firstArg, args.length);
        String[] newArgs = newArgsSubList
            .toArray(new String[newArgsSubList.size()]);
        // invoke可以对当前Method对象中的方法进行执行 
        //  new Object[] {newArgs} 表示main方法中的传参 => 
        try {
          main.invoke(null, new Object[] {newArgs});
        } catch (InvocationTargetException e) {
          throw e.getTargetException();
        }
      }
    
  • 开始运行自定类中的main方法 => 加载配置信息

    job.waitForCompletion(true); // 开始提交执行
    
  • 进入waitForCompletion方法内

    public boolean waitForCompletion(boolean verbose
                                       ) throws IOException, InterruptedException,
                                                ClassNotFoundException {
        if (state == JobState.DEFINE) {
          submit(); // 当程序提交了 如果是再Hadoop集群中,是需要提交给Yarn运行 
          //  mapreduce.JobSubmitter: Submitting tokens for job: job_1716520379305_0009
        }
        return isSuccessful();
      }
    
  • submit方法

    public void submit() 
             throws IOException, InterruptedException, ClassNotFoundException {
        ensureState(JobState.DEFINE);
        setUseNewAPI(); // 设置新的API => Hadoop中有一些老API存在所以需要进行设置 
        connect();  // 异步创建cluster对象 在该对象中包含了有多个集群连接信息  => cluster 表示Yarn集群客户端 
        final JobSubmitter submitter = 
            getJobSubmitter(cluster.getFileSystem(), cluster.getClient());
        status = ugi.doAs(new PrivilegedExceptionAction<JobStatus>() {
          public JobStatus run() throws IOException, InterruptedException, 
          ClassNotFoundException {
              // 开始正式提交任务
            return submitter.submitJobInternal(Job.this, cluster);
          }
        });
        state = JobState.RUNNING;
        LOG.info("The url to track the job: " + getTrackingURL());
       }
    
  • 注意:
    • LocalJobRunner对应的是本地的数据运行
    • YARNRunner是对应将数据提交到YARN上运行

标签:String,--,args,jar,MapReduce,Hadoop,mainClassName,new,main
From: https://www.cnblogs.com/shmil/p/18352316

相关文章

  • 《亿级流量系统架构设计与实战》第一章 大型互联网公司的基础架构
    大型互联网公司的基础架构一、DNS1、域名服务器分类2、域名解析过程二、HTTPDNS1、DNS存在问题2、HTTPDNS解析流程3、HTTPDNS与DNS对比三、接入层技术演进1、Nginx(七层负载均衡器)2、LVS(四层负载均衡器)3、LVS+Nginx接入层架构四、数据存储1、MySQL2、Redis3、LSMTr......
  • Flutter中scroll_to_index 实现列表滚动到指定索引的库
    scroll_to_index 是一个用于在Flutter中实现列表滚动到指定索引的库依赖scroll_to_index:^3.0.1#滑动位置使用classScrollToIndexExampleextendsStatefulWidget{@override_ScrollToIndexExampleStatecreateState()=>_ScrollToIndexExampleState();}cl......
  • 二叉树的遍历
    前言二叉树有三种遍历方式,三种遍历方式的核心都是把一颗二叉树分为根、左子树、右子树三部分。前中后其实说的是根出现的顺序,在二叉树中左子树遍历顺序始终先于右子树。分析以这个二叉树为例讲解,一颗二叉树分为根、左子树、右子树。空树是最小单位已经不能再分最先分为根1......
  • 表达式目录树
    1.表达式目录树和委托的类比:表达式目录树是一种数据结构、是一种语法树,可以被我们解析: 2.表示式目录树的使用场景:把一个对象中的数据赋值到另一个对象当中:实现对象值赋值:一.反射: 二.序列化器: 三.使用表达式目录树4.使用泛型缓存+表达式目录树 调用如下: 5.Exp......
  • JAVA里的xml(详解)
    1.xml1.1概述【理解】万维网联盟(W3C)万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。建立者:TimBerners-Lee(蒂姆·伯纳斯·李)。是Web技术领域最具权威和影响力的国际中立性技术标准机构。到目前为止,W3C已发布了200多......
  • 初学者自学机器学习,分享机器学习书籍、视频
    最近开始自学学习机器,目前打算分为3个学习阶段。未来2-3年目标。第一阶段:(1-2年)学习教材+视频,教材为:《机器学习》(西瓜书-周志华)和《统计学习方法》(第二版、李航),太多太多数学知识,光看书完全看不懂,所以会同步看视频学习。视频一:《机器学习》(西瓜书-周志华)同步视频:机器学习初......
  • 指针常量和常量指针的区别
    1.指针常量(ConstantPointer)定义:顾名思义指针常量是一个指针,它本身是常量,指向的地址不能改变,但可以改变指针所指向的值,(速记:指针是常量)声明:在C或C++中,可以使用const关键字来声明指针常量。例如:inta=10;int*constptr=&a;行为:在这个例子中,ptr......
  • OSPF-综合实验
    根据题目和要求完成下列任务:要求:1.如图连接,合理规划IP地址,所有路由器各自创建一个loopback接口2.R1再创建三个接口IP地址为201.1.1.1/24、201.1.2.1/24、201.1.3.1/24  R5再创建三个接口IP地址为202.1.1.1/24、202.1.2.1/24、202.1.3.1/24  R7再创建三个接口IP地......
  • OSPF基础
    目录一、路由分类1.直连路由2.非直连路由二、OSPF概述1.什么是OSPF     2.OSPF的特点3.OSPF的区域划分1.划分区域的意义2.区域的划分三、OSPF消息数据包1.数据包的类型2.Hello包2.DBD包3.LSR包 4.LSU 5.LSACK 四、OSPF邻居状态机制1.邻居关系建......
  • 以DenseNet为例进行AI算法部署集成
    以DenseNet为例进行AI算法部署集成AI越用越广,但落地使用的时候各种bug多多,这里提供一些离线集成的导引方便大家学习,后面也会尝试更新一些webapi的集成方式,请期待后续的博客简单性能表格下列表格为一些简单的部署数据搜集,通过部署器进行离线集成,可以看到可以大大降低资源......