MapReduce wordcount

package tmp;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import java.io.IOException;
//用ctrl+o导入类中的方法
//WordCount(词频统计)用于统计海量的文件,需要统计每一个单词出现的数量
public class WordCount {
        static class MyMapper extends Mapper<LongWritable, Text,Text, LongWritable>
        {
           // Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>
            //KEYIN:框架要传送给咱们写的map方法的输入参数key的数据类型
            //默认情况下,框架要传入的key是框架从待处理数据(文本文件)中,读取的某一行数据的偏移量,所以类型
            //是long(对于海量数据来说int不够用)
            //VALUE:框架要传送给咱们写的map方法的输入参数value的数据类型
            //所以是String类型,但是long,String等java原生态的数据类型的序列化效率较低(网络只能传输二进制数据
            //所以要序列化),所以hadoop对数据类型进行了封装,有替代品:LongWritable/Text
            //map方法处理完数据之后,需要返回值(一个key,一个value)
            //KEYOUT:是map方法处理完数据之后返回的key的数据类型
            //VALUEOUT:是map方法处理完数据之后返回的value的数据类型
            //我们自定义map方法的调用规律:
            //maptask每读取一行数据,就调用一次map方法
            @Override
            protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
             String line = value.toString();
             //先将Text转化成String类型
             String[] words = line.split(" ");
             for (String word : words) {
                context.write(new Text(word), new LongWritable(1));
                //将单词作为key,将1作为value,以便于后续数据分发
                 //map端的输出数据:
                 //<hello,1>
                 //<world,1>
            }

        }
    }

        static class MyReducer extends Reducer<Text,LongWritable,Text,LongWritable>
        {
            //reduce方法要接收的输入参数有两个:一个key,一个value(它是迭代器,Iterable<T>value)
            //用迭代器是因为在数据量很大的情况下,迭代器不占用内存
            //所有key相同的数据都会给一个reduce
            //KEYIN: 框架要传递给reduce方法的输入参数的KEY的类型--对应map方法输出的key的类型
            //VALUEIN:框架要传递给reduce方法的输入参数的VALUE的类型--对应map方法输出的value的类型
            //KEYOUT:reduce方法处理完成后的输出结果的key的类型
            //VALUEOUT:reduce方法处理完成后的输出结果的value的类型(这里要输出 hello 3 这种格式)
            //reduce方法的调用规律:框架从map端的输出结果中,挑选出所有的key相同的一组key-value数据对
            //组成一组,然后每一组调用一次reduce方法
            @Override
            protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
                //接到的数据:
                //注:是按key的字典顺序排序(升序)
                //<gp1816,1>
                //<hadoop,1>
                //<hdfs,1>
                //<hello,1>
                //<hrllo,1>
                //....
                //传入参数,是一组相同单词key的kv键值对
                //value是若干相同key的所有value的集合
                //<gp1816,1,1,1,1>
                long count=0;//定义变量累加单词出现的次数
                for(LongWritable v:values)
                {
                    count=count+v.get();//v.get()返回值为long
                    //次数不一定是1,这样写比较保险
                }
                context.write(key,new LongWritable(count));
                //将数据输出
            }
        }

        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            Configuration conf=new Configuration();
            //获取一个配置文件
            conf.set("fs.defaultFS","hdfs://hadoop1:9000");
            //非HA只要设置这个就OK
            Job job=Job.getInstance(conf,"wordcount");
            //wordcount为job的名字
            job.setJarByClass(WordCount.class);
            //指定job的路径
            job.setMapperClass(MyMapper.class);
            //指定本业务job要使用的Mapper类
            job.setReducerClass(MyReducer.class);
            //指定本业务job要使用的Reducer类
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(LongWritable.class);
            //指定map端数据的输出类型
            FileInputFormat.setInputPaths(job,new Path(args[0]));//args[0])表示第一个参数
            //指定job的输入路径
            FileOutputFormat.setOutputPath(job,new Path(args[1]));
            //指定job的输出路径
            job.setNumReduceTasks(Integer.parseInt(args[2]));
            //设置reducetask的个数,默认是1
            boolean b=job.waitForCompletion(true);
            //提交job,true表示显示程序的详细信息
            System.exit(b?0:1);//0表示正常退出
        }
//在集群上运行:
    //1点--clean--package生成jar包
    //把jar导入集群中,并在linux中创建一个txt任务文件
    //#hdfs dfs -mkidr /input
    //#hdfs dfs -put 1.txt /input
    //hadoop jar juruo-1.0-SNAPSHOT.jar tmp.WordCount /input /output
    //或yarn jar juruo-1.0-SNAPSHOT.jar tmp.WordCount /input /output
    //注:/output在程序运行前不存在,tmp为类的包名
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值