一、HDFS概述
1、HDFS产生背景和定义
1)HDFS产生背景
随着数据量的增加,在一个操作系统存不下所有的数据,那么久分配到更多的操作系统管理的磁盘中,但将数据分散的存储在不同的操作系统中,不便于管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
2)HDFS定义
HDFS(Hadoop Distributed File System)是一种分布式文件系统,用于存储和管理大规模数据集的分布式存储解决方案,通过目录树来定位文件。
HDFS适用场景:**适合一次写入,多次读出的场景。**一个文件经过创建、写入和关闭之后就不需要改变。HDFS只支持文件追加,而不支持在任意位置对文件进行修改
2、HDFS优缺点
优点
1)高容错性:数据自动保存多个副本,它能够通过增加副本的形式,提高容错性。当某一个副本丢失后,它可以根据其他节点上的副本数据自动恢复。
2)适合处理大数据
- 数据规模:能够处理数据规模达到GB、TB甚至PB级别的数据;
- 文件规模:能够处理百万规模以上的文件数量。
3)高可扩展性: HDFS可以轻松扩展以处理大规模数据,只需添加更多的节点即可。这种可扩展性使其适用于应对不断增长的数据量。
4)数据本地性: HDFS会在数据节点上存储数据块,这使得计算可以在数据附近进行,减少了网络传输的开销,提高了性能
缺点
1)延迟问题: HDFS通常用于批量数据处理,对于需要低延迟的实时数据访问场景不太适用。读取数据的响应时间可能会较长。做不到向Mysql那样快速相应数据。
2)无法高效的对大量小文件进行存储
对于每一个存储在HDFS文件系统中的文件,HDFS都会开销一部分内存来存储它的一些元数据(包括目录和块信息等),存储大量小文件的话,会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的,太多的小文件会徒增NameNode的负担,甚至会使其崩溃。
3)不支持原子性写入操作: HDFS不支持原子性写入操作,这意味着如果多个客户端同时尝试写入同一文件,可能会导致数据不一致性。因此HDFS规定:
- 一个文件只能同一时间只能有一个写,不允许多个线程同时写;
- 仅支持数据追加(append),不支持文件的随机修改。
3、HDFS组成架构
HDFS主要由NameNode、DataNode、SecondaryNameNode、Client组成
1)NameNode(nn):相当于Master,它是一个管理者
—> 元数据管理:NameNode负责管理HDFS的元素据,包括文件和目录结构、文件的位置信息、文件权限和命名空间等。
—> 块映射:NameNode维护一个块到数据节点的映射表,它记录了每个数据块的副本存储在哪些数据节点上。
—> 客户端请求处理:NameNode处理客户端的文件系统请求,例如创建、删除、重命名文件或目录,以及读取文件的元数据信息。
2)DataNode(dn):相当于Slave,NameNode下达命令,DataNode执行实际操作。
—> 数据块存储:DataNode负责存储实际的数据块。他们根据NameNode的指示将数据块写入本地磁盘,并在需要时将数据块传送给客户端。
—> 块报告:DataNode周期性地向NameNode发送报告,告知NameNode它们存储了哪些块,并报告数据块的将抗状态。
—> 块复制:如果某个数据块的副本数下降到预定的阈值以下,DataNode会复制丢失的块副本,以维护数据的可靠性。
3)SecondaryNameNode(2nn):辅助恢复NameNode
—> 元数据备份:SecondaryNameNode的主要作用是定期备份NameNode元数据。需要注意的是它并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。它不会处理实际的文件数据,而只是备份元数据。
—> 日志合并: Secondary NameNode也负责合并HDFS事务日志(编辑日志),以帮助减小NameNode的编辑日志大小,防止过大的编辑日志导致启动时间过长。
4)Client:客户端
—> 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;
—> 与NameNode交互,获取文件的位置信息;
—> 与DataNode交互,读取或者写入数据;
—> Client提供一些命令来管理HDFS,比如NameNode格式化;
—> Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作;
4、HDFS文件块大小
HDFS中的文件在物理上是分块存储(Block),也就是说数据块(Data Block)是HDFS中的基本存储单位,它是一个固定大小的数据块,通常默认为128MB(在Hadoop1.x版本中默认为64MB),但可以通过配置参数(dfs.blocksize)适当修改块大小。
**注:**在选择dfs.blocksize的值时,需要根据具体的应用需求进行权衡。通常,对于大规模数据处理工作负载,较大的数据块大小(如128MB或256MB)可能更合适,因为它可以提高数据处理性能。然而,如果应用程序需要处理大量小文件,可以考虑减小数据块的大小,以最大程度地减少存储浪费和提高小文件的写入性能。根据具体的使用情况,可以调整dfs.blocksize参数的值以优化HDFS的性能和存储效率
**解释:**为什么说处理大量小文件时,数据块设置得太大会造成存储浪费呢?这是因为HDFS默认情况下不会将多个小文件内的数据合并到一个数据块内,即使小文件的实际大小小于数据块大小,HDFS也会将它们分成不同的数据块,不会将多个小文件的数据合并到一个数据块内。这样的话就会造成每个小文件都独占一个数据块,但实际上数据块内存并没有充分利用,就造成了内存浪费。
思考:为什么块大小不能设置太小,也不能设置太大?
(1)HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置;
(2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。
二、HDFS的常用Shell命令
1、基本语法
hddoop fs 具体命令或 hdfs fs 具体命令,两个是完全相同的。
2、hdfs命令大全
查看HDFS命令集可以在Hadoop目录下输入bin/hadoop fs
[chery@hadoop102 hadoop-3.1.3]$ bin/hadoop fs
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
[-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] [-v] [-x] <path> ...]
[-expunge]
[-find <path> ... <expression> ...]
[-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
[-head <file>]
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] [-s <sleep interval>] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touch [-a] [-m] [-t TIMESTAMP ] [-c] <path> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
[-usage [cmd ...]]
3、常用命令操作
3.1 准备工作
1)启动Hadoop集群(方便测试)
[chery@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
[chery@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
2)在Haoop根目录创建一个文件夹“IT”用于测试
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /IT
3.2 上传
1)-moveFromLocal: 从本地剪切粘贴到HDFS(执行后本地文件被删除)
- 在本地创建一个名为“bigdata”的文本文件
[chery@hadoop102 hadoop-3.1.3]$ vim bigdata.txt
- 输入:
hello bigdata
- 剪切到HDFS下的IT目录
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./bigdata.txt /IT
2)-copyFromLocal:从本地文件系统拷贝文件到HDFS(执行后本地文件不会删掉)
- 在本地创建一个名为“houduan”的文本文件
[chery@hadoop102 hadoop-3.1.3]$ vim houduan.txt
- 输入:
hello houduan
- 将其拷贝到HDFS下的IT目录
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal ./houduan.txt /IT
3)-put:从本地文件系统推送到HDFS,等同于copyFromLocal
- 创建文本文件“qianduan”
[chery@hadoop102 hadoop-3.1.3]$ vim qianduan.txt
- 输入:
hello qianduan
- 上传
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./qianduan.txt /IT
4)-appendToFile:追加一个文件到已经存在的文件末尾
- 创建一个文本文件“hadoop”
[chery@hadoop102 hadoop-3.1.3]$ vim hadoop.txt
- 输入:
hello hadoop
- 追加到/IT/bigdata.txt文件末尾
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile ./hadoop.txt /IT/bigdata.txt
3.3 下载
1)-copyToLocal:从HDFS拷贝到本地
- 将HDFS中/IT/bigdata.txt拷贝到本地当前目录下
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /IT/bigdata.txt ./
2)-get:从HDFS拉取到本地,等同于copyToLocal
- 从HDFS拷贝bigdata.txt文件到本地当前目录并重命名
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -get /IT/bigdata.txt ./bigdata2.txt
3.4 HDFS直接操作
1)显示目录信息
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /IT
Found 2 items
-rw-r--r-- 3 chery supergroup 14 2023-10-05 08:25 /IT/bigdata.txt
-rw-r--r-- 3 chery supergroup 14 2023-10-05 08:38 /IT/houduan.txt
2)-cat:显示文件内容
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /IT/bigdata.txt
hello bigdata
3)-chgrp、chmod、chown:和Linux文件系统中的用法一致,用于修改文件权限
- chgrp(Change Group)命令用于更改文件或目录的所属用户组。
- chmod(Change Mode)命令用于更改文件或目录的权限。
- chown(Change Owner)命令用于更改文件或目录的所有者。
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 777 /IT/bigdata.txt
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -chown chery:chery /IT/bigdata.txt
4)mkdir:创建路径(文件夹)
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /Java
5)-cp:从HDFS的一个路径拷贝到HDFS另一个路径
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /IT/bigdata /Java
6)-mv:在HDFS目录中移动文件
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /IT/qianduan.txt /Java
7)-tail:显示一个文件的末尾1kb的数据
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /Java/qianduan.txt
8)-rm:删除文件或文件夹
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /IT/qianduan.txt
9)-rm -r:递归删除文件或文件夹(删除过程需要用户确认,而rm -rf不需要用户确认)
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /IT
4479

被折叠的 条评论
为什么被折叠?



