实验2 熟悉常用的HDFS操作

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命令完成相同任务:

  1. HDFS上传任意文本文件,如果指定的文件在HDFS中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件;
  2. Shell命令检查文件是否存在,可以使用如下命令
  3. 1创建带有文本内容的文件

    2. 用-test检测文件是否存在,1表示文件已存在

    3 把文件传输到伪分布式中,0表示文件已存在

    注意:

    ↑不是报错

    执行完上述命令不会输出结果,需要继续输入命令查看结果:

            如果结果显示文件已经存在,则用户可以选择追加到原来文件末尾或者覆盖原来文件,具体命令如下:

  4. #追加到原文件末尾

    #覆盖原来文件,第一种命令形式

  5. 从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
  6. Shell命令
  7. Java代码与执行情况*
    1. import org.apache.hadoop.conf.Configuration;
    2. import org.apache.hadoop.fs.*;
    3. import org.apache.hadoop.fs.FileSystem;
    4. import java.io.*;
    5. public class CopyToLocal {
    6.     public static void copyToLocal(Configuration conf, String remoteFilePath,
    7.             String localFilePath) {
    8.         Path remotePath = new Path(remoteFilePath);
    9.         try (FileSystem fs = FileSystem.get(conf)) {
    10.             File f = new File(localFilePath);
    11.             /* 如果文件名存在,自动重命名(在文件名后面加上 _0, _1 ...) */
    12.             if (f.exists()) {
    13.                 System.out.println(localFilePath + " 已存在.");
    14.                 Integer i = Integer.valueOf(0);
    15.                 while (true) {
    16.                     f = new File(localFilePath + "_" + i.toString());
    17.                     if (!f.exists()) {
    18.                         localFilePath = localFilePath + "_" + i.toString();
    19.                         break;
    20.                     } else {
    21.                         i++;
    22.                         continue;
    23.                     }
    24.                 }
    25.                 System.out.println("将重新命名为: " + localFilePath);
    26.             }
    27.             // 下载文件到本地
    28.             Path localPath = new Path(localFilePath);
    29.             fs.copyToLocalFile(remotePath, localPath);
    30.         } catch (IOException e) {
    31.             // TODO Auto-generated catch block
    32.             e.printStackTrace();
    33.         }
    34.     }

        /**

    1.      * 主函数
    2.      */
    3.     public static void main(String[] args) {
    4.         Configuration conf = new Configuration();
    5.         conf.set("fs.defaultFS", "hdfs://localhost:9000");
    6.         String localFilePath = "/usr/local/hadoop/test.txt"; // 本地路径
    7.         String remoteFilePath = "/user/hadoop/test.txt"; // HDFS路径
    8.         try {
    9.             CopyToLocal.copyToLocal(conf, remoteFilePath, localFilePath);
    10.             System.out.println("下载完成");
    11.         } catch (Exception e) {
    12.             e.printStackTrace();
    13.         }
    14.     }
    15. }

  8. 将HDFS中指定文件的内容输出到终端中;
  9. Shell命令
  10. 显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;
  11. Shell命令
  12. 给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;
  13. Shell命令
  14. 提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;
  15. Shell命令
  16. 提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在,则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;
  17. Shell命令
  18. 创建目录的命令如下:

                     删除目录的命令如下:

       

  19. 向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;
  20. Shell命令
  21. 追加到原文件末尾的命令如下:

            追加到原文件的开头,在HDFS中不存在与这种操作对应的命令,因此,无法使用一条命令来完成。可以先移动到本地进行操作,再进行上传覆盖,具体命令如下:

  22. 删除HDFS中指定的文件;
  23. Shell命令
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值