HDFS的操作SHELL和API

本文详细介绍HDFS的Shell操作与Java API使用,包括查看文件系统信息、文件上传下载、创建删除文件等常见操作,并提供代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDFS的shell操作和JavaAPI的使用:

WEB

  • WEB端口50090查看SecondaryNameNode信息。可以查看Hadoop的版本,NameNode的IP,Checkpoint等信息。

FBatc4.md.png

  • WEB端口50070可以查看HDFS的信息和目录结构

    FBay9O.md.png

FBacge.png

SHELL

查看
1
2
3
4
hdfs dfs -ls [-d][-h][-R] <paths>
[-d]:返回path
[-h]:按照KMG数据大小单位显示文件大小,默认B
[-R]:级联显示paths下文件
创建文件夹
1
hdfs dfs -mkdir [-p]<paths>
新建文件
1
hdfs dfs -touchz<paths>
查看文件
1
2
3
hdfs dfs -cat/[-ignoreCrc] [src]
hdfs dfs -text -ignoreCrc /input/test #忽略校验
hdfs dfs -cat -ignoreCrc /input/test
追写文件
1
2
hdfs dfs --appendToFile <localsrc> <dst>
如果localsrc为"-"表示数据来自键盘输入用"Ctrc+C"取消输入
上传下载
1
2
hdfs dfs -put [-f][-p]<localsrc> <dst>   # 上传到指定目录
hdfs dfs -get [-p]<src> <localhost> # 现在到本地
删除文件
1
2
3
hdfs dfs -rm [-f] [-r] <src>
-f 如果要删除的文件不存在,不显示错误信息
-r/R 级联删除目录下所有文件和子目录文件
磁盘空间
1
2
3
hdfs dfs -du[-s][-h]<path>
[-s]显示指定目录所占空间大小
[-h]按照K M G 数据显示文件大小

JAVA API

步骤

  1. 实例化Configuration

Configuration封装了客户端或服务器的配置,Confiuration实例会自动加载HDFS的配置文件core-site.xml,从中获取Hadoop集群中的配置信息。因此我们要把集群的配置core-site.xml放在Maven项目的resources目录下。

1
Configuration conf = new Configuration();
  1. 实例化FileSystem

FileSystem类是客户端访问文件系统的入口,是一个抽象的文件系统。DistributedFileSystem类是FileSystem的一个具体实现。实例化FileSystem并发挥默认的文件系统代码如下:

1
FileSystem fs = FileSystem.get(conf);
  1. 设置目标对象的路径

HDFS API 提供了Path类来封装文件路径。PATH类位于org.apache.hadoop.fs.Path包中,代码如下:

1
Path path = new Path("/input/write.txt");

执行文件操作

得到Filesystem实例后,就可以使用该实例提供的方法成员执行相应的操作。如果:打开文件,创建文件、重命名文件、删除文件。

​ FileSystem类常用成员函数

方法名称及参数返回值功能
create(Path f)FSDataOutputStream创建一个文件
open(Path f)FSDatatInputStream打开指定的文件
delete(Path f)boolean删除指定文件
exsits(Path f)boolean检查文件是否存在
getBlockSize(Path f)long返回指定的数据块的大小
getLength(Path f)long返回文件长度
mkdir(Path f)boolean检查文件是否存在
copyFromLocalFile(Path src, Path dst)void从本地磁盘复制文件到HDFS
copyToLocalFile(Path src, Path dst)void从HDFS复制文件到本地磁盘
………..……….…………….
上传文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;


public class PutFile {
public static void main(String[] args) throws Exception {

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create("hdfs://datanode1:9000"),conf,"hadoop");

//本地文件
Path src = new Path("D:\\上传文件.txt");

//HDFS 路径
Path dst = new Path("/input/上传文件.txt");

fs.copyFromLocalFile(src, dst);
fs.close();
System.out.println("文件上传成功");
}
}
创建文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;

public class CreateFile {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create("hdfs://datanode1:9000"), conf, "hadoop");
Path dfs = new Path("/input/上传文件.txt");
FSDataOutputStream newFile = fs.create(dfs, true); //是否覆盖文件 true 覆盖 false 追加
newFile.writeBytes("this is a create file tes");
System.out.println("创建文件成功");

}
}
文件详情
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SeeInfo {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create("hdfs://datanode1:9000"), conf, "hadoop");

// HDFS文件
Path fpath = new Path("/input/上传文件.txt");

FileStatus fileLinkStatus = fs.getFileLinkStatus(fpath);
//获得块大小
long blockSize = fileLinkStatus.getBlockSize();
System.out.println("blocksize: " + blockSize);

//获得文件大小
long len = fileLinkStatus.getLen();
System.out.println("Filesize: " + len);

//获得文件所有者
String owner = fileLinkStatus.getOwner();
System.out.println("FileOwner: " + owner);

//获得创建时间
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
long accessTime = fileLinkStatus.getAccessTime();
System.out.println("access time: " + formater.format(new Date(accessTime)));

//获得修改时间
long modificationTime = fileLinkStatus.getModificationTime();
System.out.println("modify time: " + formater.format(new Date(modificationTime)));

}
}

FBsDLF.png

下载文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

public class GetFIle {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create("hdfs://datanode1:9000"), conf, "hadoop");
// HDFS 文件
InputStream in = fs.open(new Path("/input/上传文件.txt"));

//保存到本地位置
OutputStream out = new FileOutputStream("D://下载文件.txt");
IOUtils.copyBytes(in, out, 4096, true);

System.out.println("下载文件成功");
fs.close();

}
}
删除文件
hdfs;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;

public class DeleteFile {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create("hdfs://datanode1:9000"), conf, "hadoop");

Path path = new Path("/input/上传文件.txt");
fs.delete(path);
System.out.println("删除成功");
}
}
### HDFS Shell 命令使用教程 HDFS Shell 提供了一系列命令来操作 Hadoop 文件系统 (HDFS),这些命令类似于 Linux 的 shell 命令。以下是常用的 HDFS Shell 命令及其功能: #### 1. 查看文件列表 `hdfs dfs -ls <path>` 此命令用于列出指定路径下的文件目录[^1]。 #### 2. 创建目录 `hdfs dfs -mkdir [-p] <paths>` 创建一个新目录,如果加上 `-p` 参数,则会递归创建父级目录。 #### 3. 删除文件/目录 `hdfs dfs -rm [-r] <file>` 删除文件或目录,若要强制删除非空目录需加参数 `-r` 表示递归删除[^1]。 #### 4. 上载本地文件到 HDFS `hdfs dfs -put <localsrc> ... <dst>` 将本地文件上传至 HDFS 中的目标位置[^1]。 #### 5. 下载 HDFS 文件到本地 `hdfs dfs -get <src> <localdst>` 从 HDFS 下载文件并保存到本地磁盘中[^1]。 #### 6. 显示文件内容 `hdfs dfs -cat <src>` 显示 HDFS 文件的内容[^1]。 --- ### Java API 操作示例代码 除了通过 Shell 命令操作 HDFS 外,还可以利用 Java API 编程现更复杂的逻辑控制。下面是一个简单的例子展示如何连接 HDFS 并完成基本的读写操作。 #### 连接配置与初始化 ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HDFSDemo { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://namenode:8020"); // 设置 NameNode 地址 FileSystem fs = FileSystem.get(conf); // 取文件系统对象 } } ``` 以上代码片段展示了如何设置 `Configuration` 对象以及取 `FileSystem` 例[^2]。 #### 写入文件到 HDFS ```java import java.io.OutputStream; // 继续之前的代码... Path dst = new Path("/example/output.txt"); OutputStream os = fs.create(dst, true); os.write("Hello HDFS!".getBytes()); os.close(); ``` 该部分现了向 HDFS 写入字符串 “Hello HDFS!” 到 `/example/output.txt` 路径下。 #### 从 HDFS 读取文件 ```java import java.io.InputStream; // 继续之前的代码... Path src = new Path("/example/input.txt"); InputStream is = fs.open(src); byte[] buffer = new byte[1024]; int bytesRead = is.read(buffer); System.out.println(new String(buffer, 0, bytesRead)); is.close(); ``` 这里演示了如何从 HDFS 加载文件内容并通过标准输出打印出来[^2]。 #### 关闭资源 无论何结束程序运行前都应记得释放所占用的所有外部资源: ```java if (fs != null) { fs.close(); // 确保关闭 FileSytem 避免内存泄漏等问题发生 } ``` --- ### 总结 无论是采用 HDFS Shell 方式还是基于 Java API 开发应用软件,都可以高效便捷地管理维护海量数据集。前者适合快速测试验证想法;后者则更适合构建自动化流程或者集成第三方服务场景之中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值