Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构
Hadoop源码学习笔记(5)
——回顾DataNode和NameNode的类结构
之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步看看几个对象的大至结构以及调用关系。
我们知道,三个结构(客户端,NameNode,DataNode)是能过网络调用的,走的是RPC。那在底层通讯时谁做服务器谁做客户端呢?我们先回顾一下这三者关系:

这样看,看不出,我们进入源码,看一下夹在中间的NameNode:

在这个initialize函数中,我们找了它的影子,RPC.getServer,显然,这里是在做服务端,然后再往后观察,也没有启动其它线程之类的,然后getServer传入参数,第一个是this,说明这个服务就是把自己当成了RPC服务对象。
既然当成了RPC服务,那事必要继承VersionedProtocol接口咯,我们看下这个类的定义处:

我们发现,并没有直接继承VersionedProtocol接口,但进一步看:ClientProtocol, DatanodeProtocol,NamenodeProtocol,RefreshAuthorizationPolicyProtocol这四个接口都又继承了VersionedProtocol接口。
从字面意思,或里面的定义说明来看,这四个接口,分别实现了给客户端(FSClient),DataNode,NameNode,刷身份认证的几块功能来应用的。大牛考虑的还是很周道,虽说这个NameNode是一个大的RPC服务的处理者,但是通过接口,又将其划分成多个子功能块。
既然它是一个服务端(server),那另外两个呢?我们看下
我们先找到客户端处理类:org.apache.hadoop.hdfs.DFSClient,随便找个处理类:

我们发现,比如这个listPaths,直接处理方法,就是调用namenode.GetListing。而这个namenode是啥,追查一下,找到其定义:

很明显,这个是跟NameNode类中的接口ClientProtocol同一个,然后其实使化呢:


我们找到这个RPC客户端的影子。(当然有人说,上面用的是namenode对象,这里创建的是rpcNameNode么,这里是又包了一层,后面再来研究)
同样,我们再看一下DataNode:
在定义中,看到:

这个定义类型是DatanodeProtocol,也是NameNode服务上实现的接口。
这个对象的初使化,在startDataNode中,我们也找到了RPC的影子:

这样,大体过程清晰了,NameNode架设了一个RPC服务,其他的都与之相联,至于各个模块间通讯内容有哪些,简单了,就直接看看ClientProtocol, DatanodeProtocol,NamenodeProtocol,RefreshAuthorizationPolicyProtocol这几个接口。
程序结构呢,比较容易了,DataNode是一个大线程,里面一个死循环,不断向NameNode通过RPC发消息。 NameNode,就是一个服务,然后程序在Server.join中卡住,不断的接收发来的RPC请求。 客户端DFSClient,是一个简单的处理类,每个功能函数请求,都转向到NameNode服务中处理。
OK,大体上有了初步的了解后,接下来我们就要抓住几根线,看各个服务是如何处理文件命令的。下回分解。
Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构的更多相关文章
- Hadoop源码学习笔记(3) ——初览DataNode及学习线程
Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...
- Hadoop源码学习笔记(6)——从ls命令一路解剖
Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...
- Hadoop源码学习笔记(2) ——进入main函数打印包信息
Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...
- Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类
Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...
- Hadoop源码学习笔记(4) ——Socket到RPC调用
Hadoop源码学习笔记(4) ——Socket到RPC调用 Hadoop是一个分布式程序,分布在多台机器上运行,事必会涉及到网络编程.那这里如何让网络编程变得简单.透明的呢? 网络编程中,首先我们要 ...
- Hadoop源码学习笔记之NameNode启动场景流程一:源码环境搭建和项目模块及NameNode结构简单介绍
最近在跟着一个大佬学习Hadoop底层源码及架构等知识点,觉得有必要记录下来这个学习过程.想到了这个废弃已久的blog账号,决定重新开始更新. 主要分以下几步来进行源码学习: 一.搭建源码阅读环境二. ...
- Hadoop源码学习笔记之NameNode启动场景流程四:rpc server初始化及启动
老规矩,还是分三步走,分别为源码调用分析.伪代码核心梳理.调用关系图解. 一.源码调用分析 根据上篇的梳理,直接从initialize()方法着手.源码如下,部分代码的功能以及说明,已经在注释阐述了. ...
- Hadoop源码学习笔记之NameNode启动场景流程二:http server启动源码剖析
NameNodeHttpServer启动源码剖析,这一部分主要按以下步骤进行: 一.源码调用分析 二.伪代码调用流程梳理 三.http server服务流程图解 第一步,源码调用分析 前一篇文章已经锁 ...
- Hadoop源码学习笔记之NameNode启动场景流程五:磁盘空间检查及安全模式检查
本篇内容关注NameNode启动之前,active状态和standby状态的一些后台服务及准备工作,即源码里的CommonServices.主要包括磁盘空间检查. 可用资源检查.安全模式等.依然分为三 ...
随机推荐
- 【BZOJ2440】[中山市选2011]完全平方数
题意描述 原题 一句话描述: 求第K个不是完全平方数的倍数的数. K≤$10^{9}$ ------------------------------------------ 题解: 首先,直接求第$k ...
- 洛谷P4250 [SCOI2015]小凸想跑步(半平面交)
题面 传送门 题解 设\(p\)点坐标为\(x_p,y_p\),那么根据叉积可以算出它与\((i,i+1)\)构成的三角形的面积 为了保证\(p\)与\((0,1)\)构成的面积最小,就相当于它比其它 ...
- 浅析group by,having count()
SELECT COUNT(*) FROM (SELECT COUNT(id),order_type,city_id,category_id,major_category_id,puid,user_id ...
- [Objective-C语言教程]结构体(17)
Objective-C数组可定义包含多个相同类型的数据项的变量类型,但结构体是Objective-C编程中的另一个用户定义数据类型,它可组合不同类型的数据项. 结构体用于表示记录,假设要图书馆中跟踪书 ...
- 架构师养成记--23.sigar使用实例
作用是检测机器的硬件环境 注意在jdk的bin目录下加上sigar的lib目录中的文件 import java.net.InetAddress; import java.net.UnknownHost ...
- 手动抠下的wordpress登录页面样式
CSS文件 login.css body, html { height: 100%; margin: 0; padding: 0; } html[Attributes Style] { -webkit ...
- 微信小程序之蓝牙 BLE 踩坑记录
前言 前段时间接手了一个微信小程序的开发,主要使用了小程序在今年 3 月开放的蓝牙 API ,此过程踩坑无数,特此记录一下跳坑过程.顺便开了另一个相关的小项目,欢迎 start 和 fork: BLE ...
- Array flat的实现
if (!Array.prototype.flat) { Array.prototype.flat = function (num = 1) { if (!Number(num) || Number( ...
- Mac下使用PF进行端口转发和防火墙配置(类似Linux的iptables)
在Mac没有iptables这些,替代的软件为PF,命令为pfctl.在早些版本用ipfw(<=10.10),后面改为PF.还有一些可以使用OpenBsd,不过这个不太好用. 网上关于pfctl ...
- Mac下利用SSH进行传输文件(转)
//1.从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本地目录) //例如scp root@192.168.0 ...