1.4 Hadoop源代码组织结构
直接解压Hadoop压缩包后,可看到图1-11所示的目录结构,其中,比较重要的目录有src、conf、lib、bin等。下面分别介绍这几个目录的作用:
❑src:Hadoop源代码所在的目录。最核心的代码所在子目录分别是core、hdfs和mapred,它们分别实现了Hadoop最重要的三个模块,即基础公共库、HDFS实现和MapReduce实现。
❑conf:配置文件所在目录。Hadoop的配置文件比较多,其设计原则可概括为如下两点。
〇尽可能模块化,即每个重要模块拥有自己的配置文件,这样使得维护以及管理变得简单。
〇动静分离,即将可动态加载的配置选项剥离出来,组成独立配置文件。比如,Hadoop 1.0.0版本之前,作业队列权限管理相关的配置选项被放在配置文件mapred-site.xml中,而该文件是不可以动态加载的,每次修改后必须重启MapReduce。但从1.0.0版本开始,这些配置选项被剥离放到独立配置文件mapred-queue-acls.xml中,该文件可以通过Hadoop命令行动态加载。conf目录下最重要的配置文件有core-site.xml、hdfs-site.xml和mapred-site.xml,分别设置了基础公共库core、分布式文件系统HDFS和分布式计算框架MapReduce的配置选项。
❑lib:Hadoop运行时依赖的三方库,包括编译好的jar包以及其他语言生成的动态库。Hadoop启动或者用户提交作业时,会自动加载这些库。
❑bin:运行以及管理Hadoop集群相关的脚本。这里介绍几个常用的脚本。
〇hadoop:最基本且功能最完备的管理脚本,其他大部分脚本都会调用该脚本。
〇start-all.sh/stop-all.sh:启动/停止所有节点上的HDFS和MapReduce相关服务。
〇start-mapred.sh/stop-mapred.sh:单独启动/停止MapReduce相关服务。
〇start-dfs.sh/stop-dfs.sh:单独启动/停止HDFS相关服务。
图 1-11 Hadoop安装目录结构
本书重点介绍MapReduce的实现原理,下面就Hadoop MapReduce源代码组织结构进行介绍。Hadoop MapReduce源代码组织结构[1]如图1-12所示。
图 1-12 Hadoop MapReduce源代码组织结构
总体上看,Hadoop MapReduce分为两部分:一部分是org.apache.hadoop.mapred.,这里面主要包含旧的对外编程接口以及MapReduce各个服务(JobTracker以及TaskTracker)的实现;另一部分是org.apache.hadoop.mapreduce.,主要内容涉及新版本的对外编程接口以及一些新特性(比如MapReduce安全)。
1.MapReduce编程模型相关
❑org. apache.hadoop.mapred.lib.*:这一系列Java包提供了各种可直接在应用程序中使用的InputFormat、Mapper、Partitioner、Reducer和OuputFormat,以减少用户编写MapReduce程序的工作量。
❑org. apache.hadoop.mapred.jobcontrol:该Java包允许用户管理具有相互依赖关系的作业(DAG作业)。
❑org. apache.hadoop.mapred.join:该Java包实现了map-side join算法[2]。该算法要求数据已经按照key排好序,且分好片,这样可以只使用Map Task实现join算法,避免re-partition、sort、shuffling等开销。
❑org. apache.hadoop.mapred.pipes:该Java包允许用户用C/C++编写MapReduce作业。
❑org. apache.hadoop.mapreduce:该Java包定义了一套新版本的编程接口,这套接口比旧版接口封装性更好。
❑org. apache.hadoop.mapreduce.*:这一系列Java包根据新版接口实现了各种InputFormat、Mapper、Partitioner、Reducer和OuputFormat。
2.MapReduce计算框架相关
❑org. apache.hadoop.mapred:Hadoop MapReduce最核心的实现代码,包括各个服务的具体实现。
❑org. apache.hadoop.mapred.filecache:Hadoop DistributedCache实现。DistributedCache是Hadoop提供的数据分发工具,可将用户应用程序中需要的文件分发到各个节点上。
❑org. apache.hadoop.mapred.tools:管理控制Hadoop MapReduce,当前功能仅包括允许用户动态更新服务级别的授权策略和ACL(访问权限控制)属性。
❑org. apache.hadoop.mapreduce.split:该Java包的主要功能是根据作业的InputFormat生成相应的输入split。
❑org. apache.hadoop.mapreduce.server.jobtracker:该Java包维护了JobTracker可看到的TaskTracker状态信息和资源使用情况。
❑org. apache.hadoop.mapreduce.server.tasktracker.*:TaskTracker的一些辅助类。
3.MapReduce安全机制相关
这里只涉及org.apache.hadoop.mapreduce.security.*。这一系列Java包实现了MapReduce安全机制。
[1]不同版本Hadoop的源代码结构稍有差距,本书的分析是基于Hadoop 1.0.0版本的。
[2]Join算法是将两个表或者文件按照某个key值合并起来,在Hadoop中,可以在Map或者Reduce端进行合并。若在Reduce端进行合并,则需要进行re-partition、sort、shuffling等操作,开销很大。