P2 - HDFS 实战

2025-02-13
8分钟阅读时长

【版本】

当前版本号v20250213

版本修改说明
v20250213初始化版本

任务2.1 通过 Shell 命令访问和管理 HDFS

【任务目的】

  • 掌握 Web Console 访问 HDFS。
  • 掌握常用的 Shell 命令访问 HDFS。

【任务环境】

  • 内存:至少4G
  • 硬盘:至少空余40G
  • 操作系统: CentOS 7.9

【任务资源】

  • FinalShell
  • VirtualBox
  • Hadoop 完全分布式环境

【任务内容】

  • 使用 HDFS 的相关命令完成相关要求

【任务参考】

  • hdfs dfs 操作命令
hadoop fs [generic options]
	[-appendToFile <localsrc> ... <dst>]
	[-cat [-ignoreCrc] <src> ...]
	[-checksum <src> ...]
	[-chgrp [-R] GROUP PATH...]
	[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
	[-chown [-R] [OWNER][:[GROUP]] PATH...]
	[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
	[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
	[-count [-q] [-h] <path> ...]
	[-cp [-f] [-p | -p[topax]] <src> ... <dst>]
	[-createSnapshot <snapshotDir> [<snapshotName>]]
	[-deleteSnapshot <snapshotDir> <snapshotName>]
	[-df [-h] [<path> ...]]
	[-du [-s] [-h] <path> ...]
	[-expunge]
	[-find <path> ... <expression> ...]
	[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
	[-getfacl [-R] <path>]
	[-getfattr [-R] {-n name | -d} [-e en] <path>]
	[-getmerge [-nl] <src> <localdst>]
	[-help [cmd ...]]
	[-ls [-d] [-h] [-R] [<path> ...]]
	[-mkdir [-p] <path> ...]
	[-moveFromLocal <localsrc> ... <dst>]
	[-moveToLocal <src> <localdst>]
	[-mv <src> ... <dst>]
	[-put [-f] [-p] [-l] <localsrc> ... <dst>]
	[-renameSnapshot <snapshotDir> <oldName> <newName>]
	[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
	[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
	[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
	[-setfattr {-n name [-v value] | -x name} <path>]
	[-setrep [-R] [-w] <rep> <path> ...]
	[-stat [format] <path> ...]
	[-tail [-f] <file>]
	[-test -[defsz] <path>]
	[-text [-ignoreCrc] <src> ...]
	[-touchz <path> ...]
	[-truncate [-w] <length> <path> ...]
	[-usage [cmd ...]]
  • HDFS 安全模式操作
enter - 进入安全模式
leave - 强制NameNode离开安全模式
get   - 返回安全模式是否开启的信息
wait  - 等待,一直到安全模式结束。
  • HDFS 开启关闭快照功能
#在某个目录开启快照功能
hdfs dfsadmin -allowSnapshot <snapshotDir>
#在某个目录关闭快照功能
hdfs dfsadmin -disallowSnapshot <snapshotDir>
  • HDFS 操作快照功能
#创建快照
hdfs dfs -createSnapshot <snapshotDir> [<snapshotName>]
#删除快照
hdfs dfs -deleteSnapshot <snapshotDir> <snapshotName>
#重命名快照
hdfs dfs -renameSnapshot <snapshotDir> <oldName> <newName>
  • 文件目录数量配额(Quota) setQuota指的是对HDFS中某个目录设置文件和目录数量之和的最大值。
hdfs dfsadmin -setQuota <quota> <dirname>...<dirname>
  • 空间配额(SpaceQuota) setSpaceQuota针对的是设置HDFS中某个目录可用存储空间大小,单位是byte。在使用该命令的时候最好设置空间大小为数据块(默认128MB)的整数倍。
hdfs dfsadmin -setSpaceQuota <quota> <dirname>...<dirname>
  • 报告文件系统的基本信息和统计信息
hdfs dfsadmin -report
  • 查看拓扑
hdfs dfsadmin -printTopology

【任务步骤】

  1. 启动NodeA、NodeB、NodeC3个节点的虚拟机,使用hadoop用户登录 NodeA,启动 Hadoop。
start-hdp.sh

HDFS 机架拓扑

  1. 查看 HDFS 的机架拓扑。
hdfs dfsadmin -printTopology
  1. 查看 put 命令的使用方法和参数
hdfs dfs -help put

HDFS 文件操作

  1. 在用户目录下创建一个文本文件。注意替换为你的学号。
cd ~
echo "uploaded by 你的学号后4位" >uploader.txt
ls
  1. 使用hdfs dfs -put命令上传本地~/uploader.txt文件到 HDFS 的根目录/下。

HDFS 文件目录操作

  1. 查看hdfs dfs -mkdir的用法,并在 HDFS 上创建/poetry文件夹。

  2. 从实验资源下载haizi1.txt到本地~目录。

  3. 使用hdfs dfs -moveFromLocal或者hdfs dfs -put命令,上传haizi1.txt到 HDFS 的/poetry目录下。

  4. 查看 HDFS 的/poetry目录,确认是否上传成功。

hdfs dfs -ls -h /poetry

HDFS 文件内容操作

  1. 使用hdfs dfs -cat命令输出HDFS 的/poetry/haizi1.txt文件的内容。

  2. 使用hdfs dfs -cp命令把 HDFS 的/poetry/haizi1.txt复制为/poetry/FacingTheSea.txt

  3. 使用hdfs dfs -checksum命令分别输出/poetry/haizi1.txt/poetry/FacingTheSea.txt。比较两者的校验码是否一致。

  4. 使用hdfs dfs -appendToFile命令把本地的~/uploader.txt的内容追加到 HDFS 的/poetry/FacingTheSea.txt

  5. 使用hdfs dfs -tail命令输出 HDFS 的/poetry/FacingTheSea.txt的内容。

  6. 使用hdfs dfs -rm命令移除 HDFS 的/poetry/haizi1.txt,并查看/poetry目录下的文件,确认是否删除成功。

  7. 使用hdfs dfs -mv命令移动 HDFS 的/poetry/FacingTheSea.txt到根目录下。

  8. 使用hdfs dfs -rmdir命令删除 HDFS 的/poetry目录。

  9. 使用hdfs dfs -find找出 HDFS 根目录下的所有.txt结尾的文件。

  10. 使用hdfs dfs -ls -R /列出 HDFS 根目录下的所有文件。

HDFS 安全模式操作

  1. 使用命令让 HDFS 进入安全模式
hdfs dfsadmin -safemode enter
  1. 尝试创建一个文件,观察 HDFS 提示信息。
hdfs dfs -touchz /test.txt
  1. 获取安全模式的状态。
hdfs dfsadmin -safemode get
  1. 使用相应命令退出安全模式。

HDFS 快照操作

  1. 在 HDFS 创建目录/snapshot+你学号后3位,注意替换为你的学号。

  2. 在该目录上开启快照(snapshot)功能,注意替换为你的学号。

hdfs dfsadmin -allowSnapshot /snapshot+你学号后3位
  1. 上传本地的haizi1.txt文件到/snapshot+你学号后3位目录

  2. 创建名为v1的快照,注意替换为你的学号。

hdfs dfs -createSnapshot /snapshot+你学号后3位 v1
  1. 使用hdfs dfs -appendToFile把本地的haizi2.txt追加到/snapshot+你学号后3位/haizi1.txt文件。

  2. 使用diff命令对比快照修改前后的内容。

diff <(hdfs dfs -cat /snapshot+你学号后3位/.snapshot/v1/haizi1.txt) <(hdfs dfs -cat /snapshot+你学号后3位/haizi1.txt)

HDFS 容量操作

  1. 在 HDFS 上创建目录/quota+你学号后3位,注意替换为你的学号。

  2. 设置文件/目录数量配额为2,注意替换为你的学号。

hdfs dfsadmin -setQuota 2 /quota+你学号后3位
  1. 尝试在/quota+你学号后3位目录下创建2个文件,观察会有什么反馈消息。

任务2.2 通过编程接口访问和管理 HDFS

【任务目的】

  • 掌握如何使用 IDEA 创建 Maven 工程、运行 Maven 工程。
  • 掌握 HDFS 文件系统的 Java 编程接口的调用和编程

【任务环境】

  • Windows 7 以上64位操作系统
  • JDK 8
  • Maven 3
  • IDEA 社区版

【任务资源】

  • hadoop.dll

【任务内容】

  • 按要求使用 Java 编程实现访问 HDFS

【任务参考】

类 org.apache.hadoop.fs.FileSystem 的 参考文档

  • FileSystem.copyToLocalFile 方法用于从 HDFS 复制文件到本地文件系统。详细参考文档
/**
 * @Param src HDFS 文件路径
 * @Param dst 本地文件路径
 */
public void copyToLocalFile(Path src, Path dst) throws IOException
  • FileSystem.copyFromLocalFile 方法用于从本地文件系统复制文件到 HDFS。详细参考文档
/**
 * @Param src 本地文件路径
 * @Param dst HDFS 文件路径
 */
public void copyFromLocalFile(Path src, Path dst) throws IOException

【任务要求】

  1. 打开 Part 1 的 hadoop-exp 项目。

  2. 在项目hadoop-exp\src\main\java下创建一个名为hadoop+你学号后3位.hdfs的包。注意替换为你的学号后3位。

  3. 在包下面新建一个 HdfsUtils 的类。该类包含了一个在HDFS上创建文件并写入内容的方法createFile。代码如下,注意替换为你的学号后3位。

package hadoop你学号**后3位**.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.io.IOException;
import java.net.URI;

public class HdfsUtils {

    /**
     * 在HDFS上创建文件并写入内容
     * @param conf HDFS的配置
     * @param hdfsFilePath HDFS创建的文件的路径
     * @param content 写入文件的内容
     * @param overwrite true表示覆盖原文件,false表示不覆盖
     */
    public static boolean createFile(Configuration conf,URI uri,String hdfsFilePath,String content,boolean overwrite) {
        FileSystem fs=null;
        FSDataOutputStream os=null;
        boolean rs=false;
        try {
            // 指定用户名 , 获取 FileSystem 对象
            fs = FileSystem.get(uri, conf, "hadoop");
            //定义文件路径
            Path dfs = new Path(hdfsFilePath);
            os = fs.create(dfs, overwrite);
            //往文件写入信息
            os.writeBytes(content);
            //成功创建文件,设置为true
            rs=true;
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
                if(os!=null) {
                    // 关闭流
                    os.close();
                }
                if(fs!=null) {
                    // 不需要再操作 FileSystem 了,关闭
                    fs.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return rs;
    }
}
  1. 在项目hadoop-exp\src\test\java下创建一个名为hadoop+你学号后3位.hdfs的包。注意替换为你的学号后3位。

  2. 在包下面新建一个 HdfsUtilsTest 的类,用于单元测试。代码如下,注意替换为你的学号后3位。此测试用例主要目的是在 HDFS 上创建一个文件,并把 “hello” 写入文件。

package hadoop替换为你学号后3位.hdfs;

import hadoop替换为你学号后3位.hdfs.HdfsUtils;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;

import java.net.URI;

public class HdfsUtilsTest {
    @Test
    public void testCreate() {
        Configuration conf=new Configuration();
        boolean rs=false;
        //创建的文件路径
        String filePath="/替换为你学号后3位/test.txt";
        String content="hello";
        try {
            URI uri = new URI("hdfs://10.0.0.71:8020");
            rs= HdfsUtils.createFile(conf, uri, filePath, content, true);
        }catch(Exception e){
            e.printStackTrace();
        }
        if(rs){
            System.out.println("Create successfully!");
        }else{
            System.out.println("Create fail!");
        }
    }
}
  1. 复制文件 hadoop.dllC:\Windows\System32 下。
重要步骤,请勿忽略!
  1. 启动虚拟机的 Hadoop。
注意一定要启动 Hadoop,否则实验无法成功!
  1. 运行HdfsUtilsTest。查看 IDEA 的控制台输出结果是否创建成功。

  2. SSH 登录 NodeA,运行以下命令查看创建文件的内容输出。是否和创建的文件内容一致。注意替换为你的学号后3位。

hdfs dfs -cat /替换为你学号后3位/test.txt
  1. 参考以上代码和【任务参考】给出的 API 文档,完成以下编程要求
  • (1)在HdfsUtils类新增一个uploadFile方法,可以上传本地文件到 HDFS。
  • (2)在HdfsUtilsTest类新增一个testUpload方法,测试上传文件到 HDFS。
  • (3)在HdfsUtils类新增一个dowloadFile方法,可以下载 HDFS 文件到本地。
  • (4)在HdfsUtilsTest类新增一个testDownload方法,测试下载 HDFS 文件到本地。

【常见问题】

1. 报错:(null) entry in command string

答:这是缺少文件hadoop.dll文件

  • 1、下载hadoop.dll文件
  • 2、把文件放在c:\windows\system32目录下

2. IDEA 报错:java.net.ConnectionException:Call From XXXX/10.0.0.2 to 10.0.0.71:8020 failed on connection exception.

答:这是连接 NameNode 进程出错。

    1. 确保所有虚拟机节点都要启动。
    1. 确保能够ping 到10.0.0.71
    1. 确保 Hadoop 启动成功,使用jps命令检查进程是否缺少,特别是 namenode 进程。

扫码或长按识别访问