|
3.6 源代码阅读引导
* E* d1 N9 P1 b# [& e7 {为了帮助读者更好地阅读源代码, 笔者特意安排了本节。 下面我们分两部分对读者进行指导。8 E0 ^* z# @% ]$ s! x- O
1.Hadoop RPC
+ i2 }5 [6 O6 N* [Hadoop RPC内部实现位于源代码目录中hadoop-common-project/hadoop-common/src/main/java下的org.apache.hadoop.ipc包中, 而
! _( n. t2 m+ T# QYARN对RPC的Protocol Buffers封装则位于hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java目录下的- s- [" _/ O1 H2 v/ Q3 { F
org.apache.hadoop.yarn.ipc包中。 建议读者按照以下流程学习这部分源代码: 首先尝试使用Hadoop RPC编写一个C/S服务器, 然后2 m! ~6 w7 ^( U: S5 U9 C; N
在理解Hadoop RPC整体架构的基础上, 依次阅读客户端部分代码和服务器端代码, 如果能够描述清楚下面两个流程, 则可认为
# f% B# x5 |5 `+ e对Hadoop RPC有了较为深入的理解。
/ {/ ?# e' K8 X❑客户端发送一个请求到接收到请求应答的整个过程是怎样的, 依次经过了哪些函数调用和通信过程;" H: U9 @3 X, N. w' d
❑多个客户端并发发送请求到服务器端后, 服务器端是如何处理的。
& j+ K2 W- \$ L5 O7 |7 p: ~! j* ?2.服务库、 事件库和状态机
: U( k/ |3 N# e- K- c& t8 l7 D了解服务库、 事件库和状态机库源代码所在目录可使读者省去许多麻烦。
9 |. A1 x& Z9 m: z❑服务库位于源代码目录hadoop-common-project/hadoop-common/src/main/java下的org.apache.hadoop.yarn.service包中。
+ b0 E7 O0 W- D8 Z7 e2 u/ H$ K❑事件库和状态机位于源代码目录中hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java下的% q) r, l6 ?4 {! r6 z
org.apache.hadoop.yarn.event和org.apache.hadoop.yarn.state两个包中。3 ]; k8 O- p' |/ m# k) t3 p, d5 Q
建议读者按照以下流程学习这部分源代码: 首先弄清楚各个包的对外接口, 然后尝试编写几个实例使用这几个库。 当然, 读- ^+ Q3 z3 m7 k! z4 o, t
者也可以跟着YARN源代码学习这几个库, YARN源代码是这几个库的最好应用实例。
- N1 H6 P9 B. Q7 f, F- N3.7 小结
( p0 T* p. C- WYARN基础库是其他一切模块的基础, 它的设计直接决定了YARN的稳定性和扩展性, YARN借用了MRv1的一些底层基础6 Q. a) g6 s" h4 I2 t5 b
库, 比如RPC库等, 但因为引入了很多新的软件设计方式, 所以它的基础库更多, 包括直接使用了开源序列化框架Protocol1 ~9 ^4 d' v; Q$ A
Buffers和Apache Avro, 自定义的服务库、 事件库和状态机等。 本章介绍了YARN最重要的几个基础库。
( S- O$ V H* R' l3.8 问题讨论
7 {* Z; }1 q) K. Q问题1: 引入Protocol Buffers之后, Hadoop RPC是否能像Thrift RPC或者Avro RPC那样具有跨语言特性, 比如Server采用Java编 h( b" W+ J6 k" p) S6 ? `4 S u! W2 V
写, Client采用C++编写?7 j. ?8 W! X! j4 }
问题2: 如果Hadoop RPC具备跨语言特性, 那么相比于Thrift或者Apache Avro, Hadoop RPC有什么优缺点? 如果不具备, 该
+ p* s' s: J- W/ F/ R6 r如何让它具备跨语言特性呢?; R4 v, N3 s/ R" ~" R' A: i. Z8 r. T' {
问题3: Hadoop RPC具备跨语言特性后, 将带来哪些好处?
. } h0 L- k2 M. f- C( Z; X) P
7 F" ]- q. N. n1 |8 Z: O
! `5 _0 [" A$ [8 g6 ^ |
|