首先,在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中的配置就失效了。