本习题旨在全面评估学生对 HDFS 常见操作的掌握程度,包括命令行操作和 Java SDK 编程。习题分为两个部分,每部分都有明确的评分标准和完成要求。
- Hadoop 3.3.x 单节点伪分布式集群
- Java 8 或更高版本
- Maven 3.6 或更高版本
- 充足的磁盘空间(至少 2GB 可用空间)
- NameNode Web UI 可访问(http://localhost:9870/)
任务描述:使用 HDFS 命令行工具完成以下操作,并通过 NameNode Web UI 确认结果
# 要求:创建以下目录结构
# /user/student/project/
# ├── input/
# ├── output/
# └── temp/
# 请在此处填写您的命令:
# 命令 1:
# 命令 2:
# 命令 3:Web UI 验证要求:
- 在 NameNode Web UI 中确认目录结构创建成功
# 要求:
# 1. 在本地创建一个测试文件 test.txt(包含至少 100 行数据)
# 2. 上传到 /user/student/project/input/ 目录
# 3. 查看文件内容的前 10 行和后 10 行
# 4. 查看文件的详细属性信息
# 请在此处填写您的命令:
# 本地文件创建:
# 文件上传:
# 查看文件头部:
# 查看文件尾部:
# 查看文件属性:Web UI 验证要求:
- 在 Web UI 中确认文件上传成功
# 要求:
# 1. 将 input 目录中的文件复制到 temp 目录
# 2. 修改 temp 目录中文件的权限为 644
# 3. 修改 temp 目录的权限为 755
# 4. 验证权限设置是否正确
# 请在此处填写您的命令:
# 文件复制:
# 文件权限修改:
# 目录权限修改:
# 权限验证:Web UI 验证要求:
- 在 Web UI 中确认文件复制和权限设置成功
任务描述:使用 HDFS 命令行工具完成批量文件操作。
# 要求:
# 1. 在本地创建 5 个不同的文件(file1.txt 到 file5.txt)
# 2. 批量上传这些文件到 /user/student/project/input/
# 3. 使用通配符验证所有文件都已上传成功
# 请在此处填写您的命令:
# 批量文件创建:
# 批量上传:
# 验证上传结果:Web UI 验证要求:
- 在 Web UI 中确认所有文件都已批量上传成功
# 要求:
# 1. 使用通配符列出所有 .txt 文件
# 2. 使用通配符复制所有以 "file" 开头的文件到 temp 目录
# 3. 统计 input 目录中文件的总数量
# 请在此处填写您的命令:
# 通配符列出文件:
# 通配符复制文件:
# 统计文件数量:Web UI 验证要求:
- 在 Web UI 中确认通配符操作结果正确
# 要求:
# 1. 创建一个备份目录 /user/student/backup/
# 2. 将整个 project 目录复制到 backup 目录
# 3. 删除 temp 目录中的所有文件(保留目录)
# 4. 验证操作结果
# 请在此处填写您的命令:
# 创建备份目录:
# 复制整个目录:
# 清理 temp 目录:
# 验证结果:Web UI 验证要求:
- 在 Web UI 中确认备份和清理操作成功
任务描述:使用 Java SDK 开发一个 HDFS 文件管理器,实现基本的文件操作功能,并通过 Web UI 验证程序执行效果。
开发一个名为 HDFSFileManager 的 Java 类,实现以下功能:
- 连接管理:建立和关闭 HDFS 连接
- 文件上传:将本地文件上传到 HDFS
- 文件下载:从 HDFS 下载文件到本地
- 文件删除:删除 HDFS 中的文件或目录
- 目录遍历:递归列出目录中的所有文件和子目录
- 目录统计:统计目录中的文件数量、目录数量和总大小
package com.bigdata.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.URI;
/**
* HDFS 文件管理器
* 提供基本的 HDFS 文件操作功能
*/
public class HDFSFileManager {
private static final Logger logger = LoggerFactory.getLogger(HDFSFileManager.class);
private FileSystem fileSystem;
private Configuration configuration;
/**
* 构造函数,初始化 HDFS 连接
* @param hdfsUri HDFS 的 URI,例如 "hdfs://localhost:9000"
*/
public HDFSFileManager(String hdfsUri) throws IOException {
// TODO: 实现构造函数
// 1. 创建 Configuration 对象
// 2. 设置 HDFS URI
// 3. 获取 FileSystem 实例
}
/**
* 上传本地文件到 HDFS
* @param localPath 本地文件路径
* @param hdfsPath HDFS 目标路径
* @param overwrite 是否覆盖已存在的文件
* @return 上传是否成功
*/
public boolean uploadFile(String localPath, String hdfsPath, boolean overwrite) {
// TODO: 实现文件上传功能
// 1. 检查本地文件是否存在
// 2. 创建 HDFS 目标目录(如果不存在)
// 3. 执行文件上传
// 4. 处理异常情况
return false;
}
/**
* 从 HDFS 下载文件到本地
* @param hdfsPath HDFS 文件路径
* @param localPath 本地目标路径
* @param overwrite 是否覆盖已存在的文件
* @return 下载是否成功
*/
public boolean downloadFile(String hdfsPath, String localPath, boolean overwrite) {
// TODO: 实现文件下载功能
return false;
}
/**
* 删除 HDFS 中的文件或目录
* @param hdfsPath HDFS 路径
* @param recursive 是否递归删除(用于目录)
* @return 删除是否成功
*/
public boolean deleteFile(String hdfsPath, boolean recursive) {
// TODO: 实现文件删除功能
return false;
}
/**
* 递归列出目录中的所有文件和子目录
* @param hdfsPath HDFS 目录路径
* @param depth 当前递归深度(用于格式化输出)
*/
public void listDirectory(String hdfsPath, int depth) {
// TODO: 实现目录遍历功能
// 1. 检查路径是否存在
// 2. 获取目录内容
// 3. 递归处理子目录
// 4. 格式化输出结果
}
/**
* 统计目录信息
* @param hdfsPath HDFS 目录路径
* @return DirectoryStats 对象,包含统计信息
*/
public DirectoryStats getDirectoryStats(String hdfsPath) {
// TODO: 实现目录统计功能
return null;
}
/**
* 关闭 HDFS 连接
*/
public void close() {
// TODO: 实现资源清理
}
/**
* 目录统计信息类
*/
public static class DirectoryStats {
private long fileCount;
private long directoryCount;
private long totalSize;
// TODO: 实现构造函数、getter 和 toString 方法
}
/**
* 主方法,用于测试 HDFS 文件管理器
*/
public static void main(String[] args) {
HDFSFileManager manager = null;
try {
// TODO: 实现完整的测试流程
// 1. 创建 HDFSFileManager 实例
// 2. 测试文件上传功能
// 3. 测试目录遍历功能
// 4. 测试文件下载功能
// 5. 测试目录统计功能
// 6. 测试文件删除功能
} catch (Exception e) {
logger.error("程序执行出错", e);
} finally {
if (manager != null) {
manager.close();
}
}
}
}创建 pom.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bigdata</groupId>
<artifactId>hdfs-file-manager</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<hadoop.version>3.4.2</hadoop.version>
</properties>
<dependencies>
<!-- Hadoop Client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- SLF4J Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
</project>- 在 NameNode Web UI 中确认程序执行的主要操作结果(如文件上传、目录创建等)
-
第一部分:命令执行
- 主要命令的执行截图
- 简单的 Web UI 验证截图(可选)
-
第二部分:Java HDFS 操作
- 完整的 Java 项目文件
- 程序运行截图和输出结果
- 邮件标题: "2025 大数据理论与实践-学号-姓名-练习一";
- 邮箱地址:
grissom.wang@transwarp.io; - 邮件附件是
学号-practise1的压缩包- 文件夹:
学号-practise1; - 按部分组织子文件夹:
part1、part2; - 包含一个总体的
README.md文件,说明完成情况和遇到的问题;
- 文件夹: