Hadoop分布式WordCount代码详解

来源:互联网 发布:win7怎么卸载软件 编辑:程序博客网 时间:2024/06/05 18:10

         Wordcount 号称Hadoop中的HelloWord,花时间好好研究了以下程序的细节,这研究之前必须搞懂MapReduce工作原理,网上有很多讲解。其实MapReduce就是个分治的思想,将文件分在不同的从节点上进行处理(Map),然后排序合并,最后进行汇总的过程(Reduce)。

MapReduce的总体流程如下:


        研究代码的过程中Reduce程序段不太懂,查看了Hadoop官网,官网的解释还是最好的,以后对于不会的知识要学会在官网找答案。

下面送上官网链接:

Hadoop MapReduceTutorial 点击打开链接



Map和Reduce两主类对应的参数解释:


下面是代码(java)的详细解释:

package com.yootk.mr.demo;import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;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.util.GenericOptionsParser;import org.apache.hadoop.io.Text;/** *  * it is a note. * @author  *需要在新建工程中提前配置(导入)hadoop文件中的jar包,/hadoop2.7.3-share-hadoop/commonhadoop2.7.3-share-hadoop/common/libhadoop2.7.3-share-hadoop/common/jdiffhadoop2.7.3-share-hadoop/mapreducehadoop2.7.3-share-hadoop/mapreduce/lib * Data: 2017年5月23日下午3:21:05 */public class Wordcount {        //实现单词统计//最为关键的Map部分与Reduce部分,需要用户自己来写/** * 本操作主要是进行map的数据处理 * 在Mapper的父类里面接收的内容如下: * Object:输入数据的具体内容; * Text:每行的文本数据; * Text:每个单词分解后的统计结果; * IntWritable:输出Map记录的结果; *  * it is a note. * @author  * * Data: 2017年5月23日下午3:22:57 */private static class WordcountMapper extends Mapper<Object, Text, Text, IntWritable>{@Overrideprotected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)throws IOException, InterruptedException {// 默认情况下是取得每行的数据,所以每行的数据里面都会存在有空格,按照空格进行拆分,每当出现一个单词就做一个统计的1String lineContent = value.toString();//取出每行的数据String result[] = lineContent.split(" ");//进行每行数据的拆分for(int x = 0;x<result.length; x ++){//循环每个单词而后进行数据的生成//每一个单词最终生成的保存个数是1context.write(new Text(result[x]), new IntWritable(1));}}}/** * 本操作主要是进行reduce的数据处理 * 进行合并后数据的最终统计 * Reduce类要使用的数据类型如下: * Text:Map输出的文本内容; * IntWritable:Map处理得到的个数 * Text:Reduce输出文本 * IntWritable:Reduce的输出个数 *  * it is a note. * @author . * * Data: 2017年5月23日下午3:33:10 */private static class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{@Overrideprotected void reduce(Text key, Iterable<IntWritable> values,Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {// TODO Auto-generated method stubint sum = 0 ;//保存每个单词出现的总次数/** * 对于此处的foreach循环,官网上找到的解释,此时传入Reduce的数据已经是 * <key, (list of values)>的结构,所以Map函数循环对每个可以值进行处理, * 对每个key值的value list进行循环加和统计。 * 官网http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html * In this phase the reduce(WritableComparable, Iterable<Writable>, Context)  * method is called for each <key, (list of values)> pair in the grouped inputs. */for(IntWritable count :  values){sum += count.get();}context.write(key, new IntWritable(sum));}}         public static void main(String[] args) throws Exception{// 输入、输出路径由命令行参数给出,这里判断是否有两个参数if(args.length != 2){System.out.println("本程序需要两个参数,执行,hadoop jar yootk.jar /input/info.txt /output");System.exit(1);}// 假设文件保存在HDFS /input/info.txt 中,且最终的输出结果也将保存在HDFS的 /output 目录中Configuration conf = new Configuration();//进行相关的配置使用// 下面的函数对命令行传入的参数进行处理String [] argArray = new GenericOptionsParser(conf, args).getRemainingArgs();// 定义一个名为hadoop的作业Job job = Job.getInstance(conf, "hadoop");// 设置执行的jar文件程序类job.setJarByClass(Wordcount.class);// Map处理job.setMapperClass(WordcountMapper.class);// 指定Mapper的处理类job.setMapOutputKeyClass(Text.class);// 设置输出的Key的类型job.setMapOutputValueClass(IntWritable.class);// 设置输出的value的类型// Reducer处理job.setReducerClass(WordcountReducer.class);// 设置Reduce的处理类job.setOutputKeyClass(Text.class);// 最终输出Ke信息,设置为文本job.setOutputValueClass(IntWritable.class);// 最终输出Value内容设置为一个整型数据//设置输入输出路径,命令行参数argArray[0] argArray[1]FileInputFormat.addInputPath(job, new Path(argArray[0]));FileOutputFormat.setOutputPath(job, new Path(argArray[1]));//等待执行完毕System.exit(job.waitForCompletion(true) ? 0 : 1); // 执行完后退出}}


原创粉丝点击