Hadoop Distributed File System(HDFS)

Hadoop Distributed File System(HDFS),第1张

Hadoop Distributed File System(HDFS)

1、概述

        HDFS相当于是做存储的。有大量的数据需要存,存到哪里。

        HDFS(Hadoop Distributed File System) 是一个 Apache Software Foundation 项目, 是 Apache Hadoop 项目的一个子项目。 Hadoop 非常适于存储大型数据 (比如TB级别和PB级别的数据), 其实就是使用 Hadoop的HDFS 作为数据的存储系统。

        HDFS 可以使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统。HDFS 对数据文件的访问通过流的方式进行处理, 这意味着通过shell命令和 MapReduce 程序的方式可以直接使用 HDFS。

        可以通过 Apache Hadoop 获取 hadoop 相关的版本。

        本来使用的是hadoop-3.1.1版本。但是考虑到该版本有点缺陷,这里升级到3.1.2的版本。通过 Hadoop – Apache Hadoop 3.1.2 可以查看3.1.2的文档。

留意文档左下角有 HDFS 的说明。

        HDFS可以使用多台计算机存储文件。并且提供统一的访问接口,像是访问一个普通文件系统一样使用分布式文件系统。

        Hadoop是主从结构的。其中HDFS分布式文件系统也是属于主从结构的分布式文件系统。Master与slave通过RPC协议进行通信。他们组成有着主从架构的分布式文件系统。

        Hadoop文件系统在一定程度上采用了Linux树状结构的文件系统。HDFS 对数据文件的访问通过流的方式进行处理, 这意味着通过shell命令和 MapReduce 程序的方式可以直接使用 HDFS。HDFS 是高容错的, 且提供对数据集的高吞吐量访问。

        HDFS 是高容错的, 且提供对数据集的高吞吐量访问。

        什么是可容错性?如果死掉了一个存储节点,里面的东西也可以进行转移,转移到一个新的节点机器中。其他节点会替代你完成节点的存储工作。而且由于是分布式的,可以拓展很多存储的节点。

        HDFS 的一个非常重要的特点就是一次写入、多次读取, 该模型降低了对并发控制的要求, 简化了数据聚合性, 支持高吞吐量访问。而吞吐量是大数据系统的一个非常重要的指标, 吞吐量高意味着能处理的数据量就大。

        HDFS本质上是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色

        HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。数据读到HDFS中后,要么删除,要么就别改。

​​​​​​​2、组成架构

参考:Apache Hadoop 3.1.2 – HDFS Architecture 

(1)HDFS的组成架构包括:NameNode和DataNode以及Secondary Namenode。

(2) NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。

(3)DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个datanode上存储多个副本。

(4)Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照

        比如有一个文件 a.txt 很大,则在HDFS客户端中,需要进行拆分切割。每块的大小都是固定的128MB。

        Datanode则是具体进行块的存储的。这些块就是通过datanode存储到硬盘中。Namenode则存储块的元数据,还负责datanode状态的监控。元数据是存储在内存中的,块数据则是存放在磁盘上的。还有一些次要角色,比如seondarynamenode。考虑到namenode要存储那么多元数据,工作较繁忙。于是后来添加了secondarynamenode就是帮助namenode进行数据的管理。

        维持这个架构的运作是由架构师想到的一些比较号的机制。

        心跳机制。Datanode会时不时向namenode发送心跳,说:还活着。这样数据存储的时候,就还会把它作为数据存储的节点。如果老是把数据放在一个存储节点上,就可能会爆。为了维持有效分工,架构师想出另一个机制:负载均衡。使要保存的块数据均匀分布在不同的datanode存储节点上。

        除此以外,为了防止数据丢失,提高数据容错性,架构还有一个机制:副本机制。即使有一个数据存储节点坏掉了,依然可以保证数据的完整性。

以上就是上图中描述的:Heartbeats、balancing、replication。

