大数据学习之路(4): HDFS概述及shell操作

852 阅读8分钟

一、HDFS概述

1.1 HDFS产出背景

根据摩尔定律的预测,每18个月集成电路的晶体管的数量就会增加一倍。我们的计算机升级迭代虽然没这么夸张,但是内存也在逐渐升级,但是我们的大数据时代,每天积累的数据量是越来越多的,而能够把这堆数据都存在一台电脑上,那么这台电脑的成本是极大的,传统的文件管理系统也无法应对这大规模数据,之后就衍生了分布式文件管理系统,由它将数据分配到更多的操作系统管理的磁盘上,由几十个甚至几百个廉价的机器来共同存储这些数据,而这些机器都由分布式管理系统来管理,HDFS就是分布式管理系统中的一种。

1.2 HDFS定义

HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;

其次,它是分布式的,由很多台服务器联合起来实现其功能,HDFS的使用场景是适合一次写入,多次读出的场景,且不支持文件的修改,适合用来做数据分析,并不适合做网盘应用。

1.3 HDFS优缺点

1.3.1 优点
  • 高容错性:数据自动保存多个副本,某个副本丢失可以自动恢复
  • 适合处理大数据:百万规模的文件数量
  • 可以构建在廉价的机器上
1.3.2 缺点
  • 不适合低延时数据访问
  • 无法高效的对大量小文件进行存储
    • 存储大量小文件,会占用NameNode大量的内存来存储文件目录和块信息
    • 小文件存储的寻址时间会超过读取时间,违法HDFS的设计目标
  • 不支持并发写入,文件随机修改
    • 一个文件只能有一个写,不允许多个线程同时写
    • 仅支持数据追加,不支持文件随机修改

1.4 架构

关于HDFS的架构如下图所示,采用主从架构。一个HDFS集群由一个Namenode和一定数量的datanode组成,Namenode是一个中心服务器,负责管理文件系统的命名空间,以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储,

clipboard.png

在上面这张图中,我们需要了解的是这四个概念。

NameNode:就是主master,管理数据块的映射信息,处理客户端读写请求。HDFS的守护进程,用来管理文件系统的命名空间,负责记录文件是如何分割成数据块,以及这些数据块分别被存储到哪些数据节点上,主要功能就是对内存和io进行集中管理。

DataNode: 文件系统的工作节点,根据需要存储和检索数据块,并且定期向NameNode发送他们所存储的块的列表,执行实际的操作,存储实际的数据块。

client:客户端,client将文件切分成一个个block,然后进行上传。

secondary namenode :辅助namenode,比如定期合并fsimage(保存文件系统的目录)和edits(修改操作),并推送给namenode,紧急情况下恢复namenode。在NameNode节点上,fsimage保存了元数据镜像文件,而edit中完整的记录了元数据的操作日志。NameNode内存中存储的元数据可以用fsimage+edits来表达。而secondary namenode负责定时(default 1 hours)从Namenode上获取fsimage和edits进行合并,然后再发送给Namenode,减少NameNode的工作量。

1.5 HDFS文件块大小

HDFS的文件在物理上是分块存储的,块的大小可以通过配置参数来规定,默认大小在Hadoop2.x和3.x版本中是128M,1.x版本是64M。

寻址时间就是查找到目标block的时间,寻址时间为传输时间的1%时,则为最佳状态。因此块的大小设置为磁盘传输速率传输时间是比较合理的,这个了解即可。

那么HDFS块的大小设置过小和过大都会有怎样的后果呢?如果HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置;如果块的设置太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间,比如这个块的大小为一个t,那么定位时间就会耗时。

总结:HDFS的大小设置主要取决于磁盘传输速率。

1.6 HDFS健壮性

HDFS的健壮性就是即使出错的情况下也要保证数据存储的可靠性。常见的出错情况是Namenode出错、Datanode出错和网络割裂HDFS提供了错误恢复手段。

1、磁盘数据错误,心跳检测和和重新复制。

每个Datanode节点周期性的向nameNode 发送心跳信号。网络割裂可能导致一部分DataNode与NameNode失去联系。

2、集群均衡

HDFS架构支持数据均衡策略。如果某个DataNode节点上的空闲空间低于特定的临界点,按照均衡策略系统就会自动将数据从这个DataNode移动到空闲的DataNode。

3、数据完整性

从某个DataNode获取的数据块可能是损坏的,原因可能是网络错误或存储设备错误等,HDFS会对这个数据库内容进行检查,将结果与之前存储时存放在隐藏文件的结果进行对比后,如果不匹配,就去其他节点获取数据块。

4、元数据磁盘错误

NameNode重启的时候,会选取最近的完整的FSIMAGE和Editlog来使用。

1.7 HDFS数据组织

1、数据块存储

