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.主要包括磁盘空间检查. 可用资源检查.安全模式等.依然分为三 ...
随机推荐
- A - 还是畅通工程(最小生成树)
点击打开链接 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并 ...
- jenkins+gitlab+robot framework 中遇到的坑
问题一:拉Git源代码时提示无权限 原来之前用的ssh密钥一直都是自己的用户生成的.其实在Jenkins系统使用的都是Jenkins这个系统帐号的. 解决方法: 切换到jenkins这个帐号下生成个新 ...
- Security-OAuth2.0 密码模式之服务端实现
第一步:配置数据库 ,固定创建三张表 ,OAuth2 框架需要默认使用这三张表 我使用的时Mysql,工具为navcat CREATE TABLE `oauth_access_token` ( `to ...
- day4. python学习之字典
字典和列表是最常用的数据类型,字典是一种key-value的数据类型,用{ }表示 1.字典的特性:无序的,没有下标 2.字典的使用:增删改查 info = { '20181101':"zh ...
- 【Alpha】Phylab 展示博客
目录 Phylab Alpha 展示博客 一.团队简介 二.项目目标 2.1 典型用户 2.2 功能描述 2.3 用户量 三.项目发布与展示 3.1 新功能 3.2 修复缺陷 3.3 问题与限制 3. ...
- [转] gitlab 的 CI/CD 配置管理
[From] http://blog.51cto.com/flyfish225/2156602 gitlab 的 CI/CD 配置管理 (二) 标签(空格分隔):运维系列 一:gitlab CI/CD ...
- ator自动生成mybatis配置和类信息
generator自动生成mybatis的xml配置.model.map等信息: 1.下载mybatis-generator-core-1.3.2.jar包. 网址:http://cod ...
- Mac下配置idea(Mac 10.12)
idea应该是第二个最好用的开发工具,除了宇宙最强大的VS第一外,过来就是它,其体系中已经发布很多语言的开发工具. idea:http://bbs.feng.com/read-htm-tid-1050 ...
- 基于MVC4+EF5.0+Ajax+Json+CSS3的简单注册页面(get&post)
使用mvc4可以很快速的创建页面,但封装的过多,难免会有些性能上的问题.所以基于此,通过使用简单的手写html,加ajax,json来创建一个注册页面,会比较干净,简洁. 本项目的环境是MVC4+EF ...
- 使用grunt搭建自动化的web前端开发环境
使用grunt搭建自动化的web前端开发环境 我们一定经常听过grunt和gulp,它们都是用于搭建自动化的web前端开发环境的,这里主要介绍grunt的使用,值得一提的是,jQuery.bootst ...