MapReduce的入门示例WordCount

一. HAOOP集群环境搭建

参考:Hadoop的HA集群搭建

二. WordCount代码编写

1. 搭建maven工程

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2. pom中添加hadoop和hdfs依赖

	<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>${hadoop.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>${hadoop.version}</version>
    </dependency>
    <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-common</artifactId>
            <version>${hadoop.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
        <version>${hadoop.version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

3. map代码

public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
    //map每次读取文件中的一行,key为偏移量,value为一行文本
    //将每一行按照空格切分,统计出每个单词的数量
    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        System.out.println("===========>Start Mapper");
        String line = value.toString();
        String[] words = line.split(" ");
        for (int i = 0; i < words.length; i++) {
            word.set(words[i]);
            context.write(word, one);
            System.out.println("==== After Mapper: ==== " + word + "," + one);
        }
        System.out.println("===========>End Mapper");
    }

}

4. reduce代码

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    private IntWritable result = new IntWritable();

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        //reduce每次读取一组数据(key相同的为一组)
        System.out.println("===========>Start Reduce");
        int sum = 0;
        for (IntWritable value : values) {
            sum += value.get();
        }
        result.set(sum);
        context.write(key, result);
        System.out.println("==== After Reduce ==== " + key + ", " + key.toString());
    }
}

5. 主方法代码

public class WordCount {

    public static void main(String[] args) {
        try {
            Configuration conf = new Configuration();
            GenericOptionsParser optionParser = new GenericOptionsParser(conf, args);
            String[] remainingArgs = optionParser.getRemainingArgs();

            List<String> argList = new ArrayList<>();
            for (int i=0; i < remainingArgs.length; ++i) {
                argList.add(remainingArgs[i]);
            }

            Job job = Job.getInstance(conf, "MyWordCount");
            job.setJarByClass(WordCount.class);
            //指定自定义的Mapper阶段的任务处理类
            job.setMapperClass(WordCountMapper.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            FileInputFormat.setInputPaths(job, new Path(argList.get(0)));

            //指定自定义的Reducer阶段的任务处理类
            job.setReducerClass(WordCountReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            FileOutputFormat.setOutputPath(job, new Path(argList.get(1)));

            //执行提交job方法,直到完成,参数true打印进度和详情
            job.waitForCompletion(true);
            System.out.println("Finished");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

6. 在idea中配置启动项,并运行

在这里插入图片描述
配置mpreduce的输入文件和输出目录
在这里插入图片描述
运行
在这里插入图片描述
运行结果
在这里插入图片描述
打开part-r-00000
在这里插入图片描述

三. 生成jar包,并在集群中运行

1. 注意千万不要用mvn打出来的jar包在Hadoop上运行,会找不到对应的类(具体原因未知)

在这里插入图片描述

2.正确的打包方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置jar包的输出路径
在这里插入图片描述
设置主方法的类
在这里插入图片描述
在这里插入图片描述
构建生成jar
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上传jar包到集群主节点服务器,执行命令(in为hdfs地址,文件存储在in目录下):

hadoop jar MapReduceDemo.jar /in /out
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

victor-维克特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值