【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

相关文章

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

图的最短路径算法——《啊哈!算法》

图的实现方式 邻接矩阵法 int[][] map;// 图的邻接矩阵存储法map = new int[5][5];map[0] = new int[] {0, 1, 2, 3, 4};map[1] = new int[] {1, 0, 2, 6, 4};map[2] = new int[] {2, 999, 0, 3, 999};map[3] = new int[] {3, 7