hadoop计算字符数量的程序

上文讲解了hadoop Mapreduce程序编写模板,本节可以套用模板编写一个hadoop字符统计小程序,具体代码步骤如下:

前提,文本数据如下:

hadoop计算字符数量的程序

1、根据程序模板,填写map函数当中to_do带写部分,用于填写自己的map()函数的实现方法。这里主要是读取文本数据,然后转为hadoop的键值对。

2、根据map的结果,编写reduce函数的实现方法,这里主要用于统计map结果值当中values值的和。

3、运行模板程序,看下结果。

具体代码如下:

package Mapreduce;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable; // 相当于int类型
import org.apache.hadoop.io.LongWritable; // 相当于long类型
import org.apache.hadoop.io.Text; // 相当于String类型
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.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.StringUtils;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/**
 *
 * MapReduce程序模板
 * 新增加一个Mapreduce程序,修改类名,实现相应的map、reduce函数等
 */
public class MapreduceTemplate extends Configured implements Tool{
    //静态Mapper类
    public static class MapTemplate extends Mapper<LongWritable, Text, Text, IntWritable> {
        @Override
        public void map(LongWritable   key, Text value, Context context)
                throws IOException, InterruptedException {
            // 将输入数据解析成Key/Value对
            String line = value.toString();
            String  tokenizer[] = line.split("");
            for(String SingleChar : tokenizer)
            {
                Text charKey = new Text(SingleChar);
                IntWritable One = new IntWritable(1);
                context.write(charKey, One);
            }
        }
    }

    //静态Reducer类
    public static class ReduceTemplate extends Reducer<Text, IntWritable, Text, IntWritable> {
        @Override
        public void reduce(Text key, Iterable<IntWritable> values, Context context)
                throws IOException, InterruptedException {
            int sum =0;
            for(IntWritable i: values){
                sum=sum+i.get();
            }
            context.write(key, new IntWritable(sum));
        }
    }


    /**
     *job运行方法
     */
    @Override
    public int run(String[] args) throws Exception {
        //读取配置文件
        Configuration conf = getConf();
        //hdfs文件系统地址
        conf.set("fs.defaultFS", args[0]);
        //自定义key value 之间的分隔符(默认为tab)
        conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ",");
        // Job表示一个MapReduce任务,构造器第二个参数为Job的名称。
        Job job = Job.getInstance(conf, "MapReduceTemplate");
        job.setJarByClass(MapreduceTemplate.class);//主类

        Path in = new Path(args[1]);
        Path out = new Path(args[2]);
        FileSystem hdfs = out.getFileSyste-m(conf);
        
        
        if (hdfs.isDirectory(out)) {//如果输出路径存在就删除
            hdfs.delete(out, true);
        }
        FileInputFormat.setInputPaths(job, in);//文件输入
        FileOutputFormat.setOutputPath(job, out);//文件输出

        job.setMapperClass(MapTemplate.class); //设置自定义Mapper
        job.setReducerClass(ReduceTemplate.class); //设置自定义Reducer

        job.setOutputKeyClass(Text.class);//设置作业输出值 Key 的类 
        job.setOutputValueClass(IntWritable.class);//设置作业输出值 Value 的类

        return job.waitForCompletion(true)?0:1;//等待作业完成退出

    }

    //主方法,程序入口,调用jobrun方法
    public static void main(String[] args) throws Exception {
        args=new String[3];
        args[0]="hdfs://192.168.100.100:9000";//hdfs文件系统地址
        args[1]="/myHadoop/input/";//输入路径
        args[2]="/myHadoop/output/";//输出路径
        int exitCode = ToolRunner.run(new MapreduceTemplate(), args);
        System.exit(exitCode);
    }
}

运行结果:       

1、可以打包maven打包代码为jar到服务器上运行看下结果,运行命令如下:参考 hadoop入门程序wordcount

hadoop jar ./myHadooop.jar Mapreduce.MapreduceTemplate input output

--查看结果
hdfs dfs -cat /myHadoop/output/part-r-00000

2、可以在ide上运行完结果,然后登入web访问界面(http://hdp-master-01:50070/explorer.html#/myHadoop/output)

直接看结果文件

hadoop计算字符数量的程序