HDFS的架构优势与基本操纵

科技颠覆者  金牌会员 | 2024-7-15 00:34:27 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

写在前面

如今,数据正以指数级增长,各行各业都在追求更多的数据存储、高效的数据处理和可靠的数据基础来驱动业务的发展。Hadoop Distributed File System(HDFS)作为Hadoop生态系统的核心组件之一,成为构建可靠的大数据基础的不二选择之一。本文将深入剖析HDFS的架构与优势。
一、 HDFS概述

1.1 HDFS简介

HDFS(Hadoop分布式文件系统)是Apache Hadoop框架的一部分,计划用于存储和处理大规模数据集的分布式文件系统。HDFS产生的背景重要是为了满足处理大规模数据的需求。
在过去,传统的文件系统难以处理大规模数据集,因为它们通常只能在单个服务器上存储和操纵数据。随着大数据时代的到来,企业和构造面对着巨大的数据规模和复杂性。为了应对这个挑战,HDFS被开辟出来作为一个高度可靠和高容量的分布式文件系统。
HDFS的计划目标是能够在廉价的硬件上运行,并且能够容纳上千台机器的集群。它通过将数据切分成多个块并将其分散存储在不同的盘算节点上,实现了高吞吐量的数据访问和处理本事。别的,HDFS还提供了故障容错功能,能够自动处理存储节点的故障。
简而言之,HDFS是为了解决大规模数据处理问题而计划的,它提供了高可靠性、高扩展性和高吞吐量的分布式文件系统解决方案。
1.2 HDFS优缺点

1.2.1 优点



  • 高容错、高可用、高扩展

    • 数据冗余多副本、副本丢失后自动恢复
    • NameNode HA、安全模式
    • 10K节点规模,通过横向扩展来增长存储容量和处理本事。

  • 海量数据存储(高容量)

    • 典范文件大小GB~TB,百万以上文件数量,PB甚至EB以上数据规模

  • 构建成本低、安全可靠

    • 构建在廉价的商用服务器上,低落了存储成本和维护成本。
    • 通过多副本机制,提高可靠性
    • 提供了容错和恢复机制

  • 适合大规模离线批处理

    • 流式数据访问
    • 数据位置袒露给盘算框架

1.2.2 缺点



  • 不适合低耽误数据访问

    • 对于实时数据访问和低耽误要求较高的场景,HDFS的性能可能不够理想

  • 不适合大量小文件存储

    • 元数据会占用NameNode大量存储空间
    • 磁盘寻道时间凌驾读取时间

  • 不支持并发写入

    • 一个文件同时只能有一个写,不答应多个线程同时写

  • 不支持文件随机修改

    • 仅支持数据追加

1.3 HDFS构成架构



  • NameNode(nn):
    NameNode是HDFS的主节点(Master),负责管理整个文件系统的定名空间数据块的元数据信息。它维护文件系统的目次结构、文件的安全权限信息和数据块的位置信息等。NameNode还处理客户端的文件系统操纵哀求,如文件的读写和块的创建、复制和删除等。
  • DataNode(dn):
    DataNode是HDFS的工作节点(Slave),负责现实存储文件数据和执行文件系统操纵的使命。每个DataNode负责管理肯定数量的数据块,并定期向NameNode陈诉数据块的存储信息。DataNode还处理来自客户端和其他DataNode的读取和写入哀求,以及数据块的复制和恢复等。
  • 客户端(Client):
    客户端是利用HDFS的应用程序。它们通过与Namenode和DataNode举行通信来读取和写入文件。客户端向NameNode哀求文件的元数据信息,根据元数据信息确定所需数据块的位置,并从DataNode获取数据。客户端还负责处理文件系统的操纵,如创建、删除、重定名和移动文件等。
1.4 HDFS文件块大小

   HDFS中的文件在物理上是分成一个个数据块(Block)存储的,块的大小可以通过设置参数(dfs.blocksize)来规定,文件块默认大小是128M。
  HDFS文件块的大小选择是根据以下考虑因素:


  • 吞吐量:较大的文件块大小在处理大文件时可以提供更高的吞吐量。这是因为较大的文件块淘汰了磁盘寻道和网络传输的开销,使得数据读取和写入能够更加高效。
  • 空间利用:较大的文件块可以淘汰存储元数据的开销。在HDFS中,每个文件块都有一条元数据纪录,较小的文件块可能会导致元数据纪录数量增长,增长了存储的开销。
  • 并行性:较大的文件块可以提高数据的并行处理本事。在HDFS中,数据块是独立存储和处理的,较大的文件块能够在不同的盘算节点上并行处理,从而淘汰整个作业的执行时间。
