HDFS 由三个基本组件组成: NameNode,SecondaryName,DataNode, 其思想类似于 Linux 的文件系统, 可以进行类比
1.NameNode 介绍:
1. 管理整个文件系统的命名空间, 内部维护了命名树
2. 存储元数据: 文件层级关系, 文件所有者及权限, 每个文件由哪些文件块组成 (但元信息中不包括每个块的位置) 内容通过 fsimage 及 edits 维护, 后文会详述
3. 接受客户端请求
2. 为什么 HDFS 倾向于存储大文件:
首先, NameNode 中存储一条元信息需要 200byte, 而元信息是保存在 NameNode 的内存中的, 不能分布式存储, 文件越小, 存储同样大小的内容元信息越大, NameNode 的内存有可能会成为系统存储的瓶颈
其次, 大文件减少了磁盘的寻道时间但是数据块过大也会出现问题, MapReduce 框架通常会为每个数据块启动一个进程, 数据块过大会使并行数量减少, 降低任务处理效率
3. 元信息持久化:
fsimage 是 NameNode 的元数据镜像文件, 用于存储某一时段内存的元数据信息, 而系统运行期间所有元信息的操作都保存在内存中并被持久化到另一个文件 edits 中, edits 会被周期性合并进 fsimage 中合并两个日志的操作显然会占用大量的 CPU, 内存及 IO, 而 NameNode 中的计算及存储资源是很宝贵的, 因此, 通常合并操作通常交给 SecondaryNameNode(注意, SecondaryNameNode 作用不是热备!)而 NameNode 本身通常也不会参与 MapReduce 计算和数据存储
4. 单点问题:
可以发现, HDFS 中 NameNode 是一个单点, 除了定期保存 fsimage 用于故障恢复外, 也可以在元数据写入同时将其实时同步到一个远程挂载的 NFS 上
5.SecondaryNameNode 作用:
1. 减少启动时 NameNode 合并日志的时间
2. 一定程度上减少了 NameNode 的单点问题
2.DataNode
1. 负责存储数据块, 响应客户端读写(注意, 客户端直接读写 DataNode, 而非经过 NameNode)
2. 根据 NameNode 发送的指令创建, 删除和复制文件
3. 定期向 NameNode 发送心跳, 报告文件块列表信息
4. 为了安全, 提供了数据块冗余, 默认为 3 个副本数据块默认为 64MB
5. 数据完整性问题:
存储和处理数据时数据有可能发生错误或丢失, HDFS 会对写入的数据计算校验和
参考:
http://www.cnblogs.com/sunddenly/category/611923.html
来源: https://www.cnblogs.com/showing/p/8609802.html