简单的MapReduce程序wordCount

原理:

关于原理我就不多说,网上太多了。我也是网上查的,当然这些东西我不写不代表不重要。恰恰相反原理和它的具体执行流程非常重要是基础,不然学的东西都很空。而我也是小白没有自己的看法与意见,即使写也是把别人的照搬过来,没啥意思,当然随着自己理解的加深,也会更新blog。大概如下图:

MapReduce作业包括两个进程:JobTracker,TaskTracker。JobTracker包括n个TaskTracker。
TaskTracker下包括:MapTask和ReduceTask。

这里写图片描述

环境:

hadoop-2.6.4
eclipse

步骤:

一:新建java工程,并加载jar和建类

这里写图片描述

其中WorkCount.java是我建的maperReduce类,需要引入4个包(不一定是4个也许里面有不需要的。改天我在更新。。。今天太累。。还要写blog)

二:八股文式mapreduce程序

主要就分为3大块:map, reduce, client(Main方法)

Map块:

主要是粗加工,把数据分解成一个个单词然后形成,[abc, 1],[derrt, 1],[e, 1],[222, 1],[abc, 1]…….等这种key, value类型数据。

Reduce块:

reduce块的输入是Map块的输出,主要做copy(把数据从map块拿过来), sort, reduce(计算)。

client(主要是配置mapreduce执行的配置)。

package mr;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WorkCount {

    // Map
    static class myMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
        @Override
        protected void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptedException {
            // 获取每行数据的值
            String lineValue = value.toString();

            // 进行分割
            StringTokenizer st = new StringTokenizer(lineValue);

            // 遍历
            while(st.hasMoreTokens()){
                // 获取每个值
                String wordValue = st.nextToken();
                // 设置map输出的key值
                word.set(wordValue);

                // 上下文输出
                context.write(word, one);
            }
        }
    }

    // reducer
    static class myReducer 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 {
            // TODO Auto-generated method stub
            // 用于累加
            int sum = 0;
            // 循环遍历Iterable
            for(IntWritable value : values){
                sum += value.get();
            }
            result.set(sum);
            context.write(key, result);
        }


    }

    // client
    public static void main(String[] args) throws Exception {
        // 获取配置
        Configuration cf = new Configuration();
        // 创建Job,设置配置和job名称
        Job job = new Job(cf, "wordCount");

        // 1:设置Job运行的类
        job.setJarByClass(WorkCount.class);

        // 2:设置map和reducer
        job.setMapperClass(myMapper.class);
        job.setReducerClass(myReducer.class);

        // 3:设置输入文件目录和输出文件目录
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        // 4:设置输出结果的key和value类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        // 5:提交Job
        boolean resultB = job.waitForCompletion(true);
        // 结束程序
        System.exit(resultB ? 0 : 1);
    }

}

三:打包jar

mapreduce程序需要在hadoop上运行,所以打成jar包先。

a:工程右键export

这里写图片描述

b:选择java 》》JAE file

这里写图片描述

c:选择保存路径(名称自己定义)

一直next。。。
这里写图片描述

d:设置Main方法所在的类

这里写图片描述

e:上传到linux某个目录

这里写图片描述

四:HDFS数据准备

其中:abc.txt, rty.txt是我准备wordCount的数据。

这里写图片描述

五:执行程序

/dataN/input/是我的输入路径即(4:HDFS数据准备)。
/dataN/output6/是结果输出路径,这个路径不能存在,所以你就随便定义一个不存在的路径即可,否则报错。。。可以自己试试。。。

这里写图片描述

六:验证

状态成功。

这里写图片描述

输出数据检查:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值