|
3.6 源代码阅读引导7 Z" \# \7 ^6 D
为了帮助读者更好地阅读源代码, 笔者特意安排了本节。 下面我们分两部分对读者进行指导。/ r/ e p* k! A t$ [& o$ i
1.Hadoop RPC1 q J2 T8 J) C" E9 F
Hadoop RPC内部实现位于源代码目录中hadoop-common-project/hadoop-common/src/main/java下的org.apache.hadoop.ipc包中, 而
. ^6 y n4 _4 Q8 B. A$ DYARN对RPC的Protocol Buffers封装则位于hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java目录下的
9 E2 n' j! g$ Borg.apache.hadoop.yarn.ipc包中。 建议读者按照以下流程学习这部分源代码: 首先尝试使用Hadoop RPC编写一个C/S服务器, 然后& L9 ]+ x Z4 i3 n" N
在理解Hadoop RPC整体架构的基础上, 依次阅读客户端部分代码和服务器端代码, 如果能够描述清楚下面两个流程, 则可认为
, \3 r" i6 m' d3 u对Hadoop RPC有了较为深入的理解。
V$ ^3 U$ o4 D❑客户端发送一个请求到接收到请求应答的整个过程是怎样的, 依次经过了哪些函数调用和通信过程;
% n- u0 D4 x+ d+ i' c% J U❑多个客户端并发发送请求到服务器端后, 服务器端是如何处理的。, C# R) v. F3 I# E$ ~
2.服务库、 事件库和状态机& H: Y8 l) D% N3 |6 d: }
了解服务库、 事件库和状态机库源代码所在目录可使读者省去许多麻烦。
8 w2 [5 u5 A1 W3 C: o❑服务库位于源代码目录hadoop-common-project/hadoop-common/src/main/java下的org.apache.hadoop.yarn.service包中。4 k* s0 v5 e' P+ j, O8 H3 M' Q
❑事件库和状态机位于源代码目录中hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java下的
5 a' E2 p1 H' K# z. K9 L. d horg.apache.hadoop.yarn.event和org.apache.hadoop.yarn.state两个包中。& Q# M. x' X" Q4 N0 ?1 c {
建议读者按照以下流程学习这部分源代码: 首先弄清楚各个包的对外接口, 然后尝试编写几个实例使用这几个库。 当然, 读
% e/ J* q5 z8 z: A者也可以跟着YARN源代码学习这几个库, YARN源代码是这几个库的最好应用实例。
+ X9 c! k4 n6 B% Y, `$ U0 A' g3.7 小结
' `" b. t- S% t8 v. \1 [& UYARN基础库是其他一切模块的基础, 它的设计直接决定了YARN的稳定性和扩展性, YARN借用了MRv1的一些底层基础2 G C$ Q& f' q+ Z: x
库, 比如RPC库等, 但因为引入了很多新的软件设计方式, 所以它的基础库更多, 包括直接使用了开源序列化框架Protocol
. ^0 V7 F, V$ W# x3 w( g* GBuffers和Apache Avro, 自定义的服务库、 事件库和状态机等。 本章介绍了YARN最重要的几个基础库。% E) ?8 { x" x- R% J) z9 \4 U* X
3.8 问题讨论
4 c+ Y" D2 z3 | H+ n+ x8 f问题1: 引入Protocol Buffers之后, Hadoop RPC是否能像Thrift RPC或者Avro RPC那样具有跨语言特性, 比如Server采用Java编
8 y- q' Q: l4 k A% h- V8 A写, Client采用C++编写?
/ @6 `9 ~7 g' C F: l. d3 P问题2: 如果Hadoop RPC具备跨语言特性, 那么相比于Thrift或者Apache Avro, Hadoop RPC有什么优缺点? 如果不具备, 该. G1 e. X8 m! b
如何让它具备跨语言特性呢?
0 R" W" {# C' V D7 d问题3: Hadoop RPC具备跨语言特性后, 将带来哪些好处?
7 C0 Y# C1 S$ Z" X/ Q8 {6 e/ @- F8 E( c3 \( h
# M# c& B1 K4 g* D! g6 {; w. H4 P$ l
|
|