運行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安裝路徑下的配置文件的配置信息)如下:

<!--core-site.xml-->
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

<!--marped-site.xml-->
<configuration>
    <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
    </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中的一些必要的初始化信息的調試結果
這裏寫圖片描述
在這裏我們可以看到這其中有一些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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章