Hadoop日记Day11---主从节点接口分析

一、NameNode 的接口分析

1. NameNode本质


  经过前面的学习,可以知道NameNode 本身就是一个java 进程。观察RPC.getServer()方法的第一个参数,发现是this,说明NameNode 本身就是一个位于服务端的被调用对象,即NameNode 中的方法是可以被客户端代码调用的。根据RPC 运行原理可知,NameNode暴露给客户端的方法是位于接口中的。
我们查看NameNode 的源码,如图1.1所示。

图 1.1

  可以看到NameNode 实现了ClientProtocal、DatanodeProtocal、NamenodeProtocal 等接口。



2. NameNode的接口



2.1 DFSClient 调用ClientProtocal

  <1> 这个接口是供客户端调用的。这里的客户端不是指的我们自己写的代码,而是hadoop 的一个类叫做DFSClient。在DFSClient 中会调用ClientProtocal 中的方法,完成一些操作。
  <2>该接口中的方法大部分是对HDFS 的操作,如create、delete、mkdirs、rename 等。

2.2 DataNode 调用DatanodeProtocal

  这个接口是供DataNode 调用的。DataNode 调用该接口中的方法向NameNode 报告本节点的状态和block 信息。NameNode 不能向DataNode 发送消息, 只能通过该接口中方法的返回值向DataNode 传递消息。

2.3 SecondaryNameNode 调用NamenodeProtocal

  这个接口是供SecondaryNameNode 调用的。SecondaryNameNode 是专门做NameNode 中edits 文件向fsimage 合并数据的。


二、DataNode 的接口分析

  按照分析NameNode 的思路,看一下DataNode 的源码接口,如图2.1 所示。


图2.1

  这里有两个接口,分别是InterDatanodeProtocal、ClientDatanodeProtocal。这里就不展开分析了。读者可以根据上面的思路独立分析。


三、HDFS的数据处理过程分析

1. HDFS 的写数据过程分析


  <1>我们通过FileSystem 类可以操控HDFS,那我们就从这里开始分析写数据到HDFS 的过程。在我们向HDFS 写文件的时候,调用的是FileSystem.create(Path path)方法,我们查看这个方法的源码,通过跟踪内部的重载方法,可以找到如图3.1所示的调用。


图3.1



  <2>这个方法是抽象类,没有实现。那么我们只能向他的子类寻找实现。FileSystem 有个子类是DistributedFileSystem,在我们的伪分布环境下使用的就是这个类。我们可以看到DistributedFileSystem 的这个方法的实现,如图3.2示。

图3.2

  在图3.2中,注意第186 行的返回值FSDataOutputStream。这个返回值对象调用了自己的构造方法,构造方法的第一个参数是dfs.create()方法。



  <3>我们关注一下这里的dfs 对象是谁,create 方法做了什么事情。现在进入这个方法的实现,如图3.3 所示。


图3.3

  在图3.3 中,返回值正是第866行创建的对象。



  <3>这个类有什么神奇的地方吗?我们看一下他的源码,如图3.4 所示。

图3.4

  在图3.4 中, 可以看到, 这个类是DFSClient 的内部类。在类内部通过调用namenode.create()方法创建了一个输出流。



  <4>我们再看一下namenode 对象是什么类型,如图3.5所示。

图3.5

  在图3.5 中,可以看到namenode 其实是ClientProtocal 接口。



  <5>那么,这个对象是什么时候创建的那?如图3.6 所示。


图3.6

  可以看出,namenode 对象是在DFSClient 的构造函数调用时创建的,即当DFSClient 对象存在的时候,namenode 对象已经存在了。



  <6>至此,我们可以看到,使用FileSystem 对象的api 操纵HDFS,其实是通过DFSClient 对象访问NameNode 中的方法操纵HDFS 的。这里的DFSClient 是RPC 机制的客户端,NameNode是RPC 机制的服务端的调用对象,整个调用过程如图3.7所示。


图 3.7

  在整个过程中,DFSClient 是个很重要的类,从名称就可以看出,他表示HDFS 的Client,是整个HDFS 的RPC 机制的客户端部分。我们对HDFS 的操作,是通过FileSsytem 调用的DFSClient 里面的方法。FileSystem 是封装了对DFSClient 的操作,提供给用户使用的。



2. HDFS 的读数据过程分析


  <1>我们继续对FileSystem 类分析,读数据使用的是open(…)方法,我们可以看到源码,如图3.8 所示。

图3.8

  在图3.8 中,返回的是DFSClient 类中DFSDataInputStream 类.显而易见,这是一个内部类。



  <2>这个内部类的构造函数,有两个形参,第一个参数是dfs.open(…)创建的对象。我们看一下方法的源码,如图3.9所示。


图3.9

在图3.9的实现中,返回的是一个DFSInputStream 对象。



  <3>该对象中含有NameNode 中的数据块信息。我们看一下这个类的构造方法源码,如图3.10 所示。

