Hadoop NameNode执行命令工作流程

2023-09-18 17:35:44

客户端API或者CLI与NameNode的交互命令数据的格式

hadoop使用PB协议(protocol buffer)来传输数据与命令
ProtocolBuffer是用于序列化结构数据的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。一旦定义了你自己的数据结构,然后就可以使用特殊生成的源代码轻松的在各种数据流和使用的各种高级语言之间读写你的结构化数据。你甚至可以在不破坏根据“旧”格式编译的已部署程序的情况下更新你的数据结构。

(1) 预处理流程

PB协议使用了proto文件保存交互数据的结构,因此首先hadoop需要将proto编译成为java文件

执行maven命令打包的期间,会执行protoc命令将protopuf文件生成Java类

<plugin>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-maven-plugins</artifactId>
<executions>
  <execution>
    <id>compile-protoc</id>
    <phase>generate-sources</phase>
    <goals>
      <goal>protoc</goal>
    </goals>
    <configuration>
      <protocVersion>${protobuf.version}</protocVersion>
      <protocCommand>${protoc.path}</protocCommand>
      <imports>
        <param>${basedir}/../../hadoop-common-project/hadoop-common/src/main/proto</param>
        <param>${basedir}/src/main/proto</param>
      </imports>
      <source>
        <directory>${basedir}/src/main/proto</directory>
        <includes>
          <include>ClientDatanodeProtocol.proto</include>
          <include>ClientNamenodeProtocol.proto</include>
          <include>DatanodeProtocol.proto</include>
          <include>HAZKInfo.proto</include>
          <include>InterDatanodeProtocol.proto</include>
          <include>JournalProtocol.proto</include>
          <include>NamenodeProtocol.proto</include>
          <include>QJournalProtocol.proto</include>
          <include>acl.proto</include>
          <include>xattr.proto</include>
          <include>datatransfer.proto</include>
          <include>fsimage.proto</include>
          <include>hdfs.proto</include>
          <include>encryption.proto</include>
          <include>inotify.proto</include>
        </includes>
      </source>
      <output>${project.build.directory}/generated-sources/java</output>
    </configuration>
  </execution>
</executions>
</plugin>

(2) 创建NameNode与NameNodePrcServer流程

NameNode.main() —> MainNode.createNameNode()—>new NameNode() —> NameNode.initialize() —> createRpcServer() —> new NameNodeRpcServer(conf, this) —> BlockingService clientNNPbService = ClientNamenodeProtocol.newReflectiveBlockingService(new ClientNamenodeProtocolServerSideTransltatorPB(this)) —> new PRC.Builder(conf).setInstance(clientNNPbService ) —> NameNodePrcServer.start()

  • 在NameNode的构建方法中,PRC使用了protopuf来存储所有的协议,其中就包括ClientNamenodeProtocol.proto,其用来设定与namenode的交互数据格式,比如mkdir、delete、rename等命令。
  • protopuf协议的目录在\hadoop-hdfs-project\hadoop-hdfs\src\main\proto
    在这里插入图片描述
  • BlockingService便是与namenode交互协议的实现,将其交给NameNodePrcServer实现了对客户端使用该协议的监听,当有相关执行命令被监控到,通过协议版本信息可以适配到相应的BlockingService。

(3) HDFS API以及CLI的命令到NameNode的工作执行流程

在这里插入图片描述

  • 为了能够准确的监听与处理客户端的命令,NameNode创建了四种独立的角色,并发执行,Listener、Responder、Reader、Handler,其中Listener、Responder、Reader都是Selector。
    • Listener负责监听连接,并创建channel将其引用放置到channel队列。
    • Reader负责监听channel队列中发送的ON_READ事件并进行数据的保存、协议的解析,然后创建Call对象,并置于Call队列当中。
    • Handler负责处理Call队列,根据Call拿到具体的协议的实现,调用FSNamesystem进行具体的命令,比如mkdir,rename等命令都是在该阶段进行创建的。
    • Responder负责Handler处理之后结果的响应。

(4) 执行命令的参数流动

客户端请求执行命令 —> Reader —> Call —> ClientNamenodeProtocolTranslatorPB(implements ProtocolMetaInterface, ClientProtocol, Closeable, ProtocolTranslator)
—> ClientNamenodeProtocolServerSideTranslatorPB(implements
ClientNamenodeProtocolPB).mkdirs() —> NameNodeRpcServer(implements ClientProtocol).mkdirs() —> FSNamesystem.mkdirs() —> FSDirMkdirOp
.mkdirs()

