zoukankan      html  css  js  c++  java
  • Hadoop基础(五十六):其他面试题 手写Hadoop WordCount

    环境说明:

    • jdk1.8
    • hadoop-2.7.7
    • windows上配置好的带有hadoop环境的eclipse

    1.自定义Mapper

    /*
     * LongWritable对应输入的key类型,默认是行的偏移量LongWritable
     * Text,对应上输入的value类型,默认行数据Text
     * Text:对应输出的key类型,不能使用默认值,需要根据需求更改
     * Text:对应输出的value类型,根据需求修改
     * @author lesie
     * 要求输出的格式(key,1)
     * 单词计数输出的key类型为Text
     * 输出的value类型为IntWritable
     */
    public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
        
        /*
         * KEYIN
         * VALUEIN
         * context--环境对象,输出结果
         * @see org.apach.hadoop.mapreduce.Mapper#map(KEYIN,VALUEIN,...)
         */
        public void map(LongWritable ikey,Text ivalue,Context context) throws IOException, InterruptedException
        {
            //获取一行数据
            String line=ivalue.toString();
            
            //按空格切片
            String []arrs=line.split(" ");
            for(String arr:arrs)
            {
                context.write(new Text(arr),new IntWritable(1));
            }
            
        }
    }

    2.自定义Reducer

    /*
     * reducer的数输入key用公式mapper输出的key类型
     * valuein:reducer的输入value应该是mapper输出的value类型
     * keyout:根据业务而定
     * valueout:根据业务而定
     * @author lesie 
     * 工作机制:
     * 1.将key相同的value进行合并,形成一个Iterable,交给程序
     * eg:(hello,<1,1,1,1,1,1>)
     * 2.reduce方法执行的次数取决于mapper输出的key,有多个不同的key执行多少次
     * 3.默认的排序,对key进行排序,先按照数字进行排再按照字典顺序
     */
    
    public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        
        public void reduce(Text _key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            // process values
            //定义计数变量
            int sum=0;
            //进行累加操作
            for (IntWritable val : values) {
                //通过get方法取出其中的值
                sum+=val.get();
            }
            //输出数据,最终结果,key是单词Text,value是单词出现的总次数
            context.write(_key, new IntWritable(sum));
        }
    
    }

    3.主程序

    public class WordCountDriver {
    
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            //获取当前配置
            Configuration conf=new Configuration();
            
            //获取一个表示当前Mapreduce作业的Job对象,向ahdoop申请一个job任务执行逻辑
            Job job=Job.getInstance();
            
            //指定程序入口
            job.setJarByClass(WordCountDriver.class);
            
            //设置需要执行的Mapper类
            job.setMapperClass(WordCountMapper.class);
            
            //设置Reducer类
            job.setReducerClass(WordCountReducer.class);
            
            //设置Mapper的输出类型
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            
            //设置Reducer的输出结果类型
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            
            //设置输入路径
            FileInputFormat.setInputPaths(job, new Path("hdfs://192.168.140.128:9000/wc/words.txt"));
            
            //设置输出路径
            FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.140.128:9000/wc/result6"));
            
            //任务的提交
            job.waitForCompletion(true);
        }
    
    }

    本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/14113345.html

  • 相关阅读:
    Less:优雅的写CSS代码
    线程池(ThreadPool)
    TiDB
    Docker实现CentOS容器SSH远程登录
    Oracle-Hints详解
    Oracle sql执行计划解析
    引擎基本服务接口API介绍
    ssh远程连接docker中linux(ubuntu/centos)
    自制操作系统
    kafka-net
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14113345.html
Copyright © 2011-2022 走看看