3、HDFS文件块大小

        HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M

        留意之前配置的时候 hdfs-site.xml 中的设置。134,217,728=128M。

        考虑到块都是在datanode中进行存储的。每块通过行偏移量确定块的位置。

        介绍一个经典的面试题。为什么blocksize是128MB。这个要涉及到文件系统的状态。

        1. HDFS中平均寻址时间大概为10ms;

        2. 经过测试发现,寻址时间为传输时间的1%时,为最佳状态;所以最佳传输时间为10ms / 0.01 = 1000ms = 1s

        3. 目前磁盘的传输速率普遍为100MB/s  ,  网卡普遍为千兆网卡传输速率普遍也是100MB/s;计算出最佳block大小:100MB/s x 1s = 100MB;所以我们设定block大小为128MB。找到128MB所需要的时间大概是10ms。传输128MB的数据大概需要1s。

        HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。很多情况下HDFS使用128MB的块设置。

4、HDFS的shell *** 作

注意:每次启动虚拟机需要

(1)执行格式化命令:

cd /export/servers/hadoop-3.1.2/ # 需要先进入这个目录再执行format

bin/hdfs namenode -format

如果不是第一次格式,则这里会d出提示是否覆盖,选择n

2、启动集群

/export/servers/hadoop-3.1.2/sbin/start-dfs.sh

/export/servers/hadoop-3.1.2/sbin/start-yarn.sh

mapred --daemon start historyserver

        通过 http://192.168.110.101:50070/dfshealth.html#tab-overview 可以查看 Summary 汇总情况。需要确保Live Nodes为3说明有3个节点是活的。如果该值为0,需要通过jps确认是否存在datanode

接下来切换到分布式文件系统。

页面切换到:http://192.168.110.101:50070/explorer.html 

可以看到只有一个根目录,里面只有export。

接下来通过命令行 *** 作进行文件系统的访问。

5、基本语法

有fs和dfs两个基本语法:

hadoop fs 具体命令

hadoop dfs 具体命令

​​​​​​​6、参数大全

可以输入help命令,具体格式如下:

hadoop fs -help

注:hadoop fs参数大全如下:

        [-appendToFile ... ]

        [-cat [-ignoreCrc] ...]

        [-checksum ...]

        [-chgrp [-R] GROUP PATH...]

        [-chmod [-R] PATH...]

        [-chown [-R] [OWNER][:[GROUP]] PATH...]

        [-copyFromLocal [-f] [-p] ... ]

        [-copyToLocal [-p] [-ignoreCrc] [-crc] ... ]

        [-count [-q] ...]

        [-cp [-f] [-p] ... ]

        [-createSnapshot []]

        [-deleteSnapshot ]

        [-df [-h] [ ...]]

        [-du [-s] [-h] ...]

        [-expunge]

        [-get [-p] [-ignoreCrc] [-crc] ... ]

        [-getfacl [-R] ]

        [-getmerge [-nl] ]

        [-help [cmd ...]]

        [-ls [-d] [-h] [-R] [ ...]]

        [-mkdir [-p] ...]

        [-moveFromLocal ... ]

        [-moveToLocal ]

        [-mv ... ]

        [-put [-f] [-p] ... ]

        [-renameSnapshot ]

        [-rm [-f] [-r|-R] [-skipTrash] ...]

        [-rmdir [--ignore-fail-on-non-empty]

...]

        [-setfacl [-R] [{-b|-k} {-m|-x } ]|[--set ]]

        [-setrep [-R] [-w] ...]

        [-stat [format] ...]

        [-tail [-f] ]

        [-test -[defsz] ]

        [-text [-ignoreCrc] ...]

        [-touchz ...]

        [-usage [cmd ...]]

​​​​​​​7、常用命令实 ***

(1) -help

功能:输出这个命令参数手册,即上面的参数大全。

 [-help [cmd ...]]

比如:

hadoop fs -help

(2)-ls

功能:显示目录信息

[-ls [-d] [-h] [-R] [ ...]]

比如:

hadoop fs –ls /

hadoop fs –ls hdfs://hadoop101:8020/

这里的 hdfs://hadoop101:8020 是在 core-site.xml中配置的。见 fs.defaultFS属性。

注意,这些参数中,所有的hdfs路径都可以简写。所以上面两条命令是一样的。

(3)-mkdir

功能:在hdfs上创建目录

[-mkdir [-p] ...]

比如:

hadoop fs –mkdir -p /aaa/bbb/cc/dd

注意:hadoop fs上创建的目录,在真实磁盘上是不存在的。该目录是由NameNode这个角色记录的。

可以在图形化界面 http://192.168.110.101:50070/explorer.html#/ 上刷新看一下。

(4) -copyFromLocal -put

