【HDFS】namenode如何根据输入的文件(路径)名找到对应的inode的?

2024-04-21 08:38

本文主要是介绍【HDFS】namenode如何根据输入的文件(路径)名找到对应的inode的?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家都用过 hadoop dfs -ls/rmr/rm/get/put/cat等命令,后面跟的都是一个字符串形式的文件绝对路径/a/b/c/d这样的玩意,那么namenode如何根据你输入的/a/b/c/d这样字符串格式的东西找到对应的文件呢?


我们都知道文件对应的inodefile,目录对应inodeDirectory,它们都是inode,

abstract class INode implements Comparable<byte[]> {protected byte[] name;protected INodeDirectory parent;

从inode的代码片段可以看出来,inode使用Byte数组保存文件名,因此,字符串往Byte数组转化,比较,适配等就是需要解决的问题。


  INode[] getExistingPathINodes(String path) {byte[][] components = getPathComponents(path);INode[] inodes = new INode[components.length];this.getExistingPathINodes(components, inodes);return inodes;}
INodeDirectory提供了上面的方法。先来看看getPathComponents方法:

  static String[] getPathNames(String path) {if (path == null || !path.startsWith(Path.SEPARATOR)) {return null;}return path.split(Path.SEPARATOR);}
1、看上面,先将你给我的路径字符串切割,即取出"/"中间的各个字符串,得到这些字符串的数组,例如/aa/bb/cc/dd这样的,将得到{aa,bb,cc,dd}

  static byte[][] getPathComponents(String[] strings) {if (strings.length == 0) {return new byte[][]{null};}byte[][] bytes = new byte[strings.length][];for (int i = 0; i < strings.length; i++)bytes[i] = DFSUtil.string2Bytes(strings[i]);return bytes;}

2、看上面,第1步得到文件路径的字符串数组后,交给getPathComponents方法加工成byte二维数组,很好理解是吧,比如/aa/bb/cc/dd,就变化出4个byte数组嘛,就是2x*结构的byte数组。每个byte数组就是那一个字符串转换得来的啊。

再看刚才的getExistingPathINodes方法

  INode[] getExistingPathINodes(String path) {
    byte[][] components = getPathComponents(path);INode[] inodes = new INode[components.length];
//路径分割出几个字符串就是几个inode嘛,擦this.getExistingPathINodes(components, inodes);return inodes;}

继续看

  int getExistingPathINodes(byte[][] components, INode[] existing) {assert compareBytes(this.name, components[0]) == 0 :"Incorrect name " + getLocalName() + " expected " + components[0];
//首先必须要找到第一层目录的inode(inodeDirectory)去往下找,要不然找个屁啊!谁调用的这个方法?就是rootDir嘛,擦,rootDir就是	FSDirectory的一个final变量//,所以找文件都是从根root开始往下找INode curNode = this;int count = 0;int index = existing.length - components.length;
    if (index > 0)index = 0;// 先不管它,这里俩数组长度是相等的,因为existing的长度就是按照components的长度来的
    while ((count < components.length) && (curNode != null)) {if (index >= 0)existing[index] = curNode;if (!curNode.isDirectory() || (count == components.length - 1))break; // no more child, stop hereINodeDirectory parentDir = (INodeDirectory)curNode;curNode = parentDir.getChildINode(components[count + 1]);count += 1;index += 1;}return count;}

这个东西是揪住第一层目录往下找,一直周到目标文件等深的地方,看看有几层目录到它那,并且在查找的过程中,就把每一层的inode找到了,并且放到一个inode数组里供别人取用。

小结一下就是,要对文件进行操作,必须先找到这个文件的inode,以及它往上追溯的所有inode,一直追到根,而追溯的具体执行过程恰巧相反,是通过根往下找,深度就是目标文件的深度,找的过程就是inode的name即一维byte数组的比较的过程。



这篇关于【HDFS】namenode如何根据输入的文件(路径)名找到对应的inode的?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922640

相关文章

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

mybatis的mapper对应的xml写法及配置详解

《mybatis的mapper对应的xml写法及配置详解》这篇文章给大家介绍mybatis的mapper对应的xml写法及配置详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录前置mapper 对应 XML 基础配置mapper 对应 xml 复杂配置Mapper 中的相

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1