|
3.6 源代码阅读引导
& ]8 {# s" @( ^* m9 ]9 R$ ^% O) Z为了帮助读者更好地阅读源代码, 笔者特意安排了本节。 下面我们分两部分对读者进行指导。, F; X8 {( G. Z( E, }( E% G
1.Hadoop RPC" }& J* A$ Q3 I: a: B* K& C
Hadoop RPC内部实现位于源代码目录中hadoop-common-project/hadoop-common/src/main/java下的org.apache.hadoop.ipc包中, 而! K0 Q5 n7 a" k" T
YARN对RPC的Protocol Buffers封装则位于hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java目录下的
" d3 j% J+ k9 ^2 Porg.apache.hadoop.yarn.ipc包中。 建议读者按照以下流程学习这部分源代码: 首先尝试使用Hadoop RPC编写一个C/S服务器, 然后2 u, }% f2 w0 U6 I' s2 M
在理解Hadoop RPC整体架构的基础上, 依次阅读客户端部分代码和服务器端代码, 如果能够描述清楚下面两个流程, 则可认为
* ~% e4 P0 U- P" a对Hadoop RPC有了较为深入的理解。
9 x, G& _, C: y, I❑客户端发送一个请求到接收到请求应答的整个过程是怎样的, 依次经过了哪些函数调用和通信过程;3 w2 j' A3 p8 X4 V
❑多个客户端并发发送请求到服务器端后, 服务器端是如何处理的。3 y V6 I* B3 ~; d& J2 V
2.服务库、 事件库和状态机4 E8 C$ W- p8 i
了解服务库、 事件库和状态机库源代码所在目录可使读者省去许多麻烦。
! I. U5 B2 d2 [: x❑服务库位于源代码目录hadoop-common-project/hadoop-common/src/main/java下的org.apache.hadoop.yarn.service包中。$ e7 a+ A3 _+ e$ S- r, N0 r; v( W
❑事件库和状态机位于源代码目录中hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java下的( [, v/ D/ |% {: h
org.apache.hadoop.yarn.event和org.apache.hadoop.yarn.state两个包中。+ R, Y# R5 _+ p# {
建议读者按照以下流程学习这部分源代码: 首先弄清楚各个包的对外接口, 然后尝试编写几个实例使用这几个库。 当然, 读# Z2 i5 e7 q( g& d; d4 E
者也可以跟着YARN源代码学习这几个库, YARN源代码是这几个库的最好应用实例。
N- @) M1 J+ i1 E7 Q* `3.7 小结/ P5 o8 p+ ]% X+ [& v8 O# _
YARN基础库是其他一切模块的基础, 它的设计直接决定了YARN的稳定性和扩展性, YARN借用了MRv1的一些底层基础
& v. P& j; n4 _2 z7 E( J库, 比如RPC库等, 但因为引入了很多新的软件设计方式, 所以它的基础库更多, 包括直接使用了开源序列化框架Protocol+ M* r& s* q1 R9 i0 }4 |
Buffers和Apache Avro, 自定义的服务库、 事件库和状态机等。 本章介绍了YARN最重要的几个基础库。) [( V, ~$ R7 Q) C/ t
3.8 问题讨论8 d6 o+ M* W. P& x" a! Z
问题1: 引入Protocol Buffers之后, Hadoop RPC是否能像Thrift RPC或者Avro RPC那样具有跨语言特性, 比如Server采用Java编
8 _. |0 O, i3 D" ?+ o写, Client采用C++编写?
6 Q! Q2 N; K d/ @+ i问题2: 如果Hadoop RPC具备跨语言特性, 那么相比于Thrift或者Apache Avro, Hadoop RPC有什么优缺点? 如果不具备, 该
. [4 z& C. J2 Y2 ?如何让它具备跨语言特性呢?7 V& P5 Z4 E1 J, z. v- Z1 ]/ Q6 d: M
问题3: Hadoop RPC具备跨语言特性后, 将带来哪些好处? * B4 Z2 s" h: Y' j1 l
& X. P$ i: }6 K- {4 o, g
, E6 s: D9 w& _$ N$ u% l |
|