hadoop mapreduce wordcount识别字符 idea

这个代码,大家刚接触maoreduce的时候一定会遇到,这是一个比较典型的程序,具体的我都在代码中有注释,其中需要注意的地方就是 hadoop在每次产生输出以后,output的文件夹不能存在,否则会报错,其中我在运行的时候遇到了一些其他的错误,这里简单说一下如果报错提示 一直在connect hdfs连接不上,那么可能是你hadoop的防火墙没有关闭,还有可能是ssh的原因。如果报错是权限问题 那么 你可以更改一下权限 hadoop fs -chmod -R 777 / 这个来更改hadoop下全部的文件权限。 其中输入输出我是写死的,其实这个你可以在idea下 runconfigure下更改,在program arguments 里面加入两个路径记得中间空格隔开就可以。 如果还有什么问题,可以下面评论,欢迎交流

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

public class wordcount {
    public static class TokenizerMapper
            extends Mapper{
        //四个参数,这个四个参数 k1,v1 k2 v2 其中k2 v2 是你要写入的内容,所以如果你是想两个字符串的话,应该是 Text Text 其中k2 v2 也是reduce 参数中的两个
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());//转换字符串
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);//写入参数 k2 v2 其中word单词作为key value为数字1 表示出现过一次
            }
        }
    }

    public static class IntSumReducer
            extends Reducer {
        private IntWritable result = new IntWritable();
        //这里的四个参数 k2 v2 k3 v3 这里如同上面的map 这四个参数前两个是你传入的 后两个是你要传出的数据类型
        public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) { // 相同key 也就是相同的单词
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);//经过处理后,讲单词作为key 后面的result就是统计后的单词数
        }
    }
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count"); //创建job 
        job.setJarByClass(wordcount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class); //combiner 这个是在map 和 reduce之间,这个用来优化map分开后的数据,有没有combiner对reduce的结果应该没有影响。
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);//设置输出的类型
        job.setOutputValueClass(IntWritable.class); 
        FileInputFormat.addInputPath(job, new Path("hdfs://192.168.200.132:9000/home/fym/input"));//  获取源数据 得到输入数据
        FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.200.132:9000/home/fym/output")); // 讲数据导出在这个文件夹下
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

 

你可能感兴趣的:(hadoop)