首先,在windows下安装hadoop,设置环境变量,还要加一个dll。
资源在这:
资源下载完按一下步骤配置,
1:将文件解压到hadoop的bin目录下
2:将hadoop.dll复制到C:\Window\System32下
3:添加环境变量HADOOP_HOME,指向hadoop目录
4:将%HADOOP_HOME%\bin加入到path里面
5、重启ide(因为windows环境变量是在应用启动时才获取,所以需要重启才能获取到新修改的)
这个方法适合开发时调试使用,方便我们在编译器上打断点什么的。正式集群中运行时,我们还是打成jar包,用hadoop jar命令提交job更好。
在mapred-site.xml文件中配置参数:
<property>
<name>mapreduce.framework.name</name>
<value>local</value>
</property>
如果value的值是yarn,那么不论在linux下还是在windows下都会使用yarn集群,至于yarn集群在哪?那就看yarn-site.xml里面配置的yarn集群地址了(而且还需要修改一点代码里的东西,看另一篇文章:)
windows本地运行mapreduce代码,我们写代码一般是在windows下写,所以本地运行代码自然是更好测试的。
(1)要在windows下运行hadoop,要比运行在linux下多配置一些额外的东西。
具体请看我这篇文章
(2)job代码:
//hdfs操作文件系统的用户名,避免在windows下使用默认用户名对hdfs没有修改权限
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf = new Configuration();
//namenode返回远程datanode主机的主机名,而不使用内网ip,
//并且需要配置当前代码运行到的所有主机的hosts文件,
//把namenode返回的主机名与对应主机ip的映射写好。。有钱的话可以用域名
conf.set("dfs.client.use.datanode.hostname", "true");
Job job = Job.getInstance(conf);
//下面这样作用是指定job要使用的jar包,该jar包是WCRunner类所属项目的
job.setJarByClass(WCRunner.class);
//指定当前作业执行的Mapper与Reducer
job.setMapperClass(WCMapper.class);
job.setReducerClass(WCReduce.class);
//指定Mapper与Reducer输出的key-value类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
//执行Mapper输出的key-value类型
//可以覆盖上面的,这样的话就相当于上面两行是指定Reducer的输出kv类型
//而下面两行是指定Mapper的输出kv类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
//指定输入数据存放在hdfs的目录,只要指定目录就行,到时候会读取整个目录下的所有文件
FileInputFormat.setInputPaths(job, new Path("/wc/srcData"));
Path path = new Path("/wc/output");
FileSystem fileSystem = FileSystem.get(conf);
if (fileSystem.exists(path)){
fileSystem.delete(path,true );
}
//指定处理结果输出数据存放在hdfs的目录
FileOutputFormat.setOutputPath(job,path );
boolean b = job.waitForCompletion(true);
System.out.println(b);
(3)配置文件:
core-site.xml:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoopTest:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop/tmp</value>
</property>
</configuration>
mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>local</value>
</property>
<!--跨平台提交代码,也就是在windows下读取环境变量使用%var%,在linux下读取环境变量使用$var,以及其他windows和linux的差别,
省的去修改YARNRunner.java源码-->
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
</configuration>
当mapreduce.framework.name的值为local时(默认就是local),hadoop就不会使用yarn集群,而是单机运行。。
只有单机运行时,才能方便的用断点调试mapper和reducer代码。
而不使用yarn,所以yarn-site.xml中的配置就失效了。