|
1.3 搭建Hadoop源代码阅读环境% I4 v( A$ T2 t. K
1.3.1 创建Hadoop工程
5 R t _8 {9 _+ ]8 J `本节将介绍如何创建一个Hadoop源代码工程以方便阅读源代码。 总体上说, 目前存在两种Hadoop源代码阅读环境搭建方法, 分别是构建Maven工程和构/ h+ v& k e* R$ H6 B
建Java工程。 两种方法各有利弊: 前者可通过网络自动下载依赖的第三方库, 但源代码会被分散到多个工程中进而带来阅读上的不便; 后者可将所有源代码
1 d' r8 x8 k5 m) K组织在一个工程中, 但需要自己添加依赖的第三方库, 大家可根据自己的喜好选择一种方法。 本节将依次介绍这两种方法。
) x9 d' {5 V. D2 Y( 1) 构建Maven工程
3 r, C% |( d+ u5 f9 @' v8 h通过Maven工程搭建Hadoop源代码阅读环境的步骤如下:
& V( B5 X |8 R- b; j3 h步骤1 解压缩Hadoop源代码。3 |% E2 |# p+ s' E7 z4 f; w! V
将下载到的Hadoop源代码压缩包解压到工作目录下, 比如hadoop-2.0-src.tar.gz( 注意, 为了方便, 此处直接使用版本号2.0, 实际下载到的源代码版本号' f; T, w1 m/ ^2 w1 y
并不是这样的, 可能是2.2.0, 这样压缩包的名字实际为hadoop-2.2.0-src.tar.gz) 。
! p j2 {) q6 @$ T步骤2 导入Maven工程。
. j5 ^* h! n! W在Eclipse中, 依次选择"File"→"Import"→"Maven"→"Existing Maven Project", 在弹出的对话框中的"Root Directory"后面, 选择Java源代码所在的目录。
& y& Z1 \+ {2 j# o" Q* c7 @单击"Next"按钮, 在弹出的对话框中选择"Resolve All Later", 并单击"Finish"按钮完成Maven项目导入。 之后, Eclipse会自动通过网络从Maven库中下载依赖) Q0 @( q& N# {- j3 A( r f
的第三方库( JAR包等) 。 注意, 你所使用的电脑必须能够联网。
/ N: i3 s8 ^$ w! G" N& O w! U& }* w8 r将Hadoop 2.0源代码导入Maven项目后, 会生成50个左右的工程, 这些都是通过Maven构建出来的, 每个工程是一个代码模块, 且彼此相对独立, 可以单
" E ~9 b( ^+ F- d( ?! ?7 Y2 R独编译。 你可以在某个工程下的"src/main/java"目录下查看对应的源代码。# R8 }5 C' w: J3 s8 |! {
( 2) 构建Java工程
6 Z% e7 _' r0 W通过Java工程搭建Hadoop源代码阅读环境的步骤如下:
1 h7 N0 z7 o. i& V% V5 O8 c m步骤1 解压缩Hadoop源代码。+ J- C7 j, ?% N
同“构建Maven工程”中的步骤1类似。+ C' N0 a! Q' m% p6 g2 M
步骤2 新建Java工程。. a1 v+ v( Y) U
打开Eclipse, 进入Eclipse可视化界面后, 如图1-1所示, 依次单击"File"→"New"→"Java Project", 并在弹出的对话框中去掉"Use default location"前的勾号, 然
* {5 e, c3 q' T! q% j( |后选择Hadoop安装目录的位置, 默认情况下, 工程名称与Hadoop安装目录名称相同, 用户可自行修改。 单击“完成”按钮, Hadoop源代码工程创建完毕。
9 A& M! }' \# c图1-1 新建Hadoop工程9 H o/ O/ z9 w4 `% z
回到Eclipse主界面后, 打开新建的Hadoop工程, 可看到整个工程按图1-2所示组织代码: 按目录组织源代码, 且每个目录下以JAR包为单位显示各个Java0 P2 |6 q( L9 C! ^" U" z m2 {& B
文件。0 k6 h" n! e5 L4 S7 U/ O, C
图1-2 Hadoop工程展示( 部分) 源代码方式
/ H" y) n/ B2 S0 V0 I除了使用源代码压缩包导入Eclipse工程的方法外, 读者可也尝试直接从Hadoop SVN上导入Hadoop源代码。5 {& w$ C9 f* Z$ q
需要注意的是, 通过以上方法导入Hadoop 2.0源代码后, 很多类或者方法找不到对应的JAR包, 为了解决这个问题, 你需要将第三方JAR包导入工程中,
8 D6 k0 l, @" c如图1-3所示, 方法如下: 解压存放JAR包的压缩包, 然后右击Project名称, 在弹出的快捷菜单中选择"Properties"命令, 将会弹出一个界面, 然后在该界面中2 H z: R6 h. c8 y& N# m( L e
依次选择"Java Build Path"→"Libraries"→"Add External JARs...", 将解压目录中share/hadoop目录下各个子目录中lib文件夹下的JAR包导入工程。
, H x# U' S" d/ A% _+ |/ L# {前面提到CDH版本将源代码和JAR包放到了一起, 因此, 如果使用CDH版本, 则直接按照上述方法将源代码导入Eclipse工程即可。; d; `; t4 z/ S; I i6 }6 b- w
细心的读者在阅读源代码过程中仍会发现部分类或者函数无法找到, 这是因为Hadoop 2.0使用了Protocol Buffers定义了RPC协议, 而这些Protocol Buffers文
4 h/ E& r5 ]# W8 I' I$ O6 u件在Maven编译源代码时才会生成对应的Java类, 因此若其他类在源代码中引用这些类则暂时无法找到, 解决方法是先编译Hadoop 2.0源代码再倒入Eclipse工
+ I& O& \$ D# F0 Q2 V程, 具体方法如下( 注意, 进行以下步骤之前, 需先完成1.6.1节中的准备工作) 。; V# @. m8 a, P% i
首先, 使用以下命令安装Elicpse插件hadoop-maven-plugins:' W5 V1 j5 n1 {! a0 b' X
图1-3 导入依赖的第三方JAR包
9 b7 _6 O# s/ D# r$ cd ${HADOOP_HOME}/hadoop-maven-plugins
/ `: l) H, {% t$ mvn install! [9 ^# n* B# b
然后生成Eclipse工程文件:
- }2 ^: O( O! K7 S- n' n$ cd ${HADOOP_HOME}) j9 i1 V* `4 Z& ~/ o
$ mvn eclipse:eclipse -DskipTests
7 p2 ]4 R( Z) H8 _, V最后在Eclipse中按照以下流程导入源代码: "File"→"Import"→"Existing Projects into Workspace"。# U9 [. c& J6 _- _9 M9 k5 a' W% Y
1.3.2 Hadoop源代码阅读技巧 I/ o4 ?$ y! t
本节介绍在Eclipse下阅读Hadoop源代码的一些技巧, 比如: 如何查看一个基类有哪些派生类, 一个方法被其他哪些方法调用等。* G' h. n0 B% b5 N
( 1) 查看一个基类或接口的派生类或实现类, O3 r& w) ^2 K$ t) q8 z/ z& D
在Eclipse中, 选中某个基类或接口名称, 右击, 在弹出的快捷菜单中选择"Quick Type Hierarchy", 可在新窗口中看到对应的所有派生类或实现类。
|0 z6 L& W: ]2 C) T( V# V例如, 如图1-4所示, 打开hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java目录下org.apache.hadoop.mapred包中的
" o# w7 _' `' z0 rInputFormat.java文件, 查看接口InputFormat的所有实现类, 结果如图1-5所示。
: v* ]6 h" N: a3 x6 W( 2) 查看函数的调用关系
# c# y! z: J( d5 I S# i在Eclipse中, 选中某个方法名称, 右击, 在弹出的快捷菜单中选择"Open Call Hierarchy", 可在窗口"Call Hierarchy"中看到所有调用该方法的函数。5 [- h, P( n9 T- p& ^
图1-4 在Eclipse中查看Hadoop源代码中接口InputFormat的所有实现类
) G. j& b* V$ e- O B7 X图1-5 Eclipse列出接口InputFormat的所有实现类( r- w; L2 S. c. s q8 z" Q
例如, 如图1-6所示, 打开hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java目录下org.apache.hadoop.mapred包中的- Y% p" Q1 S5 f+ g, I$ J* O. r
Task.java文件, 查看调用getJobID方法的所有函数, 结果如图1-7所示。5 h& G% ]2 {) ] c
图1-6 在Eclipse中查看Hadoop源代码中所有调用Task.java中getJobID方法的函数# ~; @" W+ {) ]$ E$ w
图1-7 Eclipse列出所有调用getJobID方法的函数
5 t' I* J) y' @2 g0 ` l( 3) 快速查找类对象的相关信息2 k1 B8 Q0 k2 X
与前两个小节类似, 选中类对象, 右击, 在弹出的快捷菜单中选择"Open Declaration", 可跳转到类定义; 选择"Quick Outline", 可查看类所有的成员变量
5 k1 {# t4 ]9 k+ _和成员方法, 具体细节在此不做详细介绍, 读者自行尝试。
1 v3 w. {0 Q! d. G& F, q
R* ?" J* `9 H9 [# {7 ~8 }& x
6 Y: z m/ `. `0 V8 U |
|