|
3.6 源代码阅读引导; `; z9 M2 }# W0 H/ E( J
为了帮助读者更好地阅读源代码, 笔者特意安排了本节。 下面我们分两部分对读者进行指导。
8 F- @9 q1 E1 I) l! G, J1.Hadoop RPC
% x7 L9 c( Y9 @! B' J$ cHadoop RPC内部实现位于源代码目录中hadoop-common-project/hadoop-common/src/main/java下的org.apache.hadoop.ipc包中, 而 m$ p" i* H" G8 Q" F5 h% `1 C* M+ B4 {
YARN对RPC的Protocol Buffers封装则位于hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java目录下的' {1 m3 g$ p7 e) @' e
org.apache.hadoop.yarn.ipc包中。 建议读者按照以下流程学习这部分源代码: 首先尝试使用Hadoop RPC编写一个C/S服务器, 然后
, D d, \' ?" e1 E6 y/ X在理解Hadoop RPC整体架构的基础上, 依次阅读客户端部分代码和服务器端代码, 如果能够描述清楚下面两个流程, 则可认为2 M' h% G7 P3 e4 Q/ D2 q
对Hadoop RPC有了较为深入的理解。
& u+ u5 y1 J' l' v9 E* V9 @4 w❑客户端发送一个请求到接收到请求应答的整个过程是怎样的, 依次经过了哪些函数调用和通信过程;* s7 P8 ?6 x( W
❑多个客户端并发发送请求到服务器端后, 服务器端是如何处理的。! |5 S; u4 Q1 J: ~0 B/ r8 k" N
2.服务库、 事件库和状态机
: u ^1 C/ o$ P; d7 u了解服务库、 事件库和状态机库源代码所在目录可使读者省去许多麻烦。
3 s. |1 e% \5 i/ k❑服务库位于源代码目录hadoop-common-project/hadoop-common/src/main/java下的org.apache.hadoop.yarn.service包中。
' x+ }2 z9 o5 }% e❑事件库和状态机位于源代码目录中hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java下的% c% D2 O9 p" S$ L( j% Y+ L
org.apache.hadoop.yarn.event和org.apache.hadoop.yarn.state两个包中。! t6 p/ p9 z5 q8 [8 i4 p
建议读者按照以下流程学习这部分源代码: 首先弄清楚各个包的对外接口, 然后尝试编写几个实例使用这几个库。 当然, 读
( i& V8 X) ?7 o+ v% I者也可以跟着YARN源代码学习这几个库, YARN源代码是这几个库的最好应用实例。- I! Y* W# J5 d8 C% x2 A
3.7 小结( P8 u% m$ W. u7 q
YARN基础库是其他一切模块的基础, 它的设计直接决定了YARN的稳定性和扩展性, YARN借用了MRv1的一些底层基础
* s9 G. s5 Z; U2 h库, 比如RPC库等, 但因为引入了很多新的软件设计方式, 所以它的基础库更多, 包括直接使用了开源序列化框架Protocol
' L) _8 E/ e0 O; X! e3 m9 g# iBuffers和Apache Avro, 自定义的服务库、 事件库和状态机等。 本章介绍了YARN最重要的几个基础库。0 R! }- D, ]( ]
3.8 问题讨论
9 e# C4 V# K Q9 n4 `问题1: 引入Protocol Buffers之后, Hadoop RPC是否能像Thrift RPC或者Avro RPC那样具有跨语言特性, 比如Server采用Java编! {% z& u& G, ~5 W0 Z F
写, Client采用C++编写?
) ~# `) i7 ?2 u问题2: 如果Hadoop RPC具备跨语言特性, 那么相比于Thrift或者Apache Avro, Hadoop RPC有什么优缺点? 如果不具备, 该4 W$ C0 A9 `1 E# c5 ~+ m: c: O
如何让它具备跨语言特性呢?
# q) Y% O: O9 P问题3: Hadoop RPC具备跨语言特性后, 将带来哪些好处? ; q# J& Z i6 u8 i
) s9 K( A% `( ?0 m, t' b% X! t2 p; W A9 N: ^
|
|