HDFS命令与API

  • 前言
  • 命令
  • API


命令

创建一个目录

hdfs dfs -mkdir /usr

创建多层目录

hdfs dfs -mkdir -p /usr1/local

查看hdfs目录

hdfs dfs -ls /

上传文件到hdfs的某一个目录中,可上传目录

hdfs dfs -put file.txt /usr

查看此目录下的文件

hdfs dfs -ls /usr

下载文件到当前目录,后边可以跟路径指定下载到什么位置

hdfs dfs -get /usr/file.txt

查看文件内容

hdfs dfs -cat  /usr/file.txt

搜索文件

hdfs dfs -find / -name test.txt   # 精准查询文件
hdfs dfs -find / -name '*.txt'   # 模糊查询文件

修改hdfs中文件名,移动文件位置,复制文件

hdfs dfs -mv /usr/test.txt /usr/test1.txt   # 修改文件名
hdfs dfs -cp /usr/test1.txt /   # 复制文件到指定位置
hdfs dfs -mv /usr/test1.txt /usr1/test1.txt   # 移动文件

删除文件、目录

hdfs dfs -rm /usr/file.txt  # 文件 
hdfs dfs -rm -r /usr   # 目录

API

此处使用的是Java语言,导入maven依赖

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.2.3</version>
</dependency>

将Linux上安装的hdfs配置文件core-site.xml和hdfs-site.xml拿到Java程序的conf文件中

hdfs查找块的具体位置 hdfs查找文件位置_big data

HDFS连接

// true: 会加载上面的xml文件
Configuration configuration = new Configuration(true);
// 设置文件块的大小为1MB,看自己需要不设置使用默认128MB
configuration.set("dfs.blocksize","1048576");
// 此处要设置root,由于使用windows电脑用户名不是root在使用hdfs时会报用户错误
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"),configuration,"root");

查看文件状态

// 获取指定路径下文件的状态
	FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
	// 循环遍历
	for (FileStatus fileStatus : fileStatuses) {
	    System.out.println(fileStatus);
	}

创建目录,可创建多层

boolean flag = fileSystem.mkdirs(new Path("/a/b/c"));
	System.out.println(flag?"创建成功":"创建失败");

删除文件或者目录

// true: 可以删除非空目录   false: 只能删除文件或者空目录
	boolean delete = fileSystem.delete(new Path("/a"), true);
	System.out.println(delete?"删除成功":"删除失败");

上传文件

// 本地的输入流->hdfs文件系统的输出流
	FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/usr/local/hadoop/redis1.tar.gz"));
	// 创建本地的输入流,用来读取本地磁盘的文件
	FileInputStream fileInputStream = new FileInputStream(new File("D:\\redis-7.0.0.tar.gz"));
	// 使用hadoop的工具类,第一位输入流,第二位输出流,第三位为缓冲区大小,第四位是否关闭
	IOUtils.copyBytes(fileInputStream, fsDataOutputStream,1024,true);

下载文件

// hdfs文件系统的输入流->本地输出流
	FSDataInputStream fsDataInputStream = fileSystem.open(new Path("/usr/local/hadoop/redis1.tar.gz"));
	// 创建本地的输出流
	FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\redis1.tar.gz"));
	// 对接两个流
	IOUtils.copyBytes(fsDataInputStream, fileOutputStream,1024,true);

获取所有文件块的所有信息

// 获取文件信息
	FileStatus fileStatus = fileSystem.getFileStatus(new Path("/usr/local/hadoop/redis2.tar.gz"));
	// 获取fileStatus对应文件的所有块的信息
	BlockLocation[] fileBlockLocations = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
	// 遍历
	for (BlockLocation blockLocation : fileBlockLocations) {
	    System.out.println(blockLocation);
	}

关闭HDFS连接

fileSystem.close();