HDFS是HADOOP的分布式文件系统,它的设计目标是存储海量数据,为网络中的大量客户端提供数据访问。
在hdfs中单个文件被拆分多个固定大小的block,保存在各个datanode中,访问一个文件通常需要访问多个datanode才能获取完整的数据。
datanode中的一个block是以单独的文件形式保存的,并提供对metadata的快速访问结构。每个metadata较小,为了保证随机快速访问是存放在namenode节点的内存中,metadata在设计上也是非常紧凑的,所以即使一个内存很小的namenode也能支持超大数据的访问。
元数据存储在内存中存储同时也是持久化的,当metadata修改后会存储在本地文件FsImage中,同时使用事务日志EditLog记录每次变动列表。
HDFS的namenode基于主从架构,避免单点故障,失效转移。从namenode维护2个数据结构,metadata镜像文件及EditLog。
block默认是64M或128M,并不意味着小文件(小于64M)会任然占用64M的存储空间。实际上小文件只占用它实际需要占用的磁盘空间。这不是说大量的小文件对整个hdfs文件系统没有影响:实际上当大量的小文件会占用大量的metadata,而metadata的大小是固定的,从而给整个hdfs的查询、扩展上上来带了负面影响。
datanode的复制:如果没有datanode复制功能,可以想的到的缺陷,文件被拆分成多个block存放在不同的datanode上,如果其中的某台datanode出现了故障,整个文件将不能还原。为了避免此问题,hdfs提供在多台机器上进行复制过程,默认是3台,在配置datanode复制因子的时候,填写2即可。
在hdfs中block的复制是写操作中的一部分,文件通过客户端写入到某个datanode中,当写入的数据满足一个block大小时,就向namenode申请复制,namenode会分配一个datanode进行复制,并记录该block的datanode列表,知道该block的列表长度达到设定的数量时不再分配datanode。
在复制过程中,如果分配的datanode发生了故障,namenode会再分配一个datanode进行重新复制,并将无效的datanode从列表中移除。当block复制完成后,通知namenode复制完成,列表长度+1;
namenode会每3s接收datanode的心跳报告,通过报告验证datanode上的信息和metadata存储的信息一致。namenode利用这些心跳来标识datanode是否失效,失效的记为死机状态,不再向其发送任何io操作,除非datanode再次向namenode发送心跳。
HDFS重要特性:机架感知,如果一个block存放的datanode在不同机架上(或不同的地理位置),获取文件的最快速度就是从同一机架或机房上获取block。最简单的策略就是每个机架(地区)上都有一份block副本,在整个机架丢失数据也不会丢失同时也做到了数据均匀分布,但这样对于写操作消耗较大,每次写都要复制到不同的机架(地区)上。
机架感知策略可以理解为,metadata记录了每个block副本的ip地址,通过ip段匹配策略来区分哪个block离该namenode最近,视为最近的block。以减少跨机架(地区)IO。
HDFS文件的操作:hdfs shell或客户端 。