一、说明
作为一个学习hadoop的同学,必须在本机上搭建hadoop源码阅读环境,这样,在方便阅读源码的同时也方便进行调试和源码修改。好了,下面开始搭建环境。
1.环境说明:hadoop 版本:1.2.1、 IDE:eclipse、操作系统:centos
2.网上有人是通过eclipse的新建项目指定目录的方式将hadoop目录转换成Eclipse工程同时导入eclipse,具体做法如下:
File——>new——>Java Project——>勾掉Use default location选项——>在location输入框中输入hadoop的目录——>Finish的方式导入hadoop目录来生成hadoop。
这种错误的做法不但破坏了hadoop工程的项目结构,同时也会报出很多错误。
二、环境搭建
1.hadoop原始目录结构参考:
2.我们下载的hadoop并不是一个eclipse工程,需要将其转换为eclipse工程才能导入eclipse。版本官方提供的hadoop是用ant工具作为项目管理工具的,因此,我们需要用ant将其转换为eclipse工程。具体过程如下:
(1).安装必须工具:
a.安装ant
yum install ant
b.安装 libtool
yum install libtool
c.安装ant-apache-regexp
yum install ant-apache-regexp
注:libtool 和ant-apache-regexp工具必须安装,否则后面在用ant做转换时会报错。
(2).进入到Hadoop目录下:
cd hadoop-1.2.1
(3).通过ant将hadoop-1.2.1进行转换为eclipse工程:
ant clean
ant eclipse -verbose(加入verbose选项可以查看详细输出信息,有利于观察进度和查错)
注:该过程常见错误及解决方法参考第三部分“错误说明及解决”。
(4).如果一切顺利的话,第一次操作,大概需要10分钟左右(主要时间浪费在下载jar包上了)就可以完工。
如果成功的话,就可以通过import——>Existing Projects into Workspace 将hadoop-1.2.1导入eclipse工程了。
PS:除上面这个方法外,还有一个比较笨的方法,就是新建一个java工程,然后把各个包手动地拷贝进去,这样不必全部都拷进去,可以拷一些自己关心的包,比如core、hdfs、mapred。这三个包可以基本满足项目的运行和对于hdfs和mpareduce的研究了。
注:使用该方法后,某些类可能会出现如下异常:
三、错误说明及解决
1.possibly undefined macro: AC_PROG_LIBTOOL
If this token and others are legitimate, please use m4_pattern_allow.See the Autoconf documentation.autoreconf:/usr/bin/autoconf failed with exit status: 1
如下图所示:
如果出现此错误说明你的机器中没有安装libtool工具,只需安装即可:yum install libtool
2.Could not create type regexpmapper due to No supported regular expression matcher found: java.lang.ClassNotFoundException: org.apache.tools.ant.util.regexp.Jdk14RegexpMatcher
如下图所示:
出现如上所示错误时你的机器缺少ant-apache-regexp工具,只需安装即可:
yum install ant-apache-regexp
四、Hadoop 源代码组织结构
直接解压 Hadoop 压缩包后,可看到下图所示的目录结构,其中,比较重要的目录有 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 相关服务。
下面就 Hadoop MapReduce 源代码组织结构进行介绍。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 算法。该算法要求数据已经按照 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安全机制。