服务器模式之在本地提交
首先需要在src下放置服务器上的hadoop配置文件
1、在本地直接调用,执行过程在服务器上(调试)
a、把MR程序打包(jar),直接放到本地
b、修改hadoop的源码 ,注意:确保项目的lib需要真实安装的jdk的lib
c、增加一个属性:
config.set(“mapred.jar”, “C:\Users\Administrator\Desktop\wc.jar”);
d、本地执行main方法,servlet调用MR。
配置Eclipse本地hadoop服务器模式出现的问题:
参考:
1、出现了Exception in thread “main” java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
:
一直按照网上的缺少hadoop.dll,没有配置好JAVA_HOME, PATH, CLASSPATH, winutils.exe, 一直没有弄好
解决:
将hadoop的配置文件中的主机名改为ip
发现没有该报错了,但是没有弄清楚原因
2、ExitCodeException exitCode=1: /bin/bash: 第 0 行:fg: 无任务控制
解决方法:
在Eclipse中配置hadoop的mapred-site.xml,添加下面的配置
<property>
<name>mapred.remote.os</name>
<value>Linux</value>
<description>Remote MapReduce framework's OS, can be either Linux or Windows</description>
</property>
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
3、historyserver没有启动
cd {HADOOP_HOME}
./sbin/mr-jobhistory-daemon.sh start historyserver
4、No job jar file set. User classes may not be found. See Job or Job#setJar(String)
将原来的有conf来加载jar
conf.set("mapred.jar", "C:\\Users\\Administrator\\Desktop\\wc.jar");
改为由Job加载Jar
job.setJar("C:\\Users\\Administrator\\Desktop\\wc.jar");
结果成功了!
至此windows调试hadoop服务器模式已经成功!!!
接下来谈谈服务器模式
服务器环境:前期要求
首先需要在src下放置服务器上的hadoop配置文件
注意:hadoop的配置文件防src下, 本人尝试在src下创建一个conf的文件夹放置配置文件, 总是出问题。无奈之下,只能老实的放在src下
1、在本地直接调用,执行过程在服务器上(真正企业运行环境)
- a、把MR程序打包(jar),直接放到本地
- b、修改hadoop的源码 ,注意:确保项目的lib需要真实安装的jdk的lib
- c、增加一个属性:
config.set(“mapred.jar”, “C:\Users\Administrator\Desktop\wc.jar”); ctmp 设置Jar, job.setJar(String);上面按照步骤c, 增加一个属性可能没有作用, 使用job.setJar(String);本人就是出现这种情况, 一致报没有找到mapper和reducer的类
job.setJar("C:\\Users\\Administrator\\Desktop\\wc.jar");
d、本地执行main方法,servlet调用MR。
package com.chb;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WC {
public static void main(String[] args) {
//设置hadoop用户,我们可能不是使用root用户,要在此处添加
System.setProperty("HADOOP_USER_NAME", "chb");
//加载配置
Configuration conf = new Configuration();
//使用config.set(jar), 总是报错, 用job.setJar(String), 加载放在本地的程序导出的jar包
//conf.set("mapred.jar", "C:\\Users\\Administrator\\Desktop\\wc.jar");
try {
FileSystem fs = FileSystem.get(conf);
//创建任务
Job job =Job.getInstance();
job.setJarByClass(com.chb.WC.class);
job.setJar("C:\\Users\\Administrator\\Desktop\\wc.jar");
job.setJobName("WC");
//Mapper和Reducer类
job.setMapperClass(com.chb.WCMapper.class);
job.setReducerClass(com.chb.WCReducer.class);
//Mapper的输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//输入输出路径
FileInputFormat.addInputPath(job, new Path("/user/chb/input/"));
Path out = new Path("/user/chb/output/wc");
if(fs.exists(out)) {
fs.delete(out, true);
}
FileOutputFormat.setOutputPath(job, out);
boolean f = job.waitForCompletion(true);
if(f){
System.out.println("任务已经完成了");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}