图3.10

  <4>在图3.10中,这个构造方法中最重要的语句是第1836 行,打开信息,从第1842 行开始是openInfo()的源代码,截图显示不全。注意第1841 行,是获取数据块的信息的。我们查看这一行的源代码,如图3.11所示。

图3.11

从图3.11 中可以看到,获取数据块信息的方法也是通过调用namenode 取得的。这里的namenode 属性还是位于DFSClient 中的。通过前面的分析,我们已经知道,在DFSClient类中的namenode 属性是ClientProtocal。

时间: 2024-12-20 03:22:35

Hadoop日记Day11---主从节点接口分析的相关文章

Hadoop日记系列目录

下面是Hadoop日记系列的目录,由于目前时间不是很充裕,以后的更新的速度会变慢,会按照一星期发布一期的原则进行,希望能和大家相互学习.交流. 目录安排 1>  Hadoop日记Day1---Hadoop介绍 2>  Hadoop日记Day2---虚拟机中搭建Linux 3>  Hadoop日记Day3---Hadoop的伪分布式安装 4>  Hadoop日记Day4---去除HADOOP_HOME is deprecated 5>  Hadoop日记Day5---HDFS介

Hadoop动态添加/删除节点(datanode和tacktracker)

总的来说,正确的做法是优先通过配置文件,再在具体机器上进行相应进程的启动/停止操作. 网上一些资料说在调整配置文件的时候,优先使用主机名而不是IP进行配置. 总的来说添加/删除DataNode和TaskTracker的方法非常相似,只是操作的配置项和使用的命令有微小差异. 1. DataNode 1.0 配置文件 在master/namenode下修改配置文件conf/mapred-site.xml. 关键参数dfs.hosts和dfs.hosts.exclude. 注意:不同hadoop版本的

Hadoop 分布式环境slave节点重启忽然不好使了

Hadoop 分布式环境slaves节点重启: 忽然无法启动DataNode和NodeManager处理: 在master节点: vim /etc/hosts: 修改slave 节点的IP (这个时候的IP应当登录slave节点ifconfig 查看) 造成这个原因是: slave节点如果是通过有线连接的路由器,每次重启后IP会被重新分配,如果salve节点是通过无线连接路由器的话不存在这个问题

redis cluster集群动态伸缩--删除主从节点

目标:从集群中剔除一组主从(5007,5008) 经过上一节增加5007,5008主从服务节点后,目前集群的情况是这样的: b3363a81c3c59d57143cd3323481259c044e66d2 192.168.8.196:[email protected] slave 1b7aa419065c5477c0def9d5e25106963fbdda76 0 1573003356000 3 connected 1b7aa419065c5477c0def9d5e25106963fbdda76

Hadoop日记Day5---HDFS深入浅析

本文用到了查看hadoop源码,关于hadoop源码导入Eclipse方式见第一期 一.HDFS的背景介绍 随着数据量越来越大,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统. 学术一点的定义就是:分布式文件系统是一种允许文件通过网络在多台主机上分享的文件的系统,可让多机器上的多用户分享文件和存储空间.分布式文件管理系统很多,hdfsHDFS 只是其中一种.适用于一次写入.多次查询的

Hadoop动态加入/删除节点(datanode和tacktracker)

大体,正确的做法是首选的配置文件,然后开始详细机对应的进程/停止操作. 网上一些资料说在调整配置文件的时候,优先使用主机名而不是IP进行配置. 总的来说加入/删除DataNode和TaskTracker的方法很相似,仅仅是操作的配置项和使用的命令有微小差异. 1. DataNode 1.0 配置文件 在master/namenode下改动配置文件conf/mapred-site.xml. 关键參数dfs.hosts和dfs.hosts.exclude. 注意:不同hadoop版本号的配置文件规划

Mac下的hadoop环境搭建(单节点)

一.安装Java 1.下载以及安装 官网下载jdk,我下载的是1.8.0_45 网址:http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 如下所示: 然后安装,默认安装路径是:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home 2.测试是否安装成功 在终端输入 : java -version 如果安装成功,则会显示相应

Hadoop日记Day7---HDFS的WED端口

HDFS 对外提供了可供访问的http server,开放了很多端口,下面介绍常用的几个端口(http://hadoop:……). 一.50070 端口,查看NameNode 状态,如图1.1所示. 图 1.1 该端口的定义位于core-default.xml 中,如图1.2所示,读者可以在core-site.xml 中自行修改. 图 1.2 如果读者通过该端口看着这个页面,可以认为该NameNode 节点是存活的. 二.50075 端口,查看DataNode 的状态,如图2.1所示. 图 2.

Hadoop日记Day14---MapReduce源代码回顾总结

一.回顾单词统计源码 1 package counter; 2 3 import java.net.URI; 4 5 import org.apache.hadoop.conf.Configuration; 6 import org.apache.hadoop.fs.FileSystem; 7 import org.apache.hadoop.fs.Path; 8 import org.apache.hadoop.io.LongWritable; 9 import org.apache.hado