NameNode
功能
NameNode是整个文件系统的管理节点,它主要维护着整个文件系统的文件目录树,文件/目录的信息 和 每个文件对应的数据块列表,并且还负责接收用户的操作请求
- 目录树:表示目录之间的层级关系,就是我们在hdfs上执行ls命令可以看到的那个目录结构信息
- 目录信息:目录的的一些基本信息,所有者 属组 修改时间 文件大小等信息
- 数据块列表:如果一个文件太大,那么在集群中存储的时候会对文件进行切割,这个时候就类似于会给文件分成一块一块的,存储到不同机器上面。所以HDFS还要记录一下一个文件到底被分了多少块,每一块都在哪个节点存储。
- 接收用户的操作请求:我们无论使用命令行,还是相关的Java Api都是与NameNode进行通信之后才去操作数据
文件信息
- fsimage:元数据镜像文件,存储某一时刻NameNode内存中的元数据信息,就类似是定时做了一个快照操作。(元数据:文件目录树、文件/目录的信息、每个文件对应的数据块列表)
- edits:操作日志文件【事务文件】,这里面会实时记录用户的所有操作
- seen_txid:是存放transactionId的文件,format之后是0,它代表的是namenode里面的edits_*文件的尾数,namenode重启的时候,会按照seen_txid的数字,顺序从头跑edits_0000001~到seen_txid的数字。如果根据对应的seen_txid无法加载到对应的文件,NameNode进程将不会完成启动以保护数据一致性
- VERSION:集群的版本信息
SecondaryNameNode
功能
- 定期的把edits文件中的内容合并到fsimage中
- 合并操作称为checkpoint,在合并的时候会对edits中的内容进行转换,生成新的内容保存到fsimage文件中。
- PS:在NameNode的HA架构中没有SecondaryNameNode进程,文件合并操作会由standby NameNode负责实现所以在Hadoop集群中,SecondaryNameNode进程并不是必须的。
DataNode
功能
- 提供真实文件数据的存储服务
核心店
- Block:HDFS会按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block,HDFS默认Block大小是 128MB,Block块是HDFS读写数据的基本单位,不管你的文件是文本文件 还是视频或者音频文件,针对hdfs而言都是字节。HDFS中,如果一个文件小于一个数据块的大小,那么并不会占用整个数据块的存储空间。
- Replication:副本表示数据有多少个备份,默认这个参数的配置是3,副本只有一个作用就是保证数据安全。副本个数可以配置,在hdfs-site.xml中进行配置的,dfs.replication=副本数
总结
NameNode维护了两份关系
- 第一份关系:File 与Block list的关系,对应的关系信息存储在fsimage和edits文件中,当NameNode启动的时候会把文件中的元数据信息加载到内存中
- 第二份关系:DataNode与Block的关系,对应的关系主要在集群启动的时候保存在内存中,当DataNode启动时会把当前节点上的Block信息和节点信息上报给NameNode
Hdfs回收站
- HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户在Shell命令行删除的文件/目录,会进入到对应的回收站目录中,在回收站中的数据都有一个生存周期,也就是当回收站中的文件/目录在一段时间之内没有被用户恢复的话,HDFS就会自动的把这个文件/目录彻底删除,之后,用户就永远也找不回这个文件/目录了。
- 默认情况下hdfs的回收站是没有开启的,需要通过一个配置来开启,在core-site.xml中添加如下配置,value的单位是分钟,1440分钟表示是一天的生存周期
- 注意:如果删除的文件过大,超过回收站大小的话会提示删除失败,需要指定参数 -skipTrash ,指定这个参数表示删除的文件不会进回收站
Hdfs安全模式
- 集群刚启动时HDFS会进入安全模式,此时无法执行写操作
- 查看安全模式:hdfs dfsadmin -safemode get
- 离开安全模式:hdfs dfsadmin -safemode leave