hdfs mkdir递归建立目录背后的设计

我们都知道hdfs命令:hdfs fs -mkdir -p /xx1/xx2/xx3 可递归创建一个目录,简单的命令背后,hadoop源码是如何执行的呐?接下来一起领略一下hadoop的源码魅力。
接下来直接上mkdirs方法:

public boolean mkdirs(Path f) throws IOException{
		Path parent = f.getParent();  //获取f的父目录
		File p2f = pathToFile(f);  //将Path对象转化为File对象
		return (parent == null || mkdirs(parent) &&
		 (p2f.mkdir() || p2f.isDirectory()));
}

以上源码只有三行,通过这三行源码,想必读者已经感受到了接下来将会重点介绍最后一行的return设计。
当执行mkdirs()方法的return语句时,首先会执行 运算符&&的前半部分,parent == null || mkdirs(parent)是一个布尔表达式,当parent为空时,表达式parent == null || mkdirs(parent)已经为true,后半部分的mkdirs(parent)由于表达式短路求值,将不会被调用。所以,只有parent不为空,才会递归判断parent的parent。
如果父目录存在,则&&的前半部分为false,则后半部分不会被调用执行。&&后半部分也是一个布尔表达式,在父目录不存在的前提下(即&&前部分确定),执行p2f.mkdir()创建父目录,如果创建成功,则后半部分p2f.

### 在 HDFS 中创建多级目录的方法 在 HDFS 中,可以通过 Shell 命令或 Java API 创建多级目录。以下是详细说明: #### 使用 HDFS Shell 命令创建多级目录 HDFS 提供了 `-mkdir` 命令用于创建目录,并支持通过 `-p` 参数递归创建多级目录结构。例如,要创建路径 `/user/data/logs/2024/07/`,可以执行以下命令[^1]: ```bash hadoop fs -mkdir -p /user/data/logs/2024/07 ``` 此命令会自动创建路径中所需的全部父目录,包括 `/user`、`/user/data`、`/user/data/logs` 等。 #### 使用 Hadoop Java API 创建多级目录 通过 Hadoop 的 Java API,可以使用 `FileSystem` 类的 `mkdirs` 方法来创建多级目录。以下是一个示例代码[^2]: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class CreateMultiLevelDir { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://localhost:9000"); FileSystem fs = FileSystem.get(conf); Path path = new Path("/user/data/logs/2024/07"); boolean isCreated = fs.mkdirs(path); if (isCreated) { System.out.println("Directory created successfully."); } else { System.out.println("Directory creation failed or already exists."); } fs.close(); } } ``` 上述代码展示了如何通过 Hadoop Java API 创建多级目录,并处理可能的异常情况。 #### 其他方法:使用 FileContext 除了 `FileSystem` 类,还可以使用 `FileContext` 类来创建目录,并且允许控制是否创建父目录[^4]。以下是一个示例代码: ```java import org.apache.hadoop.fs.FileContext; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.Options.CreateOpts; public class CreateDirWithFileContext { public static void main(String[] args) throws Exception { FileContext fc = FileContext.getFileContext(); Path path = new Path("/user/data/logs/2024/07"); // 创建目录并指定是否创建父目录 fc.mkdir(path, null, true); System.out.println("Directory created successfully."); } } ``` ### 注意事项 - 如果需要为大量表创建对应的 HDFS 目录,可以编写脚本或程序批量生成这些目录。 - 在创建目录时,确保 HDFS 集群已启动,并且当前用户具有足够的权限操作目标路径[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值