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的类结构的更多相关文章

  1. Hadoop源码学习笔记(3) ——初览DataNode及学习线程

    Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...

  2. Hadoop源码学习笔记(6)——从ls命令一路解剖

    Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...

  3. Hadoop源码学习笔记(2) ——进入main函数打印包信息

    Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...

  4. Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

    Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...

  5. Hadoop源码学习笔记(4) ——Socket到RPC调用

    Hadoop源码学习笔记(4) ——Socket到RPC调用 Hadoop是一个分布式程序,分布在多台机器上运行,事必会涉及到网络编程.那这里如何让网络编程变得简单.透明的呢? 网络编程中,首先我们要 ...

  6. Hadoop源码学习笔记之NameNode启动场景流程一:源码环境搭建和项目模块及NameNode结构简单介绍

    最近在跟着一个大佬学习Hadoop底层源码及架构等知识点,觉得有必要记录下来这个学习过程.想到了这个废弃已久的blog账号,决定重新开始更新. 主要分以下几步来进行源码学习: 一.搭建源码阅读环境二. ...

  7. Hadoop源码学习笔记之NameNode启动场景流程四:rpc server初始化及启动

    老规矩,还是分三步走,分别为源码调用分析.伪代码核心梳理.调用关系图解. 一.源码调用分析 根据上篇的梳理,直接从initialize()方法着手.源码如下,部分代码的功能以及说明,已经在注释阐述了. ...

  8. Hadoop源码学习笔记之NameNode启动场景流程二:http server启动源码剖析

    NameNodeHttpServer启动源码剖析,这一部分主要按以下步骤进行: 一.源码调用分析 二.伪代码调用流程梳理 三.http server服务流程图解 第一步,源码调用分析 前一篇文章已经锁 ...

  9. Hadoop源码学习笔记之NameNode启动场景流程五:磁盘空间检查及安全模式检查

    本篇内容关注NameNode启动之前,active状态和standby状态的一些后台服务及准备工作,即源码里的CommonServices.主要包括磁盘空间检查. 可用资源检查.安全模式等.依然分为三 ...

随机推荐

  1. linux 使用内存作为 /tmp 临时文件夹

    方法一:cat /etc/fstabtmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0 方法二:mount tmpfs /tmp -t tmpfs -o s ...

  2. jQuery操作标签--样式、文本、属性操作, 文档处理

    1.样式 2.文本 3.属性操作 全选,反选效果 4.文档处理 操作标签 一.样式操作 样式类: addClass(); // 添加指定的css类名 removeClass(); //移除指定的css ...

  3. java学习笔记—国际化(41)

    国际化:internationalization即I18N. 举例: 本科高校的网站,一般的都有中文和英文两种页面风格.因此将这种根据不同用户群体显示不同的页面风格的方式称之为页面的国际化. 翻译 V ...

  4. 利用C# CefSharp Python采集某网站简历并自动发送邀请短信

    以往爬虫没怎么研究过,最近有个需求,要从某网站采集敏感信息,稍稍考虑了一下,决定利用C# Winform和Python一起来解决这个事件. 整个解决方案不复杂:C#编写WinForm窗体,进行数据分析 ...

  5. PHP中运算符优先级

    运算符优先级指定了两个表达式绑定得有多“紧密”.例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号(“*”)的优先级比加号(“+”)高.必要时可以用括号来强制改变优先级.例如: ...

  6. Vim 中的持久撤消

    Vim中的持久撤消 阅读文本大约需要俩分钟. 在 Vim 中像其他文本编辑器一样,你可以在当前会话中执行 "撤销/重做" .当一旦会话关闭,则你需要重新打开一个新文章,运行撤销将不 ...

  7. mxonline实战2, 后台管理神器xadmin

          对应github地址:xadmin的使用   第三天:xadmin的安装以及各应用模型的后台管理注册     一. 安装xamdin     1. 源码包下载地址 https://gith ...

  8. JSP常用Form表单控件

    [easyui]--combobox--赋值和获取选中的值 /初始化下拉选框 $('#communityIdDiv').combobox({ url:basepath+"pushContro ...

  9. AFNetworking 3.1.0 使用中某些知识点讲解

    # POST / GET  请求 /*! 首先要知道,POST请求不能被缓存,只有 GET 请求能被缓存.因为从数学的角度来讲,GET 的结果是 幂等 的,就好像字典里的 key 与 value 就是 ...

  10. P3348 [ZJOI2016]大森林(Link-cut-tree)

    传送门 题解 题面大意: \(0.\)区间加节点 \(1.\)区间换根 \(2.\)单点询问距离 如果没有\(1\)操作,因为区间加节点都是加在下面,所以我们可以直接把\(n\)棵树压成一棵树,直接询 ...