功能:从本地(linux系统)拷贝粘贴到hdfs

[-copyFromLocal [-f] [-p] ... ]

[-put [-f] [-p] ... ]

比如:

hadoop fs –copyFromLocal ./a.txt /aaa/bbb/cc/dd

hadoop fs –put ./a.txt /aaa/bbb/cc/dd

注意:Replication为3表示有3个副本。即使这个文件只有几个字节,仍然会以一个块(BlockSize为128MB)的方式进行存储。

(5)-copyToLocal -get

功能:从hdfs下载文件到本地

[-copyToLocal [-p] [-ignoreCrc] [-crc] ... ]

[-get [-p] [-ignoreCrc] [-crc] ... ]

比如:

hadoop fs –copyToLocal /aaa/bbb/cc/dd/a.txt ./

hadoop fs –get /aaa/bbb/cc/dd/a.txt ./

(6) -moveFromLocal

功能:从本地(linux系统)剪切粘贴到hdfs

[-moveFromLocal ... ]

比如:

hadoop fs –moveFromLocal ./a.txt /aaa/bbb/cc/dd

注意:前面的路径是本地磁盘(linux系统)上的,后面的路径是hdfs上的。moveToLocal执行后,本地磁盘上的文件就不存在了。

(7) -moveToLocal

功能:从hdfs剪切粘贴到本地(linux系统)

[-moveToLocal ]

比如:

hadoop fs –moveToLocal /aaa/bbb/cc/dd/a.txt ./

为何会出现这个?moveToLocal还没实现?

(8)-getmerge

功能:合并下载多个文件

[-getmerge [-nl] ]

比如:

hadoop fs -getmerge /aaa/log.* /export/testdata/log.sum 

假设分布式系统上/aaa/目录上有log.1、log.2、log.3文件。合并后存到本地上的log.sum文件中。

(9) -cat

功能:显示文件内容

[-cat [-ignoreCrc] ...]

比如:

hadoop fs -cat /aaa/bbb/cc/dd/a.txt

(10) -tail

功能:显示一个文件的末尾

[-tail [-f] ]

比如:

hadoop fs -tail /aaa/bbb/cc/dd/install.log

显示最后20行?

(11) -text

功能:以字符形式打印一个文件的内容

[-text [-f] ]

比如:

hadoop fs -text /aaa/bbb/cc/dd/a.txt

(12) --appendToFile

功能:追加一个文件到已经存在的文件末尾

[-appendToFile ... ]

比如:

hadoop fs –moveFromLocal /export/testdata/a.txt /aaa/bbb/cc/dd

可以使用-cat命令查看文件的内容。

如果报告如下错误:

考虑换成hadoop-3.1.2版本。

(13) -cp

功能:从hdfs的一个路径拷贝hdfs的另一个路径

[-cp [-f] [-p] ... ]

比如:

hadoop fs –cp /aaa/bbb/cc/dd/a.txt /aaa/

(14)-mv

功能:在hdfs目录中移动文件

[-mv ... ]

比如:

hadoop fs –mv /aaa/a.txt /aaa/bbb/

(15) -df

功能:统计文件系统的可用空间信息

[-df [-h] [ ...]]

比如:

hadoop fs –df -h /

这里表示共有31.4G的可用空间,目前用了不到1%。

(15) -du

功能:统计文件夹的大小信息

[-du [-s] [-h] ...]

比如:

hadoop fs –du -s -h /aaa/*

(16)-chgrp

(17) -chmod

(18) -chown

功能:linux文件系统中的用法一样,对文件所属权限

比如:

hadoop fs -chmod 666 /aaa/bbb/cc/dd/a.txt

(19) -count

功能:统计一个指定目录下的文件节点数量

比如:

hadoop fs -count /aaa/

(20)-setrep

功能:设置hdfs中文件的副本数量

hadoop fs -setrep 2 /aaa/a.txt

现在默认是3个副本。这个是在 hdfs-site.xml中设置的。

可以通过setrep命令修改副本的数量。

Hadoop建议我们往HDFS中存储大文件,而不是小文件。因为这个会浪费块资源。小文件也需要进行合并处理。所以上面的 *** 作可以考虑使用大文件进行。

hadoop fs -copyFromLocal /export/softwares/jdk-8u141-linux-x64.tar.gz  /aaa/bbb/cc/dd/

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5700591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存