|
1.3 搭建Hadoop源代码阅读环境4 I: b) [) b4 O: g
1.3.1 创建Hadoop工程6 G$ Y3 _& X+ W# q
本节将介绍如何创建一个Hadoop源代码工程以方便阅读源代码。 总体上说, 目前存在两种Hadoop源代码阅读环境搭建方法, 分别是构建Maven工程和构
3 C2 m& f. s) a5 }7 V( t9 W& r建Java工程。 两种方法各有利弊: 前者可通过网络自动下载依赖的第三方库, 但源代码会被分散到多个工程中进而带来阅读上的不便; 后者可将所有源代码' m: Q# a9 p3 X. t0 ^% n
组织在一个工程中, 但需要自己添加依赖的第三方库, 大家可根据自己的喜好选择一种方法。 本节将依次介绍这两种方法。- j' r8 H& P4 @% y+ @' y* s
( 1) 构建Maven工程
: s$ H1 o& K% }; _- g& ?: |通过Maven工程搭建Hadoop源代码阅读环境的步骤如下:
' [3 }0 {/ t' q/ {+ ?+ O. \0 ]& C' N步骤1 解压缩Hadoop源代码。
! \0 F1 X: S" b+ ]! y) s将下载到的Hadoop源代码压缩包解压到工作目录下, 比如hadoop-2.0-src.tar.gz( 注意, 为了方便, 此处直接使用版本号2.0, 实际下载到的源代码版本号* [$ w1 M: I. s- R3 ^
并不是这样的, 可能是2.2.0, 这样压缩包的名字实际为hadoop-2.2.0-src.tar.gz) 。
0 Y/ D& V2 @9 m4 E; H: Z* I7 Z步骤2 导入Maven工程。) i& v' y+ B0 N5 h- ~/ Y
在Eclipse中, 依次选择"File"→"Import"→"Maven"→"Existing Maven Project", 在弹出的对话框中的"Root Directory"后面, 选择Java源代码所在的目录。; y/ T9 X9 A" N) \) E5 f
单击"Next"按钮, 在弹出的对话框中选择"Resolve All Later", 并单击"Finish"按钮完成Maven项目导入。 之后, Eclipse会自动通过网络从Maven库中下载依赖1 c" V$ r- J) n! s
的第三方库( JAR包等) 。 注意, 你所使用的电脑必须能够联网。
4 `" ^. e- i8 p' O' f将Hadoop 2.0源代码导入Maven项目后, 会生成50个左右的工程, 这些都是通过Maven构建出来的, 每个工程是一个代码模块, 且彼此相对独立, 可以单( G) w9 b; x+ P. [/ v
独编译。 你可以在某个工程下的"src/main/java"目录下查看对应的源代码。
+ `" E# d7 k5 n$ g0 @5 P( 2) 构建Java工程! h. X: X6 w4 }! s/ g) o
通过Java工程搭建Hadoop源代码阅读环境的步骤如下:" j4 i3 ^+ M/ A9 \
步骤1 解压缩Hadoop源代码。
8 |; d8 F6 U% z同“构建Maven工程”中的步骤1类似。! ]0 k4 G% |: `; o
步骤2 新建Java工程。
8 c2 |* f7 W" g! Z1 M' {/ X打开Eclipse, 进入Eclipse可视化界面后, 如图1-1所示, 依次单击"File"→"New"→"Java Project", 并在弹出的对话框中去掉"Use default location"前的勾号, 然+ E1 e* M0 E2 e4 ]
后选择Hadoop安装目录的位置, 默认情况下, 工程名称与Hadoop安装目录名称相同, 用户可自行修改。 单击“完成”按钮, Hadoop源代码工程创建完毕。
4 @2 D' B7 |. g1 V1 U图1-1 新建Hadoop工程, ]# s$ R! \2 H- }- q6 _
回到Eclipse主界面后, 打开新建的Hadoop工程, 可看到整个工程按图1-2所示组织代码: 按目录组织源代码, 且每个目录下以JAR包为单位显示各个Java) ?# w( }: m9 \3 M9 y
文件。
+ m' c) I$ \; ]; X/ ~图1-2 Hadoop工程展示( 部分) 源代码方式
% V# [* q6 s( v$ p$ j除了使用源代码压缩包导入Eclipse工程的方法外, 读者可也尝试直接从Hadoop SVN上导入Hadoop源代码。
: `& E+ Q- n2 b' z. B需要注意的是, 通过以上方法导入Hadoop 2.0源代码后, 很多类或者方法找不到对应的JAR包, 为了解决这个问题, 你需要将第三方JAR包导入工程中,
7 }: ~5 e2 c3 t' K如图1-3所示, 方法如下: 解压存放JAR包的压缩包, 然后右击Project名称, 在弹出的快捷菜单中选择"Properties"命令, 将会弹出一个界面, 然后在该界面中
$ D7 s1 o7 d+ b& |: s f依次选择"Java Build Path"→"Libraries"→"Add External JARs...", 将解压目录中share/hadoop目录下各个子目录中lib文件夹下的JAR包导入工程。' U$ s( r* l$ v* c
前面提到CDH版本将源代码和JAR包放到了一起, 因此, 如果使用CDH版本, 则直接按照上述方法将源代码导入Eclipse工程即可。/ F0 {. i: B4 f7 n3 v5 B3 O+ Y
细心的读者在阅读源代码过程中仍会发现部分类或者函数无法找到, 这是因为Hadoop 2.0使用了Protocol Buffers定义了RPC协议, 而这些Protocol Buffers文3 U9 T2 v0 A6 {2 N% k
件在Maven编译源代码时才会生成对应的Java类, 因此若其他类在源代码中引用这些类则暂时无法找到, 解决方法是先编译Hadoop 2.0源代码再倒入Eclipse工* {5 p/ h9 n4 d* ^4 M6 L7 X
程, 具体方法如下( 注意, 进行以下步骤之前, 需先完成1.6.1节中的准备工作) 。
/ h0 \8 }4 P% [# A% E( j首先, 使用以下命令安装Elicpse插件hadoop-maven-plugins:8 O" R. @" O3 {. t+ S) L" k3 a
图1-3 导入依赖的第三方JAR包
: G, g: c: X6 @& _' s1 s1 I# P7 s! y$ cd ${HADOOP_HOME}/hadoop-maven-plugins2 @+ p7 d% x$ E k' {
$ mvn install
' ?" U+ B" @' m C; X. U然后生成Eclipse工程文件:$ Q& I: \. [6 V6 l0 S
$ cd ${HADOOP_HOME}6 G* K P: X& M: a. E! O. [# K) [; d
$ mvn eclipse:eclipse -DskipTests
4 L# o. l _4 P, [最后在Eclipse中按照以下流程导入源代码: "File"→"Import"→"Existing Projects into Workspace"。
) I- W7 i* i [* G: G" A1.3.2 Hadoop源代码阅读技巧0 c( I& |: ^: W l& U( K
本节介绍在Eclipse下阅读Hadoop源代码的一些技巧, 比如: 如何查看一个基类有哪些派生类, 一个方法被其他哪些方法调用等。" u6 R C, A2 d) O7 U) c
( 1) 查看一个基类或接口的派生类或实现类
+ Y0 l2 j. C; ~3 d在Eclipse中, 选中某个基类或接口名称, 右击, 在弹出的快捷菜单中选择"Quick Type Hierarchy", 可在新窗口中看到对应的所有派生类或实现类。
8 K; J" \* i( \' X例如, 如图1-4所示, 打开hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java目录下org.apache.hadoop.mapred包中的
% }1 B C. A( u* n. z* c IInputFormat.java文件, 查看接口InputFormat的所有实现类, 结果如图1-5所示。
5 n1 U* m- Q% m) D5 e5 j( 2) 查看函数的调用关系$ u% S1 p! S2 l8 L& ]3 X% K: x
在Eclipse中, 选中某个方法名称, 右击, 在弹出的快捷菜单中选择"Open Call Hierarchy", 可在窗口"Call Hierarchy"中看到所有调用该方法的函数。7 ]9 @: }" ?- \! T
图1-4 在Eclipse中查看Hadoop源代码中接口InputFormat的所有实现类
8 L) w$ s8 L* P5 D图1-5 Eclipse列出接口InputFormat的所有实现类1 Y) x4 L, b' s4 M2 N G: E
例如, 如图1-6所示, 打开hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java目录下org.apache.hadoop.mapred包中的9 D) Z' d, f# T3 |
Task.java文件, 查看调用getJobID方法的所有函数, 结果如图1-7所示。/ T- j% K/ \- p( }0 d: K, W
图1-6 在Eclipse中查看Hadoop源代码中所有调用Task.java中getJobID方法的函数( P* s- j+ r7 ~
图1-7 Eclipse列出所有调用getJobID方法的函数
; Y i; k1 y1 i9 _2 s) K( 3) 快速查找类对象的相关信息
" O) k% B! g6 H. o* W, o与前两个小节类似, 选中类对象, 右击, 在弹出的快捷菜单中选择"Open Declaration", 可跳转到类定义; 选择"Quick Outline", 可查看类所有的成员变量5 T( k3 R3 K6 Z% j+ v
和成员方法, 具体细节在此不做详细介绍, 读者自行尝试。
) u' z7 ^; S" @. }: W& Q+ I; f9 L$ P; |1 v# |
- q" T0 Z: y8 q% a# W- k |
|