运行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类: