目录
- HDFS介绍
- HDFS基础操作
- Java操作HDFS
HDFS介绍
- HDFS 是一种允许文件通过网络在多台主机上分享的文件系统,可以让多台机器上的多个用户分享文件和存储空间。
- 分布式文件管理系统有很多,HDFS 只是其中一种实现
- 注意:HDFS 不适合存储小文件(几KB或几M的小文件)
HDFS基础操作
-
操作格式
hdfs dfs -xxx schema: // authority / path
-xxx : 命令(读、写、创建、查看等)
schema :hdfs
authority :地址+端口(bigdata01:9000)
path :路径 -
上传文件
# 上传 NOTICE.txt 文件至根路径
hdfs dfs -put NOTICE.txt hdfs://bigdata01:9000/
- 查看指定路径信息
# 查看根目录下信息
hdfs dfs -ls hdfs://bigdata01:9000/
# 查看根目录多级文件及目录信息
hdfs dfs -ls -R hdfs://bigdata01:9000/
4. 查看 HDFS 文件内容
# 查看 NOTICE.txt 文件内容
hdfs dfs -cat hdfs://bigdata01:9000/NOTICE.txt
- 下载文件到本地
# 下载 NOTICE.txt 文件至本地当前目录下
hdfs dfs -get hdfs://bigdata01:9000/NOTICE.txt .
# 下载 NOTICE.txt 文件至本地上一层目录下
hdfs dfs -get hdfs://bigdata01:9000/NOTICE.txt ../
# 下载 NOTICE.txt 文件至本地当前目录下并指定新文件名
hdfs dfs -get hdfs://bigdata01:9000/NOTICE.txt NOTICE.txt.bak
6. 创建目录
# 在根目录下创建 test 目录
hdfs dfs -mkdir hdfs://bigdata01:9000/test
# 递归创建多级目录
hdfs dfs -mkdir -p hdfs://bigdata01:9000/abc/xyz
- 删除文件及目录
# 删除 NOTICE.txt 文件
hdfs dfs -rm hdfs://bigdata01:9000/NOTICE.txt
# 删除 NOTICE.txt 文件
hdfs dfs -rm -r hdfs://bigdata01:9000/abc
8. 统计目录下文件数量
# 统计根目录下文件数量
hdfs dfs -ls hdfs://bigdata01:9000/
9. 统计目录下文件大小
# 统计根目录下文件大小
hdfs dfs -ls hdfs://bigdata01:9000/ | grep / | awk -F ' ' '{print $8,$5}'
Java操作HDFS
- 由于操作 HDFS 会进行用户验证,配置不进行验证
# 停止服务
stop-all.sh
# 打开配置文件 hdfs-site.xml
vi /usr/local/hadoop-3.2.0/etc/hadoop/hdfs-site.xml
# 添加如下属性
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
# 启动服务
start-all.sh
# 查看进程是否正确
jps
- Maven 项目进入依赖
<!-- 引入 hadoop-3.2.0 依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>
- 写如下测试代码
package com.july.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.*;
/**
* @Auther: july
* @Date: 2022-02-19 - 18:29
* @Description: 对 hadoop3.2.0 HDFS 上传文件、下载文件、删除文件操作
* @version: 1.0
*/
public class HdfsDemo {
public static void main(String[] args) throws IOException {
// 创建一个配置对象
Configuration conf = new Configuration();
// 指定 HDFS 地址
conf.set("fs.defaultFS", "hdfs://192.168.30.128:9000");
// 获取操作 HDFS 的对象
FileSystem fileSystem = FileSystem.get(conf);
// 上传文件
//new HdfsDemo().uploadFile(fileSystem);
// 下载文件
//new HdfsDemo().downloadFile(fileSystem);
// 删除文件或目录
new HdfsDemo().deleteFile(fileSystem);
}
// 删除文件
public void deleteFile(FileSystem fileSystem) {
try {
// 删除指定的文件或目录,当删除目录时第二个参数设置为 true 为递归删除
boolean result = fileSystem.delete(new Path("/test.txt"), true);
System.out.println( result ? "删除成功" : "删除失败");
} catch (IOException e) {
e.printStackTrace();
}
}
// 下载文件
public void downloadFile(FileSystem fileSystem) {
OutputStream outputStream;
FSDataInputStream fsDataInputStream;
try {
// 本地文件输出流
outputStream = new FileOutputStream("D:\\NOTICE.txt");
// 获取 HDFS 文件系统的输入流
fsDataInputStream = fileSystem.open(new Path("/NOTICE.txt"));
// 下载文件,并自动关闭流
IOUtils.copyBytes(fsDataInputStream, outputStream, 1024, true);
} catch (Exception e) {
e.printStackTrace();
}
}
// 上传文件
public void uploadFile(FileSystem fileSystem) {
InputStream inputStream;
FSDataOutputStream fsDataOutputStream;
try {
// 本地文件输入流
inputStream = new FileInputStream("C:\\test.log");
// 获取 HDFS 文件系统的输出流
fsDataOutputStream = fileSystem.create(new Path("/test.log"));
// 上传文件,并自动关闭流
IOUtils.copyBytes(inputStream, fsDataOutputStream, 1024, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}