【版本】
当前版本号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
复制
【任务步骤】
- 启动NodeA、NodeB、NodeC3个节点的虚拟机,使用
hadoop
用户登录NodeA
,启动 Hadoop。
start-hdp.sh
复制
HDFS 机架拓扑
- 查看 HDFS 的机架拓扑。
hdfs dfsadmin -printTopology
复制
- 查看 put 命令的使用方法和参数
hdfs dfs -help put
复制
HDFS 文件操作
- 在用户目录下创建一个文本文件。注意替换为你的学号。
cd ~ echo "uploaded by 你的学号后4位" >uploader.txt ls
复制
- 使用
hdfs dfs -put
命令上传本地~/uploader.txt
文件到 HDFS 的根目录/
下。
HDFS 文件目录操作
查看
hdfs dfs -mkdir
的用法,并在 HDFS 上创建/poetry
文件夹。从实验资源下载
haizi1.txt
到本地~目录。使用
hdfs dfs -moveFromLocal
或者hdfs dfs -put
命令,上传haizi1.txt
到 HDFS 的/poetry
目录下。查看 HDFS 的
/poetry
目录,确认是否上传成功。
hdfs dfs -ls -h /poetry
复制
HDFS 文件内容操作
使用
hdfs dfs -cat
命令输出HDFS 的/poetry/haizi1.txt
文件的内容。使用
hdfs dfs -cp
命令把 HDFS 的/poetry/haizi1.txt
复制为/poetry/FacingTheSea.txt
。使用
hdfs dfs -checksum
命令分别输出/poetry/haizi1.txt
和/poetry/FacingTheSea.txt
。比较两者的校验码是否一致。使用
hdfs dfs -appendToFile
命令把本地的~/uploader.txt
的内容追加到 HDFS 的/poetry/FacingTheSea.txt
使用
hdfs dfs -tail
命令输出 HDFS 的/poetry/FacingTheSea.txt
的内容。使用
hdfs dfs -rm
命令移除 HDFS 的/poetry/haizi1.txt
,并查看/poetry
目录下的文件,确认是否删除成功。使用
hdfs dfs -mv
命令移动 HDFS 的/poetry/FacingTheSea.txt
到根目录下。使用
hdfs dfs -rmdir
命令删除 HDFS 的/poetry
目录。使用
hdfs dfs -find
找出 HDFS 根目录下的所有.txt
结尾的文件。使用
hdfs dfs -ls -R /
列出 HDFS 根目录下的所有文件。
HDFS 安全模式操作
- 使用命令让 HDFS 进入安全模式
hdfs dfsadmin -safemode enter
复制
- 尝试创建一个文件,观察 HDFS 提示信息。
hdfs dfs -touchz /test.txt
复制
- 获取安全模式的状态。
hdfs dfsadmin -safemode get
复制
- 使用相应命令退出安全模式。
HDFS 快照操作
在 HDFS 创建目录
/snapshot+你学号后3位
,注意替换为你的学号。在该目录上开启快照(snapshot)功能,注意替换为你的学号。
hdfs dfsadmin -allowSnapshot /snapshot+你学号后3位
复制
上传本地的
haizi1.txt
文件到/snapshot+你学号后3位
目录创建名为
v1
的快照,注意替换为你的学号。
hdfs dfs -createSnapshot /snapshot+你学号后3位 v1
复制
使用
hdfs dfs -appendToFile
把本地的haizi2.txt
追加到/snapshot+你学号后3位/haizi1.txt
文件。使用
diff
命令对比快照修改前后的内容。
diff <(hdfs dfs -cat /snapshot+你学号后3位/.snapshot/v1/haizi1.txt) <(hdfs dfs -cat /snapshot+你学号后3位/haizi1.txt)
复制
HDFS 容量操作
在 HDFS 上创建目录
/quota+你学号后3位
,注意替换为你的学号。设置文件/目录数量配额为2,注意替换为你的学号。
hdfs dfsadmin -setQuota 2 /quota+你学号后3位
复制
- 尝试在
/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
复制
【任务要求】
打开 Part 1 的
hadoop-exp
项目。在项目
hadoop-exp\src\main\java
下创建一个名为hadoop+你学号后3位.hdfs
的包。注意替换为你的学号后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; } }
复制
在项目
hadoop-exp\src\test\java
下创建一个名为hadoop+你学号后3位.hdfs
的包。注意替换为你的学号后3位。在包下面新建一个 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!"); } } }
复制
- 复制文件
hadoop.dll
到C:\Windows\System32
下。
- 启动虚拟机的 Hadoop。
运行
HdfsUtilsTest
。查看 IDEA 的控制台输出结果是否创建成功。SSH 登录 NodeA,运行以下命令查看创建文件的内容输出。是否和创建的文件内容一致。注意替换为你的学号后3位。
hdfs dfs -cat /替换为你学号后3位/test.txt
复制
- 参考以上代码和【任务参考】给出的 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 进程出错。
- 确保所有虚拟机节点都要启动。
- 确保能够ping 到10.0.0.71
- 确保 Hadoop 启动成功,使用jps命令检查进程是否缺少,特别是 namenode 进程。