`
x-rip
  • 浏览: 106923 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Yarn/MRv2中MapReduce的启动过程之Client端

 
阅读更多

Yarn/MRv2中MapReduce的启动过程之Client端

Hadoop版本0.23.1

Shell端

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-0.23.1.jar wordcount input output

Client端

1、 bin/hadoop文件

(该文件主要用于解析hadoop的命令参数,并传给相应的Java类进行处理,其中与运行WordCount相关代码如下)

#将第一个参数即字符串jar传给参数COMMAND
 COMMAND=$1
#判断参数COMMAND的值,如果是jar,则将参数CLASS设为org.apache.hadoop.util.RunJar
 elif [ "$COMMAND" = "jar" ] ; then
 CLASS=org.apache.hadoop.util.RunJar
#执行java命令,相当于$JAVA_HOME/bin/java org.apache.hadoop.util.RunJar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-0.23.1.jar  wordcount input output
 exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
 

2、 RunJar.java

(该java文件用于加载参数传递过来的jar包并执行,相关代码如下)

    int firstArg = 0;
//初始化加载jar包的参数,注意在这里fileName值为args[0],++操作先赋值后递增
    String fileName = args[firstArg++];
    File file = new File(fileName);
    String mainClassName = null;

    JarFile jarFile;
    try {
      jarFile = new JarFile(fileName);
    } catch(IOException io) {
      throw new IOException("Error opening job jar: " + fileName)
        .initCause(io);
    }
 
/*获取jar包的mainClassName,用WinRAR打开hadoop-mapreduce-examples-0.23.1.jar,在META-INF目录下的MANIFEST.MF文件中可以看到Main-Class: org.apache.hadoop.examples.ExampleDriver,这是在打包时生成的。定义这个class在pom.xml中,代码如下    
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-jar-plugin</artifactId>
      <configuration>
       <archive>
         <manifest>
           <mainClass>org.apache.hadoop.examples.ExampleDriver</mainClass>
         </manifest>
       </archive>
     </configuration>
    </plugin>*/
    Manifest manifest = jarFile.getManifest();
    if (manifest != null) {
      mainClassName = manifest.getMainAttributes().getValue("Main-Class");
    }
    jarFile.close();

    if (mainClassName == null) {
      if (args.length < 2) {
        System.err.println(usage);
        System.exit(-1);
      }
      mainClassName = args[firstArg++];
    }
    mainClassName = mainClassName.replaceAll("/", ".");

    File tmpDir = new File(new Configuration().get("hadoop.tmp.dir"));
    ensureDirectory(tmpDir);
//创建jar包运行的临时目录
    final File workDir;
    try { 
      workDir = File.createTempFile("hadoop-unjar", "", tmpDir);
    } catch (IOException ioe) {
      // If user has insufficient perms to write to tmpDir, default  
      // "Permission denied" message doesn't specify a filename. 
      System.err.println("Error creating temp dir in hadoop.tmp.dir "
                         + tmpDir + " due to " + ioe.getMessage());
      System.exit(-1);
      return;
    }

    if (!workDir.delete()) {
      System.err.println("Delete failed for " + workDir);
      System.exit(-1);
    }
    ensureDirectory(workDir);
//添加运行结束后执行hook,用于删除临时文件
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
          FileUtil.fullyDelete(workDir);
        }
      });

    unJar(file, workDir);
//初始化CLASSPATH
    ArrayList<URL> classPath = new ArrayList<URL>();
    classPath.add(new File(workDir+"/").toURI().toURL());
    classPath.add(file.toURI().toURL());
    classPath.add(new File(workDir, "classes/").toURI().toURL());
    File[] libs = new File(workDir, "lib").listFiles();
    if (libs != null) {
      for (int i = 0; i < libs.length; i++) {
        classPath.add(libs[i].toURI().toURL());
      }
    }
    
    ClassLoader loader =
      new URLClassLoader(classPath.toArray(new URL[0]));
//利用反射加载jar包中的mainclass
    Thread.currentThread().setContextClassLoader(loader);
    Class<?> mainClass = Class.forName(mainClassName, true, loader);
    Method main = mainClass.getMethod("main", new Class[] {
      Array.newInstance(String.class, 0).getClass()
    });
    String[] newArgs = Arrays.asList(args)
      .subList(firstArg, args.length).toArray(new String[0]);
    try {
      main.invoke(null, new Object[] { newArgs });
    } catch (InvocationTargetException e) {
      throw e.getTargetException();
    }
  }
 

3、 ExampleDriver.java

(在执行wordcount时,命令中并没有执行wordcount的类,只有一个字符串“wordcount”,ExampleDriver就是将这个字符串解析成对应的类,并通过ProgramDriver调用,相关代码如下)

//初始化ProgramDriver,并添加wordcount和其对应的类
ProgramDriver pgd = new ProgramDriver();
    try {
      pgd.addClass("wordcount", WordCount.class, 
                   "A map/reduce program that counts the words in the input files.");
          …
//执行传递进来的参数,即wordcount
      exitCode = pgd.driver(argv);
    }
    catch(Throwable e){
      e.printStackTrace();
    }
 

4、 ProgramDriver.java

(wordcount被传递给driver,在这里将真正执行WordCount.class)

public int driver(String[] args) 
    throws Throwable {
    …
//通过参数wordcount获取封装了WordCount.class的ProgramDescription
    ProgramDescription pgm = programs.get(args[0]);
    if (pgm == null) {
      System.out.println("Unknown program '" + args[0] + "' chosen.");
      printUsage(programs);
      return -1;
    }
	//通过反射调用WordCount.class的main方法
    // Remove the leading argument and call main
    String[] new_args = new String[args.length - 1];
    for(int i=1; i < args.length; ++i) {
      new_args[i-1] = args[i];
    }
    pgm.invoke(new_args);
    return 0;
  }
 

5、 WordCount.java

(WordCount没什么好说的,初始化job的一些参数,提交job)

public static void main(String[] args) throws Exception {
    …
    Job job = new Job(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
//在这里通过waitForCompletion(true)提交Job
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
 

6、 之后,WordCount将在Job中通过JobSubmitter提交到实现了ClientProtocol协议的类去真正提交Job。

分享到:
评论

相关推荐

    YARN(MRv2)搭建

    YARN(MRv2)搭建

    yarn-v0.23.2.tar.gz

    yarn-v0.23.2.tar.gz 在安装ambari,源码编译的时候下载的文件有问题 手动下载 地址 https://github.com/yarnpkg/yarn/releases/download/v0.23.2/yarn-v0.23.2.tar.gz

    03_MapReduce 和Spark on YARN.docx

    YARN是Hadoop 2.x引入的一个核心组件,它是一个资源协调框架,负责管理集群中的资源分配,如内存和CPU。YARN的设计目标是提高集群的灵活性和利用率,允许不同计算框架如MapReduce、Spark、Impala等在同一集群上并行...

    23、hadoop集群中yarn运行mapreduce的内存、CPU分配调度计算与优化

    在Hadoop集群中,YARN(Yet Another Resource Negotiator)作为资源管理器,负责调度MapReduce任务的内存和CPU资源。YARN支持基于内存和CPU的两种资源调度策略,以确保集群资源的有效利用。在非默认配置下,合理地...

    hadoop2.x集群搭建.txt(hdfs和yarn貌似正常,但mapreduce 提交job执行失败,请看我的另一个资源,另一个搭建是成功的)

    根据提供的文件信息,本文将详细解析Hadoop 2.x集群的搭建步骤以及遇到的问题,特别是针对MapReduce提交Job执行失败的情况进行分析。 ### Hadoop 2.x 集群搭建 #### 一、前期准备 在搭建Hadoop 2.x集群之前,我们...

    hadoop-yarn-client-2.6.5-API文档-中文版.zip

    赠送jar包:hadoop-yarn-client-2.6.5.jar; 赠送原API文档:hadoop-yarn-client-2.6.5-javadoc.jar; 赠送源代码:hadoop-yarn-client-2.6.5-sources.jar; 赠送Maven依赖信息文件:hadoop-yarn-client-2.6.5.pom;...

    Hadoop演示文稿jjjjjjjjj

    2. 配置core-site.xml文件,指定HDFS中NameNode的地址为hdfs://hadoop301:9000。 3. 配置hdfs-site.xml文件,指定HDFS副本的数量为1。 二、HDFS集群启动 1. 格式化NameNode(第一次启动时格式化,以后不需要总格式...

    大数据平台构建:YARN中运行Mapreduce程序.pptx

    【大数据平台构建:YARN中运行Mapreduce程序】 在大数据处理领域,Apache Hadoop的YARN(Yet Another Resource Negotiator)是一种重要的资源管理和调度系统,它使得不同的计算框架如MapReduce能够高效地运行在...

    flink依赖jar包——解决NoClassDefFoundError: com/sun/jersey

    当flink on yarn模式运行时,发生如下异常信息,需要将压缩包中的4个依赖jar包放入flink安装路径下的lib目录下。 Exception in thread "main" java.lang.NoClassDefFoundError: ...

    MapReduceV1和V2的API区别

    随着时间的推移,MapReduce经历了两次主要的版本升级,即MapReduce V1(MRv1)和MapReduce V2(MRv2,也称为YARN)。这两个版本在API设计和执行模型上有所不同,影响了开发人员的工作流程和系统性能。下面将详细讨论...

    hadoop-yarn-client-2.7.3-API文档-中英对照版.zip

    赠送jar包:hadoop-yarn-client-2.7.3.jar; 赠送原API文档:hadoop-yarn-client-2.7.3-javadoc.jar; 赠送源代码:hadoop-yarn-client-2.7.3-sources.jar; 赠送Maven依赖信息文件:hadoop-yarn-client-2.7.3.pom;...

    hadoop-yarn-client-2.5.1-API文档-中英对照版.zip

    赠送jar包:hadoop-yarn-client-2.5.1.jar; 赠送原API文档:hadoop-yarn-client-2.5.1-javadoc.jar; 赠送源代码:hadoop-yarn-client-2.5.1-sources.jar; 赠送Maven依赖信息文件:hadoop-yarn-client-2.5.1.pom;...

    hadoop-mapreduce-client-common-2.6.5-API文档-中英对照版.zip

    赠送jar包:hadoop-mapreduce-client-common-2.6.5.jar; 赠送原API文档:hadoop-mapreduce-client-common-2.6.5-javadoc.jar; 赠送源代码:hadoop-mapreduce-client-common-2.6.5-sources.jar; 赠送Maven依赖信息...

    Apache Hadoop YARN:Moving beyond MapReduce and Batch Processing with Hadoop 2

    Apache Hadoop YARN是Hadoop 2.0核心组件之一,它代表了Hadoop技术的重大进步,超越了原有的MapReduce和批处理的局限性。Hadoop YARN权威指南是一本专门介绍YARN架构及其功能的书籍。首先,我们需要了解Hadoop YARN...

    大数据技术之Hadoop(MapReduce&Yarn).docx

    【大数据技术之Hadoop(MapReduce&Yarn)】 Hadoop是一个开源的分布式计算框架,主要由两个关键组件组成:MapReduce和YARN。MapReduce是Hadoop的核心计算模型,用于处理大规模数据集;YARN则是资源管理系统,负责调度...

    05.hadoop上课笔记之hadoop5mapreduce和yarn

    Hadoop.MapReduce 和 YARN 笔记 本节笔记主要介绍了 Hadoop.MapReduce 和 YARN 的基本概念、组成部分、工作原理以及实践应用。 一、MapReduce 概念 MapReduce 是 Hadoop 的核心组件之一,负责处理大规模数据。...

    YARN Moving beyond MapReduce and Batch Processing with Apache Hadoop

    1. YARN的背景和动机:在传统的Hadoop中,MapReduce作为主要的计算框架,承担了大部分的处理任务。随着大数据技术的发展和数据处理需求的增长,MapReduce的局限性开始显现。例如,它在多任务处理、资源管理和容错...

    第5章大数据技术教程-MapReduce运行原理及Yarn介绍.docx

    于是产生了 MapReduce2,为了区别版本,将老版本的 MapReduce 称为 MapReduce1,MapReduce2 称之为 YARN(Yet Another Resource Negotiator,另一种资源协调者)。 YARN 的设计思想是为了改善 MapReduce 的实现,但...

    window下eclipse中运行mapreduce程序所需要的Hadoop全部jar包

    - Hadoop MapReduce Client:提供MapReduce编程模型,包括Mapper、Reducer、InputFormat、OutputFormat等相关类。 - Hadoop Distributed File System (HDFS):HDFS的客户端库,用于与Hadoop文件系统交互。 - ...

    Yarn编程ApplicationList

    在分布式计算领域,Apache Hadoop YARN(Yet Another Resource Negotiator)是核心组件之一,它作为资源管理系统,负责调度和管理Hadoop集群上的应用程序。在这个主题中,我们将深入探讨"Yarn编程ApplicationList",...

Global site tag (gtag.js) - Google Analytics