随着信息技术的高度发展,数据量越来越多,当一个操作系统管辖范围存储不下时,只能将数据分配到更多的磁盘中存储,但是数据分散在多台磁盘上非常不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,因此诞生了分布式文件系统。HDFS(Hadoop Distribute File System)是一种能运行在通用硬件上的分布式文件系统,具有高度容错的特点,适合部署在廉价的机器上。
由于hadoop1和hadoop2版本差异较大,本文以下部分如未标记特殊说明则默认指的是hadoop2版本
1、数据块(block)
与普通文件系统类似,HDFS也有数据块的概念,默认数据块block大小为64M。不同于普通文件系统的是,在HDFS中,如果一个文件小于数据块的大小,并不占用整个数据块存储空间。
2、元数据节点(namenode)和数据节点(datanode)
hadoop1版本中只存在一个namnode节点,存在单点故障风险,在hadoop2版本中引入了HDFS联盟的概念,即包含多个HDFS系统,同时也包含多个namenode节点。
namenode节点的作用:① 接收用户操作请求;② 维护文件系统的目录结构;③ 管理文件与block的关系(哪些block属于哪些文件),block与datanode之间的关系。
datanode数据节点的作用:①存储文件数据;②存储文件数据block副本(默认存储3份)。
3、HDFS特点
HDFS允许文件通过网络在多台主机上分享,并让多机器上的多用户分享文件和存储空间,其具有下述两个特性:① 通透性,让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般; ② 容错性,即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据丢失。
当HDFS数据块小于一个block大小时,并不占用整个block大小,也即是说文件大小=实际占用空间。这一点与Windows操作系统的文件簇不一样,在Windows操作系统中,一个小于簇大小的文件实际占用空间也是一个簇。HDFS不支持并发写的情况,且不适合小文件。
1、namenode元数据结构
在hadoop-2.6.0中,NameNode元数据存储在${hadoop.tmp.dir}/dfs/name/current路径中。可通过dfs.namenode.name.dir配置结构,强烈建议配置多个备份路径,配置格式如:/name1/dfs/name,/name2/dfs/name,/name3/dfs/name等,特别推荐配置一个网络文件系统NFS,最大限度地保证元数据的完整性。hadoop-2.6.0的路径${hadoop.tmp.dir}/dfs/name下,有锁文件in_use.lock和文件夹current,文件夹current下存在以下文件:① VRSION属性文件;② seen_txid文件;③ 大量edits文件;④ 少量fsimage文件。
其中seen_txid是存放transactionId的一个重要文件,format之后是0,它代表的是namenode里面的edits_*文件的尾数,namenode重启的时候,会按照seen_txid的数字,循序从头跑edits_0000001~到seen_txid的数字。所以当hdfs发生异常重启的时候,一定要比对seen_txid内的数字是不是你edits最后的尾数,否则很可能丢失数据。VERSION文件是Java属性文件,其文件内容和说明如下所示:
#Thu Mar 19 19:52:29 PDT 2015
namespaceID=605992118 #namespaceID是文件系统的唯一标识符,在文件系统首次格式化之后生成的
clusterID=CID-fd97cef9-ffad-48ac-b15b-e715501d73f4 #clusterID是系统生成或手动指定的集群ID,在-clusterid选项中可以使用它
cTime=0 #cTime表示NameNode存储时间的创建时间,由于我的NameNode没有更新过,所以这里的记录值为0,以后对NameNode升级之后,cTime将会记录更新时间戳
storageType=NAME_NODE #storageType说明这个文件存储的是什么进程的数据结构信息(如果是DataNode,storageType=DATA_NODE)
blockpoolID=BP-1535557182-192.168.137.101-1426745680483 #blockpoolID是针对每一个Namespace所对应的blockpool的ID,上面的这个BP-893790215-192.168.24.72-1383809616115就是在我的ns1的namespace下的存储块池的ID,这个ID包括了其对应的NameNode节点的ip地址
layoutVersion=-60 #layoutVersion表示HDFS永久性数据结构的版本信息, 只要数据结构变更,版本号也要递减,此时的HDFS也需要升级,否则磁盘仍旧是使用旧版本的数据结构,这会导致新版本的NameNode无法使用