当前位置:   article > 正文

本地调试hadoop mapreduce踩坑记录_本地测试mapreduce无法创建文件夹

本地测试mapreduce无法创建文件夹

相信大家踩过无数hadoop的天坑, 我只是想在windows上调试下程序为什么这么麻烦呢?

hadoop安装

能正确安装hadoop是调试程序的关键。。

  • 下载地址:http://archive.apache.org/dist/hadoop/core/
    我选择的是2.7.1版本的

  • 配置环境变量
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 配好环境变量,在命令行运行 hadoop version,会报错
    如果此时出现以下错误:The system cannot find the batch label specified - make_command_arguments(有可能是中文的)

解决办法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 继续hadoop version, 可能还会报错, 报一个logs文件找不到,这里没图了, 根据提示,我们自己建出来。
    在这里插入图片描述
  • 如果还有点问题, 需要重启电脑, 可能可以解决
  • 现在可以写mapreduce程序了
    pom文件(记得用对应版本的)
<dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.7.1</version>
        </dependency>
    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

map

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;

public class WcMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        System.out.println("--->Map-->" + Thread.currentThread().getName());
        String[] words = StringUtils.split(value.toString(), ' ');
        for (String w : words) {
            context.write(new Text(w), new IntWritable(1));
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

reduce

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;

public class WcReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        System.out.println("--->Reducer-->" + Thread.currentThread().getName());
        int sum = 0;
        for (IntWritable i : values) {
            sum = sum + i.get();
        }
        context.write(key, new IntWritable(sum));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

启动程序

public class RunWcJob {
    public static void main(String[] args) throws Exception {
        // 创建本次mr程序的job实例
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);

        // 指定本次job运行的主类
        job.setJarByClass(RunWcJob.class);

        // 指定本次job的具体mapper reducer实现类
        job.setMapperClass(WcMapper.class);
        job.setReducerClass(WcReducer.class);

        // 指定本次job map阶段的输出数据类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        // 指定本次job reduce阶段的输出数据类型 也就是整个mr任务的最终输出类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        // 指定本次job待处理数据的目录 和程序执行完输出结果存放的目录
        FileInputFormat.setInputPaths(job, "D:\\hadoop\\input");
        FileOutputFormat.setOutputPath(job, new Path("D:\\hadoop\\output"));

        // 提交本次job
        boolean b = job.waitForCompletion(true);

        System.exit(b ? 0 : 1);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

然后在本地文件夹D:\hadoop\input下新建 words.txt,内容为上面给出的输入内容作为输入,同样输出文件夹为output(文件夹要不存在),那么直接运行程序:
可能出现的错误:

  • java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
    原因:
    没有拷贝winutils拷贝到hadoop-2.7.1bin目录下或者没有配置HADOOP_HOME环境变量或者配置HADOOP_HOME环境变量没生效
    解决:
    1.下载winutils拷贝到hadoop-2.7.1/bin目录下
    2.检查环境变量是否配置
    3.如果已经配置好环境变量,重启idea或这台电脑,有可能是环境变量没生效

下载地址:https://github.com/steveloughran/winutils
记得找对应版本的

  • Exception in thread “main” java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
    解决:
    将前面下载的文件(https://github.com/steveloughran/winutils)bin目录下的hadoop.dll复制到C:\Windows\System32下,启动idea
有这样的结果说明成功了, 去output目录下看看。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/976646
推荐阅读
相关标签
  

闽ICP备14008679号