運行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類: