|
1.3 搭建Hadoop源代码阅读环境
) p: F5 v5 G) t7 q/ f1.3.1 创建Hadoop工程
+ F0 c, u" {/ a( F" b本节将介绍如何创建一个Hadoop源代码工程以方便阅读源代码。 总体上说, 目前存在两种Hadoop源代码阅读环境搭建方法, 分别是构建Maven工程和构
( Y( m _, x4 B- Y) Y! T) A5 }建Java工程。 两种方法各有利弊: 前者可通过网络自动下载依赖的第三方库, 但源代码会被分散到多个工程中进而带来阅读上的不便; 后者可将所有源代码
* v5 G8 h+ t* K5 ]& a组织在一个工程中, 但需要自己添加依赖的第三方库, 大家可根据自己的喜好选择一种方法。 本节将依次介绍这两种方法。
6 Y% X1 r/ f6 ~0 x" ], r' o; U c: D$ z( 1) 构建Maven工程8 ]* H6 r! \$ w1 s0 W( {
通过Maven工程搭建Hadoop源代码阅读环境的步骤如下:% K1 r# _$ Q$ b. A3 Y) ^& u
步骤1 解压缩Hadoop源代码。 X s/ B C' A
将下载到的Hadoop源代码压缩包解压到工作目录下, 比如hadoop-2.0-src.tar.gz( 注意, 为了方便, 此处直接使用版本号2.0, 实际下载到的源代码版本号4 C! |, q: d+ Z, q6 T+ \' J
并不是这样的, 可能是2.2.0, 这样压缩包的名字实际为hadoop-2.2.0-src.tar.gz) 。
0 B( |5 C* f" e# x& q2 U步骤2 导入Maven工程。' O8 W5 Q9 b2 l& ^
在Eclipse中, 依次选择"File"→"Import"→"Maven"→"Existing Maven Project", 在弹出的对话框中的"Root Directory"后面, 选择Java源代码所在的目录。' K3 d. j* c9 {
单击"Next"按钮, 在弹出的对话框中选择"Resolve All Later", 并单击"Finish"按钮完成Maven项目导入。 之后, Eclipse会自动通过网络从Maven库中下载依赖
; b+ \7 I7 e5 V1 |; O的第三方库( JAR包等) 。 注意, 你所使用的电脑必须能够联网。3 X3 }, C2 O# w4 _8 |- M; B
将Hadoop 2.0源代码导入Maven项目后, 会生成50个左右的工程, 这些都是通过Maven构建出来的, 每个工程是一个代码模块, 且彼此相对独立, 可以单
9 I" ]/ e2 p; M. t# w V* K独编译。 你可以在某个工程下的"src/main/java"目录下查看对应的源代码。; X3 N3 F' `% l
( 2) 构建Java工程2 c' G4 ?; h% I. W
通过Java工程搭建Hadoop源代码阅读环境的步骤如下:! C1 @5 \$ `( }) S6 Z
步骤1 解压缩Hadoop源代码。
# y6 t- K! |# N同“构建Maven工程”中的步骤1类似。% j* C& @. r- L! J j' @
步骤2 新建Java工程。+ ]3 w, T2 h. c' }& X! J5 j. F: a
打开Eclipse, 进入Eclipse可视化界面后, 如图1-1所示, 依次单击"File"→"New"→"Java Project", 并在弹出的对话框中去掉"Use default location"前的勾号, 然$ P( B/ u( [. @2 D2 F: S/ h
后选择Hadoop安装目录的位置, 默认情况下, 工程名称与Hadoop安装目录名称相同, 用户可自行修改。 单击“完成”按钮, Hadoop源代码工程创建完毕。
( j, J% |# A3 D7 a" G1 |图1-1 新建Hadoop工程$ V7 q3 `$ j2 L2 Q7 G) u
回到Eclipse主界面后, 打开新建的Hadoop工程, 可看到整个工程按图1-2所示组织代码: 按目录组织源代码, 且每个目录下以JAR包为单位显示各个Java
. \( [. O. ]( L# R* a* S1 t% E& e9 d文件。7 |4 G) b4 l& p
图1-2 Hadoop工程展示( 部分) 源代码方式
+ T4 Z3 @# O$ ~+ P! X* t除了使用源代码压缩包导入Eclipse工程的方法外, 读者可也尝试直接从Hadoop SVN上导入Hadoop源代码。2 S8 |& a- x5 b) A: v
需要注意的是, 通过以上方法导入Hadoop 2.0源代码后, 很多类或者方法找不到对应的JAR包, 为了解决这个问题, 你需要将第三方JAR包导入工程中,
) |+ E# s7 b7 V2 t0 M+ r如图1-3所示, 方法如下: 解压存放JAR包的压缩包, 然后右击Project名称, 在弹出的快捷菜单中选择"Properties"命令, 将会弹出一个界面, 然后在该界面中
: Y6 n! j+ [. }; _" ^依次选择"Java Build Path"→"Libraries"→"Add External JARs...", 将解压目录中share/hadoop目录下各个子目录中lib文件夹下的JAR包导入工程。5 m8 D+ d' o C. z9 V# h
前面提到CDH版本将源代码和JAR包放到了一起, 因此, 如果使用CDH版本, 则直接按照上述方法将源代码导入Eclipse工程即可。
3 c5 [6 H2 {, W8 z9 R7 o细心的读者在阅读源代码过程中仍会发现部分类或者函数无法找到, 这是因为Hadoop 2.0使用了Protocol Buffers定义了RPC协议, 而这些Protocol Buffers文
3 J* s) O% X0 Q0 {. m M3 d5 z件在Maven编译源代码时才会生成对应的Java类, 因此若其他类在源代码中引用这些类则暂时无法找到, 解决方法是先编译Hadoop 2.0源代码再倒入Eclipse工, t5 i, n- a% \$ n
程, 具体方法如下( 注意, 进行以下步骤之前, 需先完成1.6.1节中的准备工作) 。' f: B/ ]& U H8 P0 g2 a
首先, 使用以下命令安装Elicpse插件hadoop-maven-plugins:
, V. B/ m* ?4 {! H- o5 D( s图1-3 导入依赖的第三方JAR包5 A P8 |) \' l% C4 d; @/ g! O# ~' r: p
$ cd ${HADOOP_HOME}/hadoop-maven-plugins* b/ j7 o# f0 d" T/ Z1 d
$ mvn install6 T6 H0 X T0 s. y& j, F$ w6 `
然后生成Eclipse工程文件:1 M, C( o/ N& ] {" {$ Y* }
$ cd ${HADOOP_HOME}
9 k \5 u# e/ }" R; `# G( `' ?0 I$ mvn eclipse:eclipse -DskipTests
0 x) F) i: |6 a) w" B1 }最后在Eclipse中按照以下流程导入源代码: "File"→"Import"→"Existing Projects into Workspace"。
; j2 @. r8 M4 q2 [1.3.2 Hadoop源代码阅读技巧8 Q! D# {5 I' j
本节介绍在Eclipse下阅读Hadoop源代码的一些技巧, 比如: 如何查看一个基类有哪些派生类, 一个方法被其他哪些方法调用等。5 t- c$ Q) T5 \+ l
( 1) 查看一个基类或接口的派生类或实现类
$ \0 }1 v Z* [$ V. H3 `) D3 o在Eclipse中, 选中某个基类或接口名称, 右击, 在弹出的快捷菜单中选择"Quick Type Hierarchy", 可在新窗口中看到对应的所有派生类或实现类。# ? v1 l5 J" H3 e" n
例如, 如图1-4所示, 打开hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java目录下org.apache.hadoop.mapred包中的$ [, y$ I+ x, K" N1 n) k8 P7 Y
InputFormat.java文件, 查看接口InputFormat的所有实现类, 结果如图1-5所示。
0 X! L+ D- e' F' ^ {' M( Z5 n( 2) 查看函数的调用关系7 g( h1 ~$ H5 Y8 q3 G# k
在Eclipse中, 选中某个方法名称, 右击, 在弹出的快捷菜单中选择"Open Call Hierarchy", 可在窗口"Call Hierarchy"中看到所有调用该方法的函数。
8 {0 P4 E y/ w2 z4 M R+ _图1-4 在Eclipse中查看Hadoop源代码中接口InputFormat的所有实现类1 x/ B1 p# {7 v0 H2 F3 f7 n
图1-5 Eclipse列出接口InputFormat的所有实现类
. }" \) c& _' j5 n: e3 v例如, 如图1-6所示, 打开hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java目录下org.apache.hadoop.mapred包中的! `) n: l0 M4 H+ ~. p) _
Task.java文件, 查看调用getJobID方法的所有函数, 结果如图1-7所示。' p. i0 Y$ p: w' N& a3 M
图1-6 在Eclipse中查看Hadoop源代码中所有调用Task.java中getJobID方法的函数! y& N! V2 T8 B
图1-7 Eclipse列出所有调用getJobID方法的函数
0 `) M) ~: l' l1 ~$ v( 3) 快速查找类对象的相关信息
4 V; ]+ `8 x/ x G' b与前两个小节类似, 选中类对象, 右击, 在弹出的快捷菜单中选择"Open Declaration", 可跳转到类定义; 选择"Quick Outline", 可查看类所有的成员变量* C, K& U2 V( J' G* Q) z/ V- ^! b J
和成员方法, 具体细节在此不做详细介绍, 读者自行尝试。 i* A1 I+ w, \9 f1 d! t
' x+ W9 l: Q0 h8 v* E
+ }) I5 \ T- h* K- h. l |
|