Eclipse下HadoopのMapReduce開発のMapReduce作成

5037 ワード

hadoopインストールの導入とEclipseインストールの統合については、ここでは説明しません.
    まずビジネスニーズについてお話ししましょう.システムの実行情報を記録するシステムログファイルがあります.その中にはDEBUG、INFO、WARN、ERRORの4つのレベルのログが含まれています.今、すべてのレベルにどれだけのレコードがあるかを見たいです.
    map/reduceプロジェクトを作成します.プロジェクト名はmapreducetestです.srcの下にmapreducetestというパッケージを作成し、次にコードというクラスを作成します.
package mapreducetest;

import java.io.IOException;

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.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class MapReduceTest extends Configuration implements Tool{
    /**
     *   
     */
    private Configuration configuration;
    /**
     *     
     */
    @Override
    public Configuration getConf() {
        return this.configuration;
    }
    /**
     *     
     */
    @Override
    public void setConf(Configuration arg0) {
        this.configuration=arg0;
    }
    /**
     * 
     * @ClassName: Counter 
     * @Description: TODO(   ) 
     * @author scc
     * @date 2015 5 27    2:54:39 
     *
     */
    enum Counter{
        TIMER
    }
    /**
     * 
     * @ClassName: Map 
     * @Description: map  ,   map        Mapper         ,  key  ,  value  ,  key  ,  value  
     * @author scc
     * @date 2015 5 27    2:30:06 
     * @
     */
    public static class Map extends Mapper<LongWritable, Text, Text, Text>{
        /**
         * key:  key
         * value:  value
         * context:map     
         *   ,hdfs               
         */
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            try{
                //         
                String mapvalue=value.toString();
                //        ,               string  
                String[] infos=mapvalue.split(" ");
                //         ,           ,
                String info=infos[10];
                //      (      key,      value),  key value        
                context.write(new Text(info), new Text(info));
            }catch(Exception e){
                //         
                context.getCounter(Counter.TIMER).increment(1);
                return;
            }
        }
        
    }
    /**
     * 
     * @ClassName: Reduce 
     * @Description: reduce    ,Reducer    ,      key value   ,   map  ,       key value   
     * @author scc
     * @date 2015 5 27    3:33:06 
     *
     */
    public static class Reduce extends Reducer<Text, Text, Text, Text>{
        /**
         *         value,       key      value  ,    reducer    
         *   : map       map           , map    key    ,      key      key,    map   10    ,
         *      key key1,    key2,   reduce         reduce,   key1 key2
         */
        @Override
        protected void reduce(Text key, Iterable<Text> values,Context arg2) throws IOException, InterruptedException {
            //       key
            String info=key.toString();
            //   
            int count=0;
            //   key       1
            for (Text text : values) {
                if(info.equals(text.toString()))
                    count=count+1;
            }
            //            
            arg2.write(key, new Text(String.valueOf(count)));
        }
    }
    /**
     * run       
     */
    @Override
    public int run(String[] arg0) throws Exception {
        //    job,   job   
        Job job=Job.getInstance(getConf(), "maptest");
        //  job  
        job.setJarByClass(MapReduceTest.class);
        //        (hdfs  )
        FileInputFormat.setInputPaths(job,  new Path(arg0[0]));
        //        (hdfs  )
        FileOutputFormat.setOutputPath(job, new Path(arg0[1]));
        //  map    class
        job.setMapperClass(Map.class);
        //  reduce class
        job.setReducerClass(Reduce.class);
        //          class
        job.setOutputFormatClass(TextOutputFormat.class);
        //    key   
        job.setOutputKeyClass(Text.class);
        //    value   
        job.setOutputValueClass(Text.class);        
        //    job  
        job.waitForCompletion(true);
        return job.isSuccessful()?0:1;
    }
    public static void main(String[] args) throws Exception {
            String[] args2=new String[2];
            args2[0]="hdfs://192.168.1.55:9000/test2-in/singlemaptest.log";
            args2[1]="hdfs://192.168.1.55:9000/test2-out";
            int res=ToolRunner.run(new Configuration(), new MapReduceTest(), args2);
            System.exit(res);
    }
}

生成された結果は次のとおりです.
INFO	3800
WARN	55