|
1.3 搭建Hadoop源代码阅读环境# i) T: ~, L3 o' A$ q- B) }, O8 _
1.3.1 创建Hadoop工程! ~2 w% i2 t4 H: t
本节将介绍如何创建一个Hadoop源代码工程以方便阅读源代码。 总体上说, 目前存在两种Hadoop源代码阅读环境搭建方法, 分别是构建Maven工程和构
0 _2 [! G! P* ^' [/ [* `建Java工程。 两种方法各有利弊: 前者可通过网络自动下载依赖的第三方库, 但源代码会被分散到多个工程中进而带来阅读上的不便; 后者可将所有源代码
# L4 ?- L; d, ]! s组织在一个工程中, 但需要自己添加依赖的第三方库, 大家可根据自己的喜好选择一种方法。 本节将依次介绍这两种方法。
# Y, _6 q, B; C+ t8 K8 Z. `( H( 1) 构建Maven工程+ h0 i5 e) s1 M! O
通过Maven工程搭建Hadoop源代码阅读环境的步骤如下:
, j: h5 a% M; F; W2 g步骤1 解压缩Hadoop源代码。7 x b* S; o& R% h0 t
将下载到的Hadoop源代码压缩包解压到工作目录下, 比如hadoop-2.0-src.tar.gz( 注意, 为了方便, 此处直接使用版本号2.0, 实际下载到的源代码版本号
; N) w" e8 c4 k并不是这样的, 可能是2.2.0, 这样压缩包的名字实际为hadoop-2.2.0-src.tar.gz) 。6 v& s! {2 S' A0 E L
步骤2 导入Maven工程。
: |. e6 {, M4 q3 T2 |在Eclipse中, 依次选择"File"→"Import"→"Maven"→"Existing Maven Project", 在弹出的对话框中的"Root Directory"后面, 选择Java源代码所在的目录。
3 H# l8 V" E5 g0 \单击"Next"按钮, 在弹出的对话框中选择"Resolve All Later", 并单击"Finish"按钮完成Maven项目导入。 之后, Eclipse会自动通过网络从Maven库中下载依赖' x [. S1 f: Z) m& V2 \
的第三方库( JAR包等) 。 注意, 你所使用的电脑必须能够联网。
* ` K8 e l6 \& [8 m( q2 m将Hadoop 2.0源代码导入Maven项目后, 会生成50个左右的工程, 这些都是通过Maven构建出来的, 每个工程是一个代码模块, 且彼此相对独立, 可以单. w) d0 W: ?4 U% a
独编译。 你可以在某个工程下的"src/main/java"目录下查看对应的源代码。, Q# G5 V6 R# ]" \5 c
( 2) 构建Java工程4 |: F; W8 l" N) i3 E. h, O
通过Java工程搭建Hadoop源代码阅读环境的步骤如下:
- e6 e9 d3 v0 ^4 b+ p* X- n步骤1 解压缩Hadoop源代码。5 Y; m! Z: M7 L/ x9 h
同“构建Maven工程”中的步骤1类似。1 x5 X: c& I. N, A. k3 n- I; X
步骤2 新建Java工程。
2 s) O& j2 R6 }3 e; e- [6 _3 |打开Eclipse, 进入Eclipse可视化界面后, 如图1-1所示, 依次单击"File"→"New"→"Java Project", 并在弹出的对话框中去掉"Use default location"前的勾号, 然; _( L6 c; @, I; {- y* b8 j
后选择Hadoop安装目录的位置, 默认情况下, 工程名称与Hadoop安装目录名称相同, 用户可自行修改。 单击“完成”按钮, Hadoop源代码工程创建完毕。
7 v8 y8 {" e. y2 z u图1-1 新建Hadoop工程9 U* t) J6 Y" x. L, q! D- I/ D& K; z4 N
回到Eclipse主界面后, 打开新建的Hadoop工程, 可看到整个工程按图1-2所示组织代码: 按目录组织源代码, 且每个目录下以JAR包为单位显示各个Java
8 i6 B; D+ o+ A X: ?* w# p文件。8 j& o, l3 m) b0 z2 L& i
图1-2 Hadoop工程展示( 部分) 源代码方式
' Q: J( ?" V' I$ ]$ I7 X除了使用源代码压缩包导入Eclipse工程的方法外, 读者可也尝试直接从Hadoop SVN上导入Hadoop源代码。
* f; C, [2 |) t; g# @需要注意的是, 通过以上方法导入Hadoop 2.0源代码后, 很多类或者方法找不到对应的JAR包, 为了解决这个问题, 你需要将第三方JAR包导入工程中,* y9 R* {. z+ s" o
如图1-3所示, 方法如下: 解压存放JAR包的压缩包, 然后右击Project名称, 在弹出的快捷菜单中选择"Properties"命令, 将会弹出一个界面, 然后在该界面中
5 ]$ o4 V6 r. g, |依次选择"Java Build Path"→"Libraries"→"Add External JARs...", 将解压目录中share/hadoop目录下各个子目录中lib文件夹下的JAR包导入工程。
/ F6 G9 r, {4 v2 ]6 b7 a7 w前面提到CDH版本将源代码和JAR包放到了一起, 因此, 如果使用CDH版本, 则直接按照上述方法将源代码导入Eclipse工程即可。3 I7 m5 F& F9 q
细心的读者在阅读源代码过程中仍会发现部分类或者函数无法找到, 这是因为Hadoop 2.0使用了Protocol Buffers定义了RPC协议, 而这些Protocol Buffers文
7 ~) O2 }# N5 u! b" P3 h8 X件在Maven编译源代码时才会生成对应的Java类, 因此若其他类在源代码中引用这些类则暂时无法找到, 解决方法是先编译Hadoop 2.0源代码再倒入Eclipse工
. m& L1 \# I& x. g! g程, 具体方法如下( 注意, 进行以下步骤之前, 需先完成1.6.1节中的准备工作) 。6 b( t) ]- n3 q+ ~
首先, 使用以下命令安装Elicpse插件hadoop-maven-plugins:
" o; ~9 \1 p" Q, }5 z0 v图1-3 导入依赖的第三方JAR包/ U. Y$ Y: z+ M/ p0 M! g% d
$ cd ${HADOOP_HOME}/hadoop-maven-plugins+ i& C7 V7 T8 P
$ mvn install
7 H% D b/ m% D- v, x! ~5 N. @然后生成Eclipse工程文件:: n) \, @5 A7 L5 _* `
$ cd ${HADOOP_HOME}! i" I5 }. I) S% E) c6 q1 c
$ mvn eclipse:eclipse -DskipTests
1 ~- W6 I5 b6 `- Z* H最后在Eclipse中按照以下流程导入源代码: "File"→"Import"→"Existing Projects into Workspace"。
9 ^9 L7 `& _& w4 D2 }1.3.2 Hadoop源代码阅读技巧
/ T% ?8 ]* X/ P( [本节介绍在Eclipse下阅读Hadoop源代码的一些技巧, 比如: 如何查看一个基类有哪些派生类, 一个方法被其他哪些方法调用等。6 [0 H* [1 i1 ^: J$ }0 n
( 1) 查看一个基类或接口的派生类或实现类
. p0 Y6 ^; p9 D& r. `在Eclipse中, 选中某个基类或接口名称, 右击, 在弹出的快捷菜单中选择"Quick Type Hierarchy", 可在新窗口中看到对应的所有派生类或实现类。
$ H; x* P! R6 O3 X# y) m例如, 如图1-4所示, 打开hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java目录下org.apache.hadoop.mapred包中的7 s2 k* g8 D" i5 I' T
InputFormat.java文件, 查看接口InputFormat的所有实现类, 结果如图1-5所示。
/ R" E$ Y) a5 W, I/ E9 Q( 2) 查看函数的调用关系
5 h% X. i( D# A7 h7 t在Eclipse中, 选中某个方法名称, 右击, 在弹出的快捷菜单中选择"Open Call Hierarchy", 可在窗口"Call Hierarchy"中看到所有调用该方法的函数。
6 J# L. U/ }' S% u9 T8 _( X7 `5 m9 `图1-4 在Eclipse中查看Hadoop源代码中接口InputFormat的所有实现类
' t7 Y2 J. z' m% C1 C图1-5 Eclipse列出接口InputFormat的所有实现类
0 y* W/ W' j6 b" {" _例如, 如图1-6所示, 打开hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java目录下org.apache.hadoop.mapred包中的
9 H: o2 E4 b7 aTask.java文件, 查看调用getJobID方法的所有函数, 结果如图1-7所示。
% Z/ }7 l) n& q% B- ]+ I图1-6 在Eclipse中查看Hadoop源代码中所有调用Task.java中getJobID方法的函数' z) S! B) c2 u" Y& q) C' I# s
图1-7 Eclipse列出所有调用getJobID方法的函数
0 A* s' v0 j6 F) z3 A6 a0 }( 3) 快速查找类对象的相关信息
- O, m2 O3 N* Y2 E7 ]与前两个小节类似, 选中类对象, 右击, 在弹出的快捷菜单中选择"Open Declaration", 可跳转到类定义; 选择"Quick Outline", 可查看类所有的成员变量7 d8 ?; y% U$ |) d! ]
和成员方法, 具体细节在此不做详细介绍, 读者自行尝试。
2 `# T3 n7 u( z* R }
% d2 f- X' e3 d7 G! a3 o1 b, g
$ ]. D% C1 m8 q, u2 d$ \( C' p |
|