ToB企服应用市场:ToB评测及商务社交产业平台

标题: HDFS的架构上风与基本操作 [打印本页]

作者: 宝塔山    时间: 2025-2-19 03:43
标题: HDFS的架构上风与基本操作
目录


写在前面

如今,数据正以指数级增长,各行各业都在寻求更多的数据存储、高效的数据处理和可靠的数据基础来驱动业务的发展。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 长处


1.2.2 缺点


1.3 HDFS组成架构


1.4 HDFS文件块大小

   HDFS中的文件在物理上是分成一个个数据块(Block)存储的,块的大小可以通过配置参数(dfs.blocksize)来规定,文件块默认大小是128M。
  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 常用命令实操


2.3.1 上传



2.3.2 下载


2.3.3 HDFS直接操作



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

3.1 配置Windows

3.2 HDFS的API案例实操

3.2.1 HDFS文件上传

ote.txt"),new Path(“/amxl”));
  1.     // 3 关闭资源
  2.     fs.close();
  3. }
复制代码

文件默认的副本为3
在resources目录下自定义配置文件并设置文件副本数为1,发现此处配置文件参数的优先级是高于默认配置的文件的
ote.txt"),new Path(“/amxl”));
fs.close();
}

重新上传文件,发现文件的副本数为2
3.2.2 HDFS文件下载

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

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

移动后:

3.2.4 HDFS删除文件和目录

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

删除后:

3.2.5 HDFS文件详情检察

检察文件名称、权限、长度、块信息
  1. // 检察文件详细信息@Testpublic void testGetFileStatus() throws IOException, URISyntaxException, InterruptedException {    // 1 获取配置信息以及加载配置 并获取一个客户端实例    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");    // 2 文件详细信息    // listStatus(路径)    // listStatus(路径,是否递归)    RemoteIterator<LocatedFileStatus> listedFiles = fs.listFiles(new Path("/amxl"), true);    while (listedFiles.hasNext()) {        LocatedFileStatus next = listedFiles.next();        System.out.println(next.getPath());        System.out.println(next.getPermission());        System.out.println(next.getOwner());        System.out.println(next.getGroup());        System.out.println(next.getLen());        System.out.println(next.getModificationTime());        System.out.println(next.getReplication());        System.out.println(next.getBlockSize());                        // 获取块信息        BlockLocation[] blockLocations = next.getBlockLocations();        System.out.println(Arrays.toString(blockLocations));    }    // 3 关闭资源
  2.     fs.close();
  3. }
  4. // -----------------------------------------------------------------------------------------// 输出hdfs://hadoop102:8020/amxl/test.txtrw-r--r--amosupergroup4917099105232585134217728[0,49,hadoop104,hadoop103,hadoop102]
复制代码
3.2.6 HDFS文件和文件夹判定

  1. // 判定文件夹和文件@Testpublic void testListFiles() throws IOException, URISyntaxException, InterruptedException {    // 1 获取配置信息以及加载配置 并获取一个客户端实例    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "guo");    // 2 判定文件夹和文件    // listStatus(路径)    FileStatus[] fileStatuses = fs.listStatus(new Path("/"));    for (FileStatus fileStatus : fileStatuses) {        // 判定是否是文件        if(fileStatus.isFile()) {            System.out.println("文件:" + fileStatus.getPath().getName());        }else {            System.out.println("文件夹:" + fileStatus.getPath().getName());        }    }//        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));////        for (FileStatus fileStatus : fileStatuses) {//            // 判定是否是文件夹//            if (fileStatus.isFile()) {//                System.out.println("文件:" + fileStatus.getPath().getName());//            }//            if (fileStatus.isDirectory()) {//                System.out.println("文件夹:" + fileStatus.getPath().getName());//            }//        }    // 3 关闭资源
  2.     fs.close();
  3. }
复制代码


写在最后

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

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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4