《Hadoop实战》第四章:开发MapReduce应用程序

   1.通过API对相关组件的参数进行配置
  Hadoop有很多自己的组件(例如Hbase和Chukwa等),每一种组件都可以实现不同的功能,并起着不同的作用,  通过多种组件的配合使用,Hadoop就能够实现非常强大的功能。这些可以通过Hadoop的API对相关参数进行配置来实现。
  先简单地介绍一下API,它被分成了以下几个部分( 也就是几个不同的包)。
org.apache.hadoop.conf:  定义了系统参数的配置文件处理API;
org.apache.hadoop.fs:定义了抽象的文件系统API; 
org.apache.hadoop.dfs: Hadoop 分布式文件系统(HDFS) 模块的实现;
org. apache.hadoop.mapred : Hadoop 分布式计算系统(MapReduce) 模块的实现,包
括任务的分发调度等;
org.apache.hadoop.ipc:用在网络服务端和客户端的工具,封装了网络异步I/O的基础
  模块;
org.apache.hadoop.io :定义了通用的I/OAPI,用于针对网络、数据库、文件等数据对
  象进行读写操作等。 
在此我们需要用到org.apache.hadoop.conf,用它来定义系统参数的配置。Configurations类由源来设置,每个源包含以XML形式出现的一-系列属性/值对。每个源以一个字符串或一个路径来命名。  如果是以字符串命名,则通过类路径检查该字符串代表的路径是否存在;如果是以路径命名的,则直接通过本地文件系统进行检查,而不用类路径。

 2  配置开发环境
  首先下载准备使用的Hadoop版本,然后将其解压到用于开发的主机上(详细过程见附录B)。接下来,在集成开发环境中创建一个新的工程,然后将解压后的文件夹根目录下的JAR文件和lib目录之下的JAR文件加入到classpath中。之后就可以编译Hadoop程序,并且可以在集成开发环境中以本地模式运行。
  Hadoop有三种不同的运行方式:单机模式、伪分布模式、完全分布模式。三种不同的运行方式各有各的好处与不足之处:单机模式的安装与配置比较简单,运行在本地文件系统上, 便于程序的调试,  可及时查看程序运行的效果,但是当数据量比较大时运行的速度会比较慢,并且没有体现出Hadoop分布式的优点;伪分布模式同样是在本地文件系统上运行,与单机模式的不同之处在于它运行的文件系统为HDFS,这种模式的好处是能够模仿完全分布模式,  看到一些分布式处理的效果;完全分布模式则运行在多台机器的HDFS之上,完完全全地体现出了分布式的优点,但是在调试程序方面会比较麻烦。
 在实际运用中,可以结合这三种不同模式的优点,比如,编写和调试程序在单机模式和伪分布模式上进行,而实际处理大数据则在完全分布模式下进行。
3 复杂的Map和Reduce函数
  从前面Map和Reduce函数的代码很明显可以看出,Map和Reduce都继承自MapReduce自己定义好的Mapper和Reducer基类,MapReduce框架根据用户继承Mapper和Reducer后的衍生类和类中覆盖的核心函数来识别用户定义的Map处理阶段和Reduce处理阶段。所以只有用户继承这些类并且实现其中的核心函数,  提交到MapReduce框架上的作业才能按照用户的意愿被解析出来并执行。前面介绍的MapReduce作业仅仅继承并覆盖了基类中的核心函数Map或Reduce,下面介绍基类中的其他函数,使大家能够编写功能更加复杂、控制更加完备的Map和Reduce函数。
  (1)setup函数是在task启动开始就调用的。在这里先温习一下task的知识。在MapReduce中作业会被组织成Map task和Reduce task.每个task都以Map类或Reduce类为处理方法主体,输人分片为处理方法的输入,自己的分片处理完之后task也就销毁了。从这里可以看出,setup 函数在task启动之后数据处理之前只调用一次,  而覆盖的Map函数或Reduce函数会针对输入分片中的每个key调用一次。所以setup函数可以看做task.上的一个全局处理,而不像在Map函数或Reduce函数中,处理只对当前输入分片中的正在处理数据产生作用。利用setup函数的特性,大家可以将Map或Reduce函数中的重复处理放置到setup函数中,可以将Map或Reduce函数处理过程中可能使用到的全局变量进行初始化,或从作业信息中获取全局变量,还可以监控task的启动。需要注意的是,调用setup函数只是对应task.上的全局操作,而不是整个作业的全局操作。
 (2)cleanup函数跟setup函数相似,不同之处在于cleanup函数是在task销毁之前执行的。它的作用和setup也相似,  区别仅在于它的启动处在task销毁之前,所以不再赘述cleanup的作用。大家应根据具体使用环境和这两个函数的特点,做出恰当的选择。
  (3)run函数是Map类或Reduce类的启动方法:  先调用setup函数,然后针对每个key调用一次Map函数或Reduce函数,最后销毁task之前再调用cleanup函数。这个run函数将Map阶段和Reduce阶段的代码过程呈现给了大家。正如注释中所说,如果想更加完备地控制Map或者Renduce阶段,可以覆盖此函数,并像普通的Java类中的函数一样添加自己的控制内容,比如增加自己的task启动之后和销毁之前的处理,或者在while循环内外再定义自己针对每个key的处理内容,甚至可以对Map和Reduce函数的处理结果进行进--步的处理。








#uc#
全部评论

相关推荐

三分入剑:我觉得还是学历问题 如果你真的想要进大厂不想在小厂的话读个211得研究生吧 我感觉简历还没你好呢 我都实习了俩月了 我投了一百多份能投出20多份简历 能面试六七次 我们部门只招研究生了都 现在连9本都很难找到像样的大厂了 你又没打过rm这种 我觉得想要进步的话就考个研究生吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务