我们都知道HDFS是来源于Google的GFS的分布式系统,它的特点是易于扩展,同时可以开发于廉价的机器上,同时他可以保证所有文件的备份数据维持在健康的数量上,同时非常适合进行批处理,因为设计之处就是在大数据文件大量的操作是顺序读的操作,同时也非常适合流处理。
HDFS缺点:
- 不适合低延时访问
- 不适合存储小文件
- 不支持并发处理和随机修改
将文件完整存储在一个机器有什么问题?可以在其他机器上进行备份。
首先将一个文件存储在一个机器上,然后再将其备份三份分别存储在不同的机器上,这会造成负载不均衡,比如一个文件特别大,而存储在一个机器上会导致这个机器上存储的量特大,同时也会造成网络的压力,因为机器读取数据全都在一个机器上。
HDFS解决这个问题采取的策略是通过将文件分割为等大的block块,大小一般为128MB,然后将其均匀的分布在不同的机器上,解决网络压力的策略是通过顺序写实现的,首先将数据库写入与其相近的机器上,在由这个机器写如下一个机器,这样给写入的客户端减轻了压力。
HDFS架构
- Active Namenode
主master只有一个,主要负责管理HDFS的命名空间,管理数据块间的映射信息,管理副本的策略,以及处理客户端的请求。 - Standby Namenode
Namenode的热备,负责定期的合并fsimages和editLog用于推送给Namenode代替了Second namenode,当Namenode出现故障理解切换为active Namenode - Datanode
用于存储数据,存在多个,执行数据的读/写 - Client
负责切分数据,与Namenode交互获取Datanode的位置,与DataNode交互负责读写数据,管理和访问HDFS.
为什么HDFS中块的大小比磁盘的块大?
其目的是为了最小化寻址开销,从磁盘传输的时间会大于定位磁盘块的时间,这样传输一个由多个块组成的文件的速率主要取决于磁盘的传输速率。
HDFS块分布策略
要想认识到HDFS的块分布的策略,首先要明白在公司中一个集群由大量的主机组成,大约60个主机组成一个机架,每一个机架使用一个交换机连接成,而多个机架又有外部的交换机连接。
同一个机架上的节点的传输,由于经过的交换机的数量较少,所以传输的速度快。但是主机的损坏,一般会比较集中与一台主机。
HDFS通过机架感知策略进行块的分布,1/3的块的节点备份存储在一个机架上,2/3的块分布在相邻的机架的主机上。
HDFS的可靠性策略
HDFS的常见的三种错误情况是:
- 1.文件的损坏,为了保证文件的完整性,HDFS使用CRC校验码,大约1小进行校验一次。
- 2.网络或机器的实效,HDFS采用的是被动的方式,主要是DataNode向Namenode进行发送心跳。
- Namenode挂掉
HDFS通过检查点让EditLog向fsimages合并,并上传给Namenode,同时对namenode进行多备份,同时实行standby Namenode进行主备切换机制。
HDFS为什么不适合存储大量小文件?
由于HDFS为了解决负载均衡的机制,将大数据文件分割为同样大小的块,冗余的存储在不同的节点,使用NameNode记录块的元信息,但是当节点的数据不足一个块大小时,HDFS也会把其作为一个块,元信息的大小不变,大约150byte,但是元信息时存储在Namenode的内存中存储时有限的,同时根据为什么把HDFS中的块切分这么大?我们知道小文件的寻道时间会大于传输时间,这就好吧拷贝一个大文件用时比拷贝很多小文件少一样的。
HA与Federation
HA指的是同一集群中的一个热备用的“主/备”两个冗余NameNodes。这允许在机器宕机或系统维护的时候,快速的转移到另一个NameNode.
Federation就像其名字一样“联邦”,namenode不只有一个,存在多个namenode,每一个namenode负责一个独立的命名空间。
HDFS权限管理ACL
首先我们说之前HDFS采用的完全是linux文件系统的权限,但是存在一定问题,比如原本一个文件,可以被用户a读取,team1读取,但是之后别的team2也需要读权限,改动起来就特麻烦
HDFS ACL 基于POSIX ACL
hdfs dfs -setfacl -m usr/group:rw- /local/data
就可以给其他人添加权限
HDFS缓存
在之前的版本上HDFS使用的是操作系统的缓存,但是我们都知道HDFS是冗余的存储机制,所以可能一个block被三次同时缓存了,同时在Hadoop2.0中允许加入其他的计算模型,更需要对资源进行管理,和进行cpu,和缓存的分配。
HDFS主要让用户显式的将一个文件加入缓存,不会自动加入,可以设置缓存的失效时间。每个DataNode独立设置,不受Yarn管理。
HDFS访问
HDFS shell
HDFS shell基本是仿照linux命令设计的只需要在前面添加hadoop/hdfs
上传文件
hadoop fs -copyFromLocal /local/data /hdfs/data
删除文件/目录
hadoop fs -rmr /hdfs/data
HDFS管理命令
离开安全模式
hadoop dfsadmin -safemode leave
hdfs fsck文件管理命令
- 可以检测HDFS中文件的健康状况
- 查找缺失的块,以及过少或过多的块
- 查看一个文件所有的块位置
- 删除损坏的块
hdfs balancer
start-balancer.sh -threshold 可以重新分配块的位置
增加和删除节点
增加
- 在一个节点中安装已存在的datanode安装包
- sbin/hadoop-deamon.sh start datanode
删除
- 将datanode加入黑名单中,配置在dfs.hosts.exclude中
- bin/hadoop dfsadmin -refreshNodes