运行MR程序的方式

运行MR程序的几种方式

打包成jar包后运行

可以需要配置

     configuration.set("mapreduce.framework.name","yarn");
     configuration.set("yarn.resourcemanager.hostname","bigdata02");
     configuration.set("fs.defaultFS","hdfs://bigdata02:9000");

//如果使用java -jar的方式运行的话,设置的路径为在Client上的路径,就必须以这种方式设置jar的路径,但是如果使用的是hadoop jar的方式,那么可以使用第二种方法
 job.setJar("G:\\Users\\Administrator\\IdeaProjects\\learninghadoop\\target\\learninghadoop-1.0-SNAPSHOT.jar");

 /*job.setJarByClass(WordCount.class);*/

也可以不设置,这样的话就会默认使用linux中hadoop安装目录中的配置文件里面的配置信息
注意:
使用”hadoop jar xxx.jar 主类的全限定名”和使用”java -jar xxx.jar”的方式设置jar路径的区别

在eclipse上以本地模式运行

此时,可以自己设置配置

    conf.set("mapreduce.framework.name","local");
    conf.set("yarn.resourcemanager.hostname","local");
    conf.set("fs.defaultFS","file:///");

也可以使用默认的配置,因为默认的配置就是在本地运行,默认的配置(Windows中hadoop安装路径下的配置文件的配置信息)如下:


<configuration>
    <property>
        <name>fs.defaultFSname>
        <value>hdfs://localhost:9000value>
    property>
configuration>


<configuration>
    <property>
       <name>mapreduce.framework.namename>
       <value>yarnvalue>
    property>
configuration>

此时就可以直接在Eclipse上以本地模式运行了,也可以进行调试,在写程序的时候应该使用这种模式运行,这样可以测试出代码的逻辑是否有错误

在Eclipse上直接将jar包提交到集群运行

此时需要改变默认的配置

     configuration.set("mapreduce.framework.name","yarn");
     configuration.set("yarn.resourcemanager.hostname","bigdata02");
     configuration.set("fs.defaultFS","hdfs://bigdata02:9000");

//必须以这种方式设置jar的路径
 job.setJar("G:\\Users\\Administrator\\IdeaProjects\\learninghadoop\\target\\learninghadoop-1.0-SNAPSHOT.jar");
 /*job.setJarByClass(WordCount.class);*/

这样运行后还是会出错,因为这边是在widows上运行的,所以其初始化的上下文中的一些信息,例如sehll命令是使用widnows中的一些命令来完成的,我们可以调试YARNRunner上的submitJob方法如下:

  @Override
  public JobStatus submitJob(JobID jobId, String jobSubmitDir, Credentials ts)
  throws IOException, InterruptedException {

    addHistoryToken(ts);

    // Construct necessary information to start the MR AM
    //在这里会先初始化一些必要的信息,用于提交MR程序
    ApplicationSubmissionContext appContext =
      createApplicationSubmissionContext(conf, jobSubmitDir, ts);

      ........................
  }

appContext中的一些必要的初始化信息的调试结果
运行MR程序的方式_第1张图片
在这里我们可以看到这其中有一些sehll的命令是widnows下的”:”以及”%”,这些应该替换成linux下的”,”和”$”
此时我们就需要修改YARNRunner类,只要在我们的src目录下新建一个一模一样的YARNRunner类就好了(完全限定名一样),然后再提交的时候,对我们的初始化的必要的信息进行替换就可以了,代码如下:

private String getLinux(String org) {
        StringBuilder sb = new StringBuilder();
        int c = 0;
        for (int i = 0; i < org.length(); i++) {
            if (org.charAt(i) == '%') {
                c++;
                if (c % 2 == 1) {
                    sb.append("$");
                }
            } else {
                switch (org.charAt(i)) {
                case ';':
                    sb.append(":");
                    break;

                case '\\':
                    sb.append("/");
                    break;
                default:
                    sb.append(org.charAt(i));
                    break;
                }
            }
        }
        return (sb.toString());
    }

这样当运行的时候,就会使用就近原则,加载的是src下的YARNRunner类
下面是自己改写的YARNRunner类:

修改之后的YARNRunner

你可能感兴趣的:(hadoop,mapreduce)