【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 here
      INodeDirectory parentDir = (INodeDirectory)curNode;
      curNode = parentDir.getChildINode(components[count + 1]);
      count += 1;
      index += 1;
    }
    return count;
  }

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

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



### 回答1: 这个错误提示是因为在当前环境中没有安装或配置Hadoop,或者没有将Hadoop的bin目录添加到系统的PATH环境变量中。请先确保已经正确安装和配置了Hadoop,并且在执行命令前将Hadoop的bin目录添加到系统的PATH环境变量中。 ### 回答2: HDFS是Hadoop分布式文件系统的缩写,是Hadoop最核心的部分,是一种分布式文件系统,能够存储和处理大规模数据集。Hadoop分布式文件系统由一个NameNode和多个DataNode组成,其中NameNode负责管理文件系统的命空间、文件系统的元数据、DataNode的管理,而DataNode就负责管理文件存储等具体工作。 在使用HDFS过程中,有时候我们需要重置或格式化NameNode上的元数据,以便重新启动HDFS并重新开始工作。这时候,我们可以使用HDFS的命令"hdfs namenode -format",但是有时候会遇到"hdfs namenode -format"未找到命令的情况,这是由于系统环境变量中没有配置Hadoop的路径或者安装的Hadoop版本与使用的命令不兼容。 解决这个问题的方法有: 1.检查Hadoop是否正确安装,并检查路径是否正确配置。 在使用"hdfs namenode -format"命令之前,需要检查本地环境是否已经安装了Hadoop,并且Hadoop的路径是否已经被正确配置。可以使用以下命令通过检查环境变量来验证是否正确安装并配置了Hadoop。 echo $PATH echo $HADOOP_HOME 如果这两个命令都输出了Hadoop的路径,则表示Hadoop已经安装并且路径已经被正确配置,可以尝试重新使用"hdfs namenode -format"命令。 2.检查使用的Hadoop版本是否与使用的命令兼容。 如果在使用"hdfs namenode -format"命令时提示“未找到命令”的错误,还需要检查使用的Hadoop版本是否与使用的命令兼容。有时候,命令只能与特定版本的Hadoop兼容,如果使用的版本不兼容,将会出现"未找到命令"的错误。 重新查看所使用的Hadoop版本,并检查以前安装的版本是否已完全删除,以确保版本兼容性。 总之,如果遇到了"hdfs namenode -format未找到命令"的问题,需要检查Hadoop是否已经正确安装且路径配置正确,以及使用的版本是否与使用的命令兼容。只有当这些问题都得到解决,才能成功执行"hdfs namenode -format"命令。 ### 回答3: hdfs namenode -format是一条用于格式化HDFS (分布式文件系统)命节点的命令。这个命令在Hadoop 2.x及更高版本中依然存在,但是在早期版本中已经被弃用。 如果在执行该命令时出现“未找到命令”的错误,可能是由以下几个原因导致: 1. Hadoop未正确安装:如果Hadoop未正确安装,那么执行hdfs namenode -format命令时就会出现“未找到命令”的错误。这时需要检查Hadoop的安装位置和环境变量是否正确设置。 2. Hadoop版本过低:在早期版本的Hadoop中,hdfs namenode -format命令已经被弃用。如果您使用的是这些版本中的Hadoop,执行该命令时就会出现“未找到命令”的错误。这时,您需要升级到支持该命令的版本。 3. 拼写错误:在输入命令时,可能会出现打错字、大小写不正确等拼写错误,导致命令无法被正确识别。这时,需要检查输入的命令是否拼写正确。 总之,如果您遇到“未找到命令”的错误,需要首先检查Hadoop的安装和配置是否正确,然后再仔细检查命令的拼写和大小写,确保执行的命令是正确的。如果仍然无法解决问题,可以参考官方文档或者向社区寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值