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]
[-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 }
[-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/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)