HDFS1.0
记录存储文件block的位置
namenode
-
管理着文件系统命名空间
– 维护着文件系统树及树中的所有文件和目录 -
存储元数据
– NameNode保存元信息的种类有:
• 文件名目录名及它们之间的层级关系
• 文件目录的所有者及其权限
• 每个文件块的名及文件有哪些块组成
• 元数据保存在内存中
– NameNode元信息并不包含每个块的位置信息
• 保存文件,block,datanode之间的映射关系
- SecondNameNode
-是namenode的小秘书
Datanode
• 负责存储数据块,负责为系统客户端提供数据块的读写服务
• 根据NameNode的指示进行创建、删除和复制等操作
• 心跳机制,定期报告文件块列表信息
• DataNode之间进行通信,块的副本处理
- 数据块——磁盘读写的基本单位
– HDFS默认数据块大小64MB
– 磁盘块一般为512B
– 原因:块增大可以减少寻址时间,降低寻址时间/文件传输时间,若寻址
时间为10ms,磁盘传输速率为100MB/s,那么该比例仅为1%
– 数据块过大也不好,因为一个MapReduce通常以一个块作为输入,块过
大会导致整体任务数量过小,降低作业处理速度
Hadoop更倾向存储大文件原因:
- 一般来说,一条元信息记录会占用200byte内存空间。假设块大
小为64MB,备份数量是3 ,那么一个1GB大小的文件将占用
163=48个文件块。如果现在有1000个1MB大小的文件,则会占
用10003=3000个文件块(多个文件不能放到一个块中)。我们
可以发现,如果文件越小,存储同等大小文件所需要的元信息就
越多,所以Hadoop更喜欢大文件。
元信息持久化
– 在NameNode中存放元信息的文件是fsimage。在系统运行期间
所有对元信息的操作都保存在内存中并被持久化到另一个文件
edits中。并且edits文件和fsimage文件会被
SecondaryNameNode周期性的合并
• 运行NameNode会占用大量内存和I/O资源,一般
NameNode不会存储用户数据或执行MapReduce任务。
hafs HA high availability
在HA的集群里头,两台独立的机器会被个配置成为一个NameNode。在任何时刻,只能有一个namenode是active的,另外一个是standby状态。active的namenode是负责来自client的所有请求操作,而standby则在待命随时准备成为active的namenode。
为了保持namenode active和namenode standby 之间的同步,两个namenode之间通过一个叫做JournalNodes的守护进程来保持同步的。当namenode active的namespace有被修改的时候,namenode active会把这些操作日志记录在journalnodes上。然后namenode standby就会从journalnodes的edits上读取这些操作日志。当namenode拿到edits操作日志之后,它就会把日志的操作应用到自己的namespace里头。一旦namenode active出现问题,namenode standby就可以确保自己在成为namenode active之前,自己已经读取了所有的edits操作日志。
为了提供一个快速的热备切换,就需要namenode standby时刻知道block的位置信息,要实现这一点,datanode节点配置了namenode的信息,然后datanode主动把block的位置信息和心跳数据发送给两个namenode。
确保任何时候只有一个active的namenode是至关重要的,否则,可能导致数据丢失和一些严重后果。journalnodes会保证同一时刻只有一个namenode active。在热备切换的时候,即将成为active的namenode standby会接管writer的角色。