1.实验目的
(1)理解HDFS在Hadoop体系结构中的角色;
(2)熟练使用HDFS操作常用的Shell命令;
(3)熟悉HDFS操作常用的Java API。
2. 实验平台
(1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04);
(2)Hadoop版本:3.1.3;
(3)JDK版本:1.8;
(4)Java IDE:Eclipse。
3. 实验步骤
(一)编程实现以下功能,并利用Hadoop提供的Shell命令完成相同任务:
- 向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件;
- Shell命令检查文件是否存在,可以使用如下命令
-
1创建带有文本内容的文件
2. 用-test检测文件是否存在,1表示文件已存在
3 把文件传输到伪分布式中,0表示文件已存在
注意:
↑不是报错
执行完上述命令不会输出结果,需要继续输入命令查看结果:
如果结果显示文件已经存在,则用户可以选择追加到原来文件末尾或者覆盖原来文件,具体命令如下:
-
#追加到原文件末尾
#覆盖原来文件,第一种命令形式
- 从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
- Shell命令
-
- Java代码与执行情况*
-
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.*;
- import org.apache.hadoop.fs.FileSystem;
- import java.io.*;
- public class CopyToLocal {
- public static void copyToLocal(Configuration conf, String remoteFilePath,
- String localFilePath) {
- Path remotePath = new Path(remoteFilePath);
- try (FileSystem fs = FileSystem.get(conf)) {
- File f = new File(localFilePath);
- /* 如果文件名存在,自动重命名(在文件名后面加上 _0, _1 ...) */
- if (f.exists()) {
- System.out.println(localFilePath + " 已存在.");
- Integer i = Integer.valueOf(0);
- while (true) {
- f = new File(localFilePath + "_" + i.toString());
- if (!f.exists()) {
- localFilePath = localFilePath + "_" + i.toString();
- break;
- } else {
- i++;
- continue;
- }
- }
- System.out.println("将重新命名为: " + localFilePath);
- }
- // 下载文件到本地
- Path localPath = new Path(localFilePath);
- fs.copyToLocalFile(remotePath, localPath);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
/**
- * 主函数
- */
- public static void main(String[] args) {
- Configuration conf = new Configuration();
- conf.set("fs.defaultFS", "hdfs://localhost:9000");
- String localFilePath = "/usr/local/hadoop/test.txt"; // 本地路径
- String remoteFilePath = "/user/hadoop/test.txt"; // HDFS路径
- try {
- CopyToLocal.copyToLocal(conf, remoteFilePath, localFilePath);
- System.out.println("下载完成");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- 将HDFS中指定文件的内容输出到终端中;
- Shell命令
-
- 显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;
- Shell命令
-
- 给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;
- Shell命令
-
- 提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;
- Shell命令
-
- 提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在,则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;
- Shell命令
-
创建目录的命令如下:
删除目录的命令如下:
- 向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;
- Shell命令
-
追加到原文件末尾的命令如下:
追加到原文件的开头,在HDFS中不存在与这种操作对应的命令,因此,无法使用一条命令来完成。可以先移动到本地进行操作,再进行上传覆盖,具体命令如下:
- 删除HDFS中指定的文件;
- Shell命令
-