`
liuxinglanyue
  • 浏览: 557203 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hadoop学习笔记之二:MapReduce基本编程

阅读更多

 

转载务必注明出处Taobao QA Team,原文地址:http://qa.taobao.com/?p=10523

引言
在本系列的上篇文章中介绍了Hadoop的基本概念和架构,本文将通过一个实例演示MapReduce基本编程。在继续进行前希望能重温下前面的内容,至少理解这张图是怎么回事。

实践

  • 创建maven工程并加入hadoop依赖

  • 我们选用maven来管理工程,用自己喜爱的m2eclipse插件在eclipse里创建或在命令行里创建一个工程。在pom.xml里加入hadoop依赖。

     

    <dependency>
     <groupId>org.apache.hadoop</groupId>
     <artifactId>hadoop-core</artifactId>
     <version>0.20.2</version>
    </dependency>
    
    <repositories>
     <repository>
      <id>cloudera</id>
      <url>https://repository.cloudera.com/content/groups/public</url>
     </repository>
    </repositories>

     运行mvn eclipse:eclipse命令后,将工程导入eclipse,可以看到以下相关的依赖

     

     

    Ok,现在开始我们第一个MapReduce程序,用这个程序实现字数统计功能。

     

     

  • 概述

  • 一个简单的MapReduce程序需要三样东西
    1.实现Mapper,处理输入的对,输出中间结果
    2.实现Reduce,对中间结果进行运算,输出最终结果
    3.在main方法里定义运行作业,定义一个job,在这里控制job如何运行等。

  • 编写Map类
  •  

     

    public  class WordCountMapper
           extends Mapper{
        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);
          }
        }
      }

     

    Mapper接口是一个泛型,有4个形式的参数类型,分别指定map函数的输入键,输入值,输出键,输出值。就上面的示例来说,输入键没有用到(实际代表行在文本中格的位置,没有这方面的需要,所以忽略),输入值是一样文本,输出键为单词,输出值为整数代表单词出现的次数。需要注意的是Hadoop规定了自己的一套可用于网络序列优化的基本类型,而不是使用内置的java类型,这些都在org.apache.hadoop.io包中定义,上面使用的Text类型相当于java的String类型,IntWritable类型相当于java的Integer类型。除此之外,看不到任何分布式编程的细节,一切都是那么的简单。

  • 编写Reduce类
  •  

     

     

     

    public class WordCountReducer extends
    		Reducer {
    	private IntWritable result = new IntWritable();
    
    	public void reduce(Text key, Iterable values, Context context)
    			throws IOException, InterruptedException {
    		int sum = 0;
    		for (IntWritable val : values) {
    			sum += val.get();
    		}
    		result.set(sum);
    		context.write(key, result);
    	}
    }

     同样,Reducer接口的四个形式参数类型指定了reduce函数的输入和输出类型。在上面的例子中,输入键是单词,输入值是单词出现的次数,将单词出现的次数进行叠加,输出单词和单词总数。

  • 定义job
  •  

    public class WordCount {
      public static void main(String[] args) throws Exception {
         Configuration conf = new Configuration();
            String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
             if (otherArgs.length != 2) {
               System.err.println("Usage: wordcount  ");
               System.exit(2);
             }
             /**创建一个job,起个名字以便跟踪查看任务执行情况**/
             Job job = new Job(conf, "word count");
    
             /**当在hadoop集群上运行作业时,需要把代码打包成一个jar文件(hadoop会在集群分发这个文件),通过job的setJarByClass设置一个类,hadoop根据这个类找到所在的jar文件**/
            job.setJarByClass(WordCount.class);
    
            /**设置要使用的map、combiner、reduce类型**/
            job.setMapperClass(WordCountMapper.class);
            job.setCombinerClass(WordCountReducer.class);
            job.setReducerClass(WordCountReducer.class);
    
           /**设置map和reduce函数的输入类型,这里没有代码是因为我们使用默认的TextInputFormat,针对文本文件,按行将文本文件切割成 InputSplits, 并用 LineRecordReader 将 InputSplit 解析成 <key,value&gt: 对,key 是行在文件中的位置,value 是文件中的一行**/
    
            /**设置map和reduce函数的输出键和输出值类型**/
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
    
            /**设置输入和输出路径**/
            FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
            FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    
           /**提交作业并等待它完成**/
            System.exit(job.waitForCompletion(true) ? 0 : 1);
          }
    }
     

    基本上完成一个MapReduce程序就这么简单,复杂的在于job的配置有着复杂的属性参数,如文件分割策略、排序策略、map输出内存缓冲区的大小、工作线程数量等,深入理解掌握这些参数才能使自己的MapReduce程序在集群环境中运行的最优。

    小结

    本文通过一个实例说明了MapReduce的基本编程模型,希望通过此能加深对MapReduce的理解,在后面的文章中将介绍如何测试MapReduce及如何把作业运行起来。

    分享到:
    评论

    相关推荐

      hadoop学习笔记.rar

      四、hadoop学习笔记之二:MapReduce基本编程 MapReduce编程模型包括Map阶段和Reduce阶段。Map阶段将输入数据分解为键值对,然后分发到各个节点处理;Reduce阶段则负责聚合Map阶段的结果,生成最终输出。开发者需要...

      最新Hadoop学习笔记

      **Hadoop学习笔记详解** Hadoop是一个开源的分布式计算框架,由Apache基金会开发,主要用于处理和存储海量数据。它的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce,两者构成了大数据处理的基础...

      3.Hadoop学习笔记.pdf

      2. MapReduce:这是一种编程模型,用于大规模数据集的并行运算。MapReduce的核心思想是将计算过程分为Map(映射)和Reduce(归约)两个阶段。Map阶段并行处理输入数据,并输出中间结果;Reduce阶段则将这些中间结果...

      hadoop学习笔记(三)

      在本篇"Hadoop学习笔记(三)"中,我们将探讨如何使用Hadoop的MapReduce框架来解决一个常见的问题——从大量数据中找出最大值。这个问题与SQL中的`SELECT MAX(NUMBER) FROM TABLE`查询相似,但在这里我们通过编程...

      Hadoop学习笔记.pdf

      接着,MapReduce作为Hadoop的一个计算框架,主要用于大规模数据集的并行运算,它隐藏了分布式运算的复杂性,提供给用户一个简化的编程模型。在MapReduce模型中,数据处理被分成两个阶段:Map阶段和Reduce阶段。Map...

      Hadoop学习笔记

      这个“Hadoop学习笔记”涵盖了Hadoop生态系统中的核心组件,包括HDFS(Hadoop分布式文件系统)、HBase(一个分布式、列式存储的数据库)、Hive(数据仓库工具)以及Spark(一个快速、通用且可扩展的数据处理引擎)。...

      hadoop,hive,hbase学习资料

      Reduce的过程解析.doc**、**Hadoop学习总结之五:Hadoop的运行痕迹.doc**、**Hadoop学习总结之二:HDFS读写过程解析.doc**:这些文档详细介绍了Hadoop分布式文件系统(HDFS)的基本概念、工作流程以及MapReduce的...

      Hadoop云计算2.0笔记第一课Hadoop介绍

      Hadoop 云计算 2.0 ...Hadoop 云计算 2.0 笔记第一课 Hadoop 介绍为我们提供了 Hadoop 的生态系统特点、Hadoop 生态系统概况、HDFS 和 MapReduce 的架构和原理等方面的知识点,对于学习 Hadoop 和云计算非常有帮助。

      hadoop学习笔记.pdf

      【大数据与Hadoop简介】 大数据是指在传统数据处理技术无法有效处理的海量、高增长率和...学习Hadoop不仅可以帮助理解大数据处理的基本原理,也是进入大数据领域的基础,对于开发和优化大数据解决方案具有重要意义。

      hadoop学习笔记

      《Hadoop学习笔记》 Hadoop,作为大数据处理的核心框架,是开源社区的杰作,由Apache软件基金会维护。这份文档旨在深入解析Hadoop的基本概念、架构及其在大数据处理中的应用,帮助读者全面掌握这一重要技术。 一、...

      尚硅谷大数据技术之Hadoop

      通过这门课程的学习,学员不仅能够了解Hadoop的基本原理,还能掌握实际操作和优化Hadoop集群的技能,为从事大数据处理和分析工作打下坚实基础。同时,通过实际的代码实践,可以更好地理解MapReduce的工作流程,提升...

      Hadoop学习文档笔记,基本原理 HDFS

      它的核心组件包括Hadoop分布式文件系统(HDFS)和MapReduce计算模型。本文将深入探讨HDFS的基本原理和操作,以及如何通过Java API进行文件操作。 Hadoop分布式文件系统(HDFS)是Google文件系统(GFS)的一种实现,...

      hadoop学习笔记(六)

      首先,我们要理解的是,直接按照常规的MapReduce编程方式来求取`MAX`和`MIN`可能会导致错误。这是因为MapReduce的默认机制是每个键(Key)对应一个值(Value),而`MAX`和`MIN`操作需要对一组数值进行比较,这就要求...

      Hadoop学习网址

      - **编程模型**: 解释了Hadoop MapReduce编程模型的基本原理,以及如何使用Java编写MapReduce程序。 - **实例代码**: 提供了一些实用的示例代码,帮助开发者理解和掌握Hadoop编程技巧。 #### 六、Hadoop ...

      hadoop笔记打包下载(想学hadoop不下载后悔)

      集群的管理和配置是Hadoop学习中的重要环节,包括节点间通信设置、资源调度策略等。 3. **MapReduce**: MapReduce是Hadoop的并行计算模型,它将大型数据集分割成小块,并在多台机器上并行处理。Map阶段将原始数据...

      hadoop3.1.3学习资料

      - **Pig**:数据流处理语言,简化了MapReduce编程。 - **Spark**:快速、通用且可扩展的大数据处理框架,支持批处理、交互式查询和实时流处理。 - **Oozie**:工作流调度系统,管理Hadoop作业。 - **Zookeeper**...

      重庆理工大学hadoop第二次作业 作业:王唯.zip

      【标题】中的“重庆理工大学hadoop第二次作业”表明这是一个关于Hadoop技术的学习任务,可能是某个教育机构的教学内容,特别是针对重庆理工大学的学生。Hadoop是一个开源的分布式计算框架,主要用于处理和存储海量...

    Global site tag (gtag.js) - Google Analytics