更多推荐

分布式ETL工具Sqoop实践

Mysql数据准备1、在node02节点登录Mysql。mysql-uroot-proot2、新建数据库testdb。createdatabasetestdb;3、新建数据表ts。usetestdb;createtablets(idint,namevarchar(10),ageint,sexchar(1));4、向表中

hive中的索引

使用索引前的配置在使用Hive索引之前,需要进行一些配置,以确保索引能够正常工作。以下是一些常见的配置步骤:Hive配置在Hive中启用索引功能,需要在Hive配置文件(hive-site.xml)中设置以下属性:<property><name>hive.index.compact.file.uris</name><v

【日记】文章更新计划

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top文章最后有详细的更新计划{%timeline2023,pink%}第一版发布【完结~开发规范系列】Linux系列重新定位,不再只是简单的说常用命令周二rocketmq更换为nginx系列微服务内容变

好用的一站式MES系统有哪些?全面管理生产流程,实现工厂数字化转型

在现代制造业中,MES制造执行系统已经成为了不可或缺的信息化工具。它为企业建立了规范化、集成化的生产信息管理平台,通过集成管理思想,帮助企业优化流程管控、数字化生产车间,从而显著提升了生产效率。那么,MES系统到底可以为企业解决哪些问题呢?2023年制造工厂生产管理现状信息化现状:许多企业使用ERP系统来管理业务流程,

操作系统权限提升(二十七)之数据库提权-MySQL MOF提权

MySQLMOF提权MOF介绍mof是windows系统的一个“托管对象格式”文件(位置:C:/windows/system32/wbem/mof/),其作用是每隔五秒就会去监控进程创建和死亡,mof目录下有两个文件夹(good与bad)。Windowsserver2003及以下系统每5秒会执行一次mof目录下的文件,

百度SEO不稳定的原因及解决方法(百度SEO不稳定因素的5大包括)

百度SEO优化不稳定介绍:蘑菇号-www.mooogu.cn随着百度SEO算法的不断变化和升级,许多网站的SEO排名经常出现不稳定的情况,这种情况在一定程度上影响了网站的流量和排名,导致网站的质量评分降低。因此,深入分析百度SEO不稳定的原因和解决方法非常必要。百度SEO不稳定因素的5大包括:1.网站内容和质量不佳,没

day06_Java中的流程控制语句

流程控制简单来讲所谓流程就是完成一件事情的多个步骤组合起来就叫做一个流程。在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。流程控制语句分为:顺序结构丶分支结构(if,switch)丶循环结构(for,whi

SpringMvc决战-【SpringMVC之自定义注解】

目录一、前言1.1.什么是注解1.2.注解的用处1.3.注解的原理二.注解父类1.注解包括那些2.JDK基本注解3.JDK元注解4.自定义注解5.如何使用自定义注解(包括:注解标记【没有任何东西】,元数据注解)?三.实例展示1.案例一(获取类与方法上的注解值)1.1导入一个类用于创造实例1.2导入三个注解1.3导入测试

CSAPP的Lab学习——CacheLab

文章目录前言一、A部分:编写一个高速缓存模拟器构造高速缓冲行结构仿写主函数,使用getopt()函数分配空间并释放读取给的trace文件模拟cache行为二、B部分:优化矩阵转置32*32矩阵转置64*64矩阵转置61*67矩阵转置总结前言一个本硕双非的小菜鸡,备战24年秋招。刚刚看完CSAPP,真是一本神书啊!遂尝试

MyBatis友人帐之ResultMap及分页

一、ResultMap1.1查询为null问题要解决的问题:属性名和字段名不一致解决方案方案一:为列名指定别名,别名和java实体类的属性名一致.<selectid="selectUserById"resultType="User">selectid,name,pwdaspasswordfromuserwhereid=

OpenCV自学笔记十七:傅里叶变换

1、Numpy实现傅里叶变换傅里叶变换(FourierTransform)是一种将信号从时域转换到频域的数学变换。它将一个连续或离散的时域信号分解为一组正弦和余弦函数的复合。在Python中,可以使用NumPy库来实现傅里叶变换。具体步骤如下:1.导入NumPy库:importnumpyasnp2.准备输入信号数据,可

热文推荐