hadoop04-hdfs-shell操作和代码操作

HDFS的shell操作(开发重点)

基本语法:hadoop fs 具体命令 / hdfs dfs 具体命令 (两种方式完全相同)

  1. 启动hadoop集群,单启 sbin/start-dfs.sh 也可以

  2. 命令语法帮助 hadoop fs -help rm -> 查看rm 命令如何使用

  3. 创建一个名为sanguo的文件夹 hadoop fs -mkdir /sanguo

三大类命令:

  • 上传

    创建文本文件, vim shuguo.txt ,vim weiguo.txt , vim wuguo.txt , vim liubei.txt 里面随便写点内容,用于后续使用

    1. hadoop fs -moveFromLocal ./shuguo.txt /sanguo 将shuguo.txt移动到sanguo文件夹下(move移动,原文件会被删除

    2. hadoop fs -copyFromLocal ./weiguo.txt /sanguo 将weiguo.txt复制到sanguo文件夹下(copy复制,原文件保留

    3. hadoop fs -put ./wuguo.txt /sanguo -> 同copyFromLocal一样

    4. hadoop fs -appendToFile ./liubei.txt /sanguo/shuguo.txt 将liubei.txt追加到shuguo.txt文件的末尾

  • 下载

    1. hadoop fs -copyToLocal /sanguo/shuguo.txt /opt 将shuguo.txt文件从HDFS上拷贝到opt下

    2. hadoop fs -get /sanguo/shuguo.txt /opt/shuguo2.txt 将shuguo.txt文件从hadoop上拷贝到opt下,并改名为shuguo2.txt,和copyToLocal用法一样

  • 操作HDFS

    1. hadoop fs -ls / 查看hadoop根目录下的目录信息

    2. hadoop fs -cat /sanguo/shuguo.txt 显示文件内容

    3. -chgrp / -chmod / -chown 和linux用法一样,用于修改文件所属权限

      hadoop fs -chomd 666 /sanguo/shuguo.txt

      hadoop fs -chown root:root /sanguo/shuguo.txt

    4. hadoop fs -mkdir /jinguo 创建一个名为jinguo 的文件夹

    5. hadoop fs -cp /sanguo/shuguo.txt /jinguoHDFS上的shuguo.txt 拷贝到 jinguo文件夹下

    6. hadoop fs -cp /sanguo/weiguo.txt /jinguoHDFS上的weiguo.txt 拷贝移动**到 jinguo文件夹下

    7. hadoop fs -tail /jinguo/shuguo.txt 显示一个文件的末尾1kb的数据

    8. hadoop fs -rm /sanguo/shuguo.txt 将shuguo.txt 删除 (-rm -r 递归删除)

    9. hadoop fs -du -s -h /jinguo 统计文件夹的总大小信息 (第一个数表示文件大小,第二个数表示副本总大小)

    10. hadoop fs -du -h /jinguo 统计文件夹下所有文件的大小信息

    11. hadoop fs -setrep 5 /jinguo/shuguo.txt 设置文件的副本数

      这里设置的副本数只是会记录在NameNode的元数据中,具体存几份副本,需要看有几台服务器(DataNode),比如当前我们只有三台服务器,每台服务器存一个副本是有意义的,但一台服务器上存多个相同的副本是没有意义的,因为一台服务器宕机,你里面存多少个都是无意义的,所以即使我们设置副本数为5,也只会暂时存3份,等增加服务器后,再相应的增加副本数

Hadoop 代码操作:

  1. 创建maven项目,配置依赖

    <dependency>
       <groupId>org.apache.hadoop</groupId>
       <artifactId>hadoop-client</artifactId>
       <version>3.3.1</version>
    </dependency>
    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.13.1</version>
       <scope>test</scope>
    </dependency>
  1. 命令

    // 准备环境--------------------------------------------------
    FileSystem fs = null;
    @Before
    public void init() throws MalformedURLException {
       // 连接集群 NameNode
       URI uri = new URI("hdfs://hadoop101:8020");
       // 创建 配置文件
    Configuration configuration = new Configuration();
       // 用户 权限
       String user = "hadoop";
       // 获取客户端对象
       fs = FileSystem.get(uri,configuration,user);
    }
    @After
    public void close(){
       fs.close();
    }
    // 执行代码--------------------------------------------------
    @Test
    public void test(){
       // 1. 创建文件夹
       fs.mkdirs(new Path("/sanguo"));
       // 2. 上传 -> 参数解读:1 是否删除原文件;2 目标文件如果存在,是否允许覆盖;3 原文件路径;4 目标路径
       fs.copyFromLocalFile(false,true,new Path("D:\\shuguo.txt"),new Path("hdfs://hadoop101/sanguo/"));
       // 3. 副本参数优先级 : hdfs-default.xml -> hdfs-site.xml -> 在项目资源目录下的配置文件
       configuration.set("dfs.replication","2"); // 设置副本数
       // 4. 下载 -> 参数解读: 1 是否删除原文件;2 hdfs原文件路径;3 目标路径Window;4 是否开启数据校验(验证下载后的数据是否是完整正确的)
       fs.copyToLocalFile(true,new Path("hdfs://hadoop101/sanguo/"),new Path("D:\\"),true);
       // 5. 删除 -> 参数解读:1 要删除的文件路径;2 是否递归删除
       fs.delete(new Path("hdfs://hadoop101/sanguo/"),true);
       // 6. 文件更名和移动 -> 参数解读:1 原文件路径;2 目标文件路径
       fs.rename(new Path("/sanguo"),new Path("/sanguosha"));
       // 7. 查看文件详情 -> 参数解读:1 查看路径;2 是否迭代
       RemoteInterator<LocatedFileStatus>fs.listFiles("/",true);
       while(listFiles.hasNext()) {
           LocatedFileStatus fileStatus = listFiles.next();
           Sysout.out.println(fileStatus);
           // 获取块信息,文件存储地址
           BlockLocation[] blockLocation = fileStatus.getBlockLocations();
           Sysout.out.println(Arrays.toString(blockLocation));
      }
       // 8 文件和文件夹判断
       FileStatus[] fileStatus = fs.ListStatus(new Path("/"));
       for(fileStatus file : fileStatus){
           file.isFile(); // 判断是否是文件
      }
    }
posted @ 2022-03-11 15:48  迷路小孩  阅读(84)  评论(0)    收藏  举报