被设计为支持大文件,支持文件的一次写入,多次读取。

2、流水线复制

当客户端向HDFS文件写入数据时,一开始是写到本地临时文件中,假设该文件的副本系数设置为3,当本地临时文件累计到一个数据块的大小时,客户端从namenode获取datanode节点,向第一个Datanode传输数据,第一个datanode的一小部分接收数据,存入本地仓库,同时传输数据到下一个Datanode,下一个也是这样传输下去。

3、文件的删除和复制

用户删除文件后,该文件名并不会立即被删除,会被临时存放在/trash目录下,超过一定时间,才会删除,默认为6小时。

二、HDFS的Shell操作

2.1 基本语法

Hadoop fs

hdfs dfs

两个是完全相同的。

2.2 命令大全

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs
Usage: hadoop fs [generic options]
        [-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 ...]]

2.3 实操命令

1、 -ls 显示目录信息

[lei@hadoop101 ~]$ hadoop fs -ls /
Found 2 items
drwxrwx---   - lei supergroup          0 2021-03-18 20:29 /tmp
drwxr-xr-x   - lei supergroup          0 2021-03-18 20:26 /user

2、-mkdir 在HDFS上创建目录 -p多层目录

[lei@hadoop101 ~]$ hadoop fs -mkdir -p /user/xiao

3、-moveFromLocal:从本地剪切到HDFS

[lei@hadoop101 ~]$ hadoop fs -mkdir -p /user/xiao
[lei@hadoop101 ~]$ touch lei.txt
[lei@hadoop101 ~]$ vim lei.txt
[lei@hadoop101 ~]$ hadoop fs -moveFromLocal ./lei.txt /user/xiao
2021-03-20 12:33:44,878 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

4、appendToFile:追加一个文件到已经存在的文件的末尾

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -appendToFile lei2.txt /user/xiao/lei.txt
2021-03-20 12:36:38,368 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

5、-cat 显示文件内容

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -cat /user/xiao/lei.txt
2021-03-20 12:38:28,546 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

6、-chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -chmod 666 /user/xiao/lei.txt
[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -chown lei:lei /user/xiao/lei.txt

7、-copyFromLocal:从本地文件系统拷贝到HDFS路径

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -copyFromLocal lei2.txt /user/xiao/
2021-03-20 12:41:29,316 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

8、-copyToLocal:从HDFS拷贝到本地

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -copyToLocal /user/xiao/lei.txt ./
2021-03-20 12:43:39,375 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

9、-cp :从HDFS的一个路径拷贝到HDFS的另一个路径

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -cp /user/xiao/lei.txt /user/lei/lei.txt
2021-03-20 12:46:35,793 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2021-03-20 12:46:35,972 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

10、-mv:在HDFS目录中移动文件

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -mv  /user/xiao/lei.txt /user/

11、-get:等同于copyToLocal,就是从HDFS下载文件到本地

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -get /user/xiao/lei.txt ./

12、-getmerge:合并下载多个文件,比如HDFS的目录 /user/atguigu/test下有多个文件:log.1, log.2,log.3,...合并后的文件在本地。

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -getmerge /user/xiao/ ./merger.txt
2021-03-20 12:53:58,924 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[lei@hadoop101 hadoop-3.1.3]$ cat merger.txt 

13)-put:等同于copyFromLocal

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -put ./merger.txt /user/xiao/
2021-03-20 12:55:32,696 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

14)-tail:显示一个文件的末尾

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -tail  /user/xiao/lei.txt
2021-03-20 12:56:19,881 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
haha
lei
gugu
xiao
lei
hello
world
root
linux
java
hadoop
hadoop
jia
and
here
please
hadoop

15)-du统计文件夹的大小信息

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -du -h /user/xiao
92   92   /user/xiao/lei.txt
27   27   /user/xiao/lei2.txt
119  119  /user/xiao/merger.txt

16)-setrep:设置HDFS中文件的副本数量

[lei@hadoop101 hadoop-3.1.3]$ hadoop fs -setrep 3 /user/xiao/lei.txt
Replication 3 set: /user/xiao/lei.txt

该文件变为三个副本存储。 image.png

那么如果设置的副本数超过DataNode 的数量,那么不会超过DataNode的副本,也就是最多每个DataNode保存一份。

三、解决Web页面中操作没有权限的问题

image.png

hadoop默认情况下开启了权限检查,且默认使用的dir.who作为http访问的静态用户,因此可通过关闭权限检查或者配置http访问的静态用户为lei,二选一即可。

方式一:在core-site.xml 中修改http访问的静态用户为lei

<property>
        <name>hadoop.http.staticuser.user</name>
        <value>lei</value>
 </property>

方式二:在hdfs-site.xml中关闭权限检查(个人不太建议)

<property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
</property>