较大的文件块适合存储大型文件和批量处理使命,但对于小型文件和实时数据处理,较小的文件块可能更加适合。
Q:为什么HDFS文件块的大小不能太大,也不能设置太小呢?
A: 文件块设置太小,会增长寻址的时间;设置太大,会导致数据处理非常慢。
HDFS文件块的大小设置取决于磁盘的传输速率
二、HDFS的Shell操纵(开辟重点)

2.1 基本语法

hadoop fs 具体命令 大概 hdfs dfs 具体命令
2.2 命令大全

  1. [amo@hadoop102 hadoop-3.2.4]$ bin/hadoop fs
  2. Usage: hadoop fs [generic options]
  3.         [-appendToFile <localsrc> ... <dst>]
  4.         [-cat [-ignoreCrc] <src> ...]
  5.         [-checksum <src> ...]
  6.         [-chgrp [-R] GROUP PATH...]
  7.         [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
  8.         [-chown [-R] [OWNER][:[GROUP]] PATH...]
  9.         [-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>]
  10.         [-copyToLocal [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>]
  11.         [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
  12.         [-cp [-f] [-p | -p[topax]] [-d] [-t <thread count>] [-q <thread pool queue size>] <src> ... <dst>]
  13.         [-createSnapshot <snapshotDir> [<snapshotName>]]
  14.         [-deleteSnapshot <snapshotDir> <snapshotName>]
  15.         [-df [-h] [<path> ...]]
  16.         [-du [-s] [-h] [-v] [-x] <path> ...]
  17.         [-expunge [-immediate]]
  18.         [-find <path> ... <expression> ...]
  19.         [-get [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>]
  20.         [-getfacl [-R] <path>]
  21.         [-getfattr [-R] {-n name | -d} [-e en] <path>]
  22.         [-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
  23.         [-head <file>]
  24.         [-help [cmd ...]]
  25.         [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
  26.         [-mkdir [-p] <path> ...]
  27.         [-moveFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
  28.         [-moveToLocal <src> <localdst>]
  29.         [-mv <src> ... <dst>]
  30.         [-put [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>]
  31.         [-renameSnapshot <snapshotDir> <oldName> <newName>]
  32.         [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
  33.         [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
  34.         [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
  35.         [-setfattr {-n name [-v value] | -x name} <path>]
  36.         [-setrep [-R] [-w] <rep> <path> ...]
  37.         [-stat [format] <path> ...]
  38.         [-tail [-f] [-s <sleep interval>] <file>]
  39.         [-test -[defswrz] <path>]
  40.         [-text [-ignoreCrc] <src> ...]
  41.         [-touch [-a] [-m] [-t TIMESTAMP (yyyyMMdd:HHmmss) ] [-c] <path> ...]
  42.         [-touchz <path> ...]
  43.         [-truncate [-w] <length> <path> ...]
  44.         [-usage [cmd ...]]
  45. Generic options supported are:
  46. -conf <configuration file>        specify an application configuration file
  47. -D <property=value>               define a value for a given property
  48. -fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
  49. -jt <local|resourcemanager:port>  specify a ResourceManager
  50. -files <file1,...>                specify a comma-separated list of files to be copied to the map reduce cluster
  51. -libjars <jar1,...>               specify a comma-separated list of jar files to be included in the classpath
  52. -archives <archive1,...>          specify a comma-separated list of archives to be unarchived on the compute machines
  53. The general command line syntax is:
  54. command [genericOptions] [commandOptions]
复制代码
2.3 常用命令实操



  • 创建一个文件夹,用来操纵命令
  1. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -mkdir /amoxilin
复制代码


  • help:输出这个命令参数
  1. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -help rm
复制代码
2.3.1 上传



  • -moveFromLocal:从本地剪切粘贴到HDFS
  1. # 创建一个测试文件 test.txt,并输入一些内容
  2. [amo@hadoop102 hadoop-3.2.4]$ vim test.txt
  3. # 使用 moveFromLocal 命令将test.txt文件移动到 HDFS
  4. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -moveFromLocal ./test.txt /amoxilin
复制代码


  • -copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
  1. [amo@hadoop102 hadoop-3.2.4]$ vim test1.txt
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -copyFromLocal test1.txt /amoxilin
复制代码


  • -put:等同于copyFromLocal,生产情况更习惯用put
  1. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -put test1.txt /amoxilin
复制代码


  • -appendToFile:追加一个文件到已经存在的文件末了
  1. # 创建一个文件test2.txt 并输入内容: 123
  2. [amo@hadoop102 hadoop-3.2.4]$ vim test2.txt
  3. # 将文件 test2.txt 追加到test.txt文件末尾
  4. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -appendToFile test2.txt /amoxilin/test.txt
复制代码

2.3.2 下载



  • -copyToLocal: 从HDFS拷贝到本地
  1. # 将 HDFS 中的test.txt文件copy下来
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -copyToLocal /amoxilin/test.txt ./
  3. [amo@hadoop102 hadoop-3.2.4]$ ls  # 查看文件是否拷贝成功  文件夹中有 test.txt,拷贝成功
  4. bin   etc      lib      LICENSE.txt  NOTICE.txt  sbin   test1.txt  test.txt  wcoutput
  5. data  include  libexec  logs         README.txt  share  test2.txt  wcinput
  6. [amo@hadoop102 hadoop-3.2.4]$
复制代码


  • -get: 等同于copyToLocal,生产情况更习惯用get
  1. # 将 HDFS 中的test.txt文件copy下来,并起一个其他的名字比如123.txt
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -get /amoxilin/test.txt ./123.txt
  3. [amo@hadoop102 hadoop-3.2.4]$ ls
  4. 123.txt  etc      libexec      NOTICE.txt  share      test.txt
  5. bin      include  LICENSE.txt  README.txt  test1.txt  wcinput
  6. data     lib      logs         sbin        test2.txt  wcoutput
  7. [amo@hadoop102 hadoop-3.2.4]$
复制代码
2.3.3 HDFS直接操纵



  • -ls: 表现目次信息
  1. # 查看 HDFS 里amoxilin文件夹的目录结构
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -ls /amoxilin
  3. Found 2 items
  4. -rw-r--r--   3 amo supergroup          9 2024-03-07 23:33 /amoxilin/test.txt
  5. -rw-r--r--   3 amo supergroup         49 2024-03-07 23:29 /amoxilin/test1.txt
复制代码


  • -cat: 表现文件内容
  1. # 查看某个文件的详细信息
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -cat /amoxilin/test.txt
  3. test
  4. 123
复制代码


  • -chgrp、-chmod、-chown: Linux文件系统中的用法一样,修改文件所属权限
  1. # 修改文件的权限
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -chmod 666 /amoxilin/test.txt
  3. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -ls /amoxilin
  4. Found 2 items
  5. -rw-rw-rw-   3 amo supergroup          9 2024-03-07 23:33 /amoxilin/test.txt
  6. -rw-r--r--   3 amo supergroup         49 2024-03-07 23:29 /amoxilin/test1.txt
  7. # 修改文件的group
  8. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -chown amo:amo/amoxilin/test.txt
  9. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -ls /amoxilin
  10. Found 2 items
  11. -rw-rw-rw-   3 amo amo                 9 2024-03-07 23:33 /amoxilin/test.txt
  12. -rw-r--r--   3 amo supergroup         49 2024-03-07 23:29 /amoxilin/test1.txt
复制代码


  • -mkdir: 创建路径
  1. # 创建文件夹
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -mkdir /csdn
复制代码


  • -cp: 从HDFS的一个路径拷贝到HDFS的另一个路径
  1. # 复制文件
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -cp /amoxilin/test1.txt /csdn
复制代码


  • -mv: 在HDFS目次中移动文件
  1. # 移动文件
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -mv /amoxilin/test.txt /csdn
复制代码


  • -tail: 表现一个文件的末了1kb的数据
  1. # 查看文件末尾内容
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -tail /amoxilin/test1.txt
  3. 欲买桂花同载酒,终不似,少年游!
  4. [amo@hadoop102 hadoop-3.2.4]$
复制代码


  • -rm: 删除文件或文件夹
  1. # 删除
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -rm /amoxilin/test1.txt
  3. Deleted /amoxilin/test1.txt
复制代码


  • -rm -r: 递归删除目次及目次里面内容
  1. # 递归删除
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -rm -r /amoxilin
  3. Deleted /amoxilin
复制代码


  • -u: 统计文件夹的大小信息
  1. # 统计文件夹的大小
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -du -s -h /csdn
  3. 58  174  /csdn                                  # 58 是文件大小 文件有三个副本就是58*3=174
  4. # 统计文件夹内各文件的大小
  5. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -du -h /csdn
  6. 9   27   /csdn/test.txt
  7. 49  147  /csdn/test1.txt
复制代码


  • -setrep: 设置HDFS中文件的副本数量
  1. # 设置hdfs副本数量
  2. [amo@hadoop102 hadoop-3.2.4]$ hadoop fs -setrep 5 /csdn/test1.txt
  3. Replication 5 set: /csdn/test1.txt
复制代码

这里设置的副本数只是纪录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增长到5台时,副本数才能达到5。
三、HDFS的API操纵

3.1 设置Windows


  • 解压Hadoop安装包到Windows系统 D:\hadoop-3.2.4
  • 设置$HADOOP_HOME情况变量指向D:\hadoop-3.2.4
  • 设置Path情况变量 %HADOOP_HOME%\bin
  • 下载

    • hadoop.dll 下载地址
    • winutils.exe 下载地址

  • 将 hadoop.dll 和 winutils.exe 放入$HADOOP_HOME/bin 文件夹中
3.2 HDFS的API案例实操


  • 在IDEA中创建一个Maven工程,并导入相应的依靠坐标以及日志
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.apache.hadoop</groupId>
  4.         <artifactId>hadoop-client</artifactId>
  5.         <version>3.2.4</version>
  6.     </dependency>
  7.     <dependency>
  8.         <groupId>junit</groupId>
  9.         <artifactId>junit</artifactId>
  10.         <version>4.12</version>
  11.     </dependency>
  12.     <dependency>
  13.         <groupId>org.slf4j</groupId>
  14.         <artifactId>slf4j-log4j12</artifactId>
  15.         <version>1.7.30</version>
  16.     </dependency>
  17. </dependencies>
复制代码

  • 创建HdfsClient类
  1. public class HdfsClient {
  2.     @Test
  3.     public void test() throws IOException, URISyntaxException, InterruptedException {
  4.                 // 1 获取一个客户端实例
  5.                 // 参数1:hdfs文件系统地址
  6.                 // 参数2:配置文件
  7.                 // 参数3:用户
  8.         FileSystem fs= FileSystem.get(new URI("hdfs://hadoop102:8020"),  new Configuration(), "amo");
  9.         
  10.         // 2 创建目录
  11.         fs.mkdirs(new Path("/amxl"));
  12.         // 3 关闭资源
  13.         fs.close();
  14.     }
  15. }
复制代码

  • 执行程序

3.2.1 HDFS文件上传


  • 编写源代码
  1. // 文件上传
  2. @Test
  3. public void testCopyFromLocal() throws URISyntaxException, IOException, InterruptedException {
  4.     // 1 获取一个客户端实例
  5.     // 参数1:hdfs文件系统路径
  6.     // 参数2:配置信息
  7.     // 参数3:用户名
  8.     FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),  new Configuration(), "amo");
  9.     // 2 使用客户端对象操作HDFS
  10.     // copyFromLocalFile(是否删除源数据,是否覆盖目标数据,源数据路径,目标数据路径)
  11.     fs.copyFromLocalFile(false, true, new Path("D:\\note.txt"),new Path("/amxl"));
  12.     // 3 关闭资源
  13.     fs.close();
  14. }
复制代码

文件默认的副本为3

  • 将hdfs-site.xml拷贝到项目的resources资源目次下,重新上传文件
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4.         <property>
  5.                 <name>dfs.replication</name>
  6.          <value>1</value>
  7.         </property>
  8. </configuration>
复制代码
在resources目次下自定义设置文件并设置文件副本数为1,发现此处设置文件参数的优先级是高于默认设置的文件的

  • 代码中修改设置
  1. @Test
  2. public void testCopyFromLocal() throws URISyntaxException, IOException, InterruptedException {
  3.     Configuration configuration = new Configuration();
  4.     // 设置文件副本数为 2
  5.     configuration.set("dfs.replication","2");
  6.     FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),  configuration, "amo");
  7.     fs.copyFromLocalFile(false, true, new Path("D:\\note.txt"),new Path("/amxl"));
  8.     fs.close();
  9. }
复制代码

重新上传文件,发现文件的副本数为2

  • 小结
    参数优先级排序:客户端代码中设置的值 > resources下的用户自定义设置文件 >然后是服务器的自定义设置 >服务器的默认设置
3.2.2 HDFS文件下载

  1. // 文件下载
  2. @Test
  3. public void testCopyToLocal() throws URISyntaxException, IOException, InterruptedException {
  4.     // 1 获取配置信息以及加载配置 并获取一个客户端实例
  5.     FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),  new Configuration(), "amo");
  6.     // 2 使用客户端对象操作 HDFS 将 note.txt文件下载到本地 D 盘
  7.     // copyToLocalFile(是否删除源文件,下载的文件路径,文件下载的目标路径,是否开启文件校验)
  8.     fs.copyToLocalFile(false,new Path("/amxl/note.txt"),new Path("D:\"),true);
  9.     // 3 关闭资源
  10.     fs.close();
  11. }
复制代码
3.2.3 HDFS文件更名和移动

  1. // 文件移动和重命名
  2. @Test
  3. public void testRename() throws IOException, URISyntaxException, InterruptedException {
  4.     // 1 获取配置信息以及加载配置 并获取一个客户端实例
  5.     FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");
  6.     // 2 文件重命名
  7.     // rename(源文件名,目标文件名)
  8.     fs.rename(new Path("/amxl/note.txt"), new Path("/amxl/note1.txt"));
  9.     // 文件移动
  10.     // rename(源文件路径,目标文件路径)
  11.     fs.rename(new Path("/csdn/test1.txt"), new Path("/amxl/test.txt"));
  12.     // 3 关闭资源
  13.     fs.close();
  14. }
复制代码
移动前:

移动后:

3.2.4 HDFS删除文件和目次

  1. // 删除文件和文件夹
  2. @Test
  3. public void testDelete() throws IOException, URISyntaxException, InterruptedException {
  4.     // 1 获取配置信息以及加载配置 并获取一个客户端实例
  5.     FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");
  6.     // 2 文件删除
  7.     // delete(路径)
  8.     // delete(路径,是否递归)
  9.     fs.delete(new Path("/amxl/note1.txt"), false);
  10.     fs.delete(new Path("/csdn"), true);
  11.     // 3 关闭资源
  12.     fs.close();
  13. }
复制代码
删除前:

删除后:

3.2.5 HDFS文件详情检察

检察文件名称、权限、长度、块信息
  1. // 查看文件详细信息
  2. @Test
  3. public void testGetFileStatus() throws IOException, URISyntaxException, InterruptedException {
  4.     // 1 获取配置信息以及加载配置 并获取一个客户端实例
  5.     FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");
  6.     // 2 文件详细信息
  7.     // listStatus(路径)
  8.     // listStatus(路径,是否递归)
  9.     RemoteIterator<LocatedFileStatus> listedFiles = fs.listFiles(new Path("/amxl"), true);
  10.     while (listedFiles.hasNext()) {
  11.         LocatedFileStatus next = listedFiles.next();
  12.         System.out.println(next.getPath());
  13.         System.out.println(next.getPermission());
  14.         System.out.println(next.getOwner());
  15.         System.out.println(next.getGroup());
  16.         System.out.println(next.getLen());
  17.         System.out.println(next.getModificationTime());
  18.         System.out.println(next.getReplication());
  19.         System.out.println(next.getBlockSize());
  20.         
  21.                 // 获取块信息
  22.         BlockLocation[] blockLocations = next.getBlockLocations();
  23.         System.out.println(Arrays.toString(blockLocations));
  24.     }
  25.     // 3 关闭资源
  26.     fs.close();
  27. }
  28. // -----------------------------------------------------------------------------------------
  29. // 输出
  30. hdfs://hadoop102:8020/amxl/test.txt
  31. rw-r--r--
  32. amo
  33. supergroup
  34. 49
  35. 1709910523258
  36. 5
  37. 134217728
  38. [0,49,hadoop104,hadoop103,hadoop102]
复制代码
3.2.6 HDFS文件和文件夹判断

  1. // 判断文件夹和文件
  2. @Test
  3. public void testListFiles() throws IOException, URISyntaxException, InterruptedException {
  4.     // 1 获取配置信息以及加载配置 并获取一个客户端实例
  5.     FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "guo");
  6.     // 2 判断文件夹和文件
  7.     // listStatus(路径)
  8.     FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
  9.     for (FileStatus fileStatus : fileStatuses) {
  10.         // 判断是否是文件
  11.         if(fileStatus.isFile()) {
  12.             System.out.println("文件:" + fileStatus.getPath().getName());
  13.         }else {
  14.             System.out.println("文件夹:" + fileStatus.getPath().getName());
  15.         }
  16.     }
  17. //        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
  18. //
  19. //        for (FileStatus fileStatus : fileStatuses) {
  20. //            // 判断是否是文件夹
  21. //            if (fileStatus.isFile()) {
  22. //                System.out.println("文件:" + fileStatus.getPath().getName());
  23. //            }
  24. //            if (fileStatus.isDirectory()) {
  25. //                System.out.println("文件夹:" + fileStatus.getPath().getName());
  26. //            }
  27. //        }
  28.     // 3 关闭资源
  29.     fs.close();
  30. }
复制代码


写在末了

总的来说,HDFS架构的优势和基本操纵使其成为构建可靠的大数据基础的理想选择。它的高可靠性、高扩展性和高效的数据访问方式,为处理大规模数据提供了强大的支持,并通过Shell操纵和API操纵,方便用户管理和操纵存储在HDFS中的数据。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表