存储模型
- 按照字节存储,文件线性切割成块(Block):偏移量 offset (byte)
一个文件切割成5块,一块3个字节,第二块的偏移量是4 - Block分散存储在集群节点中,单一文件Block大小一致,文件的大小与文件的Block大小可以不一致
- Block可以设置副本数,副本分散在不同的节点中(提高可靠性)副本不要超过节点数量
- 已上传的文件的Block副本数可以调整,大小不变
- 只支持一次写入多次读取,同一时刻只有一个写入者
- 可以append追加数据
架构模型
- 主从架构(Master/Slaves架构)
- 由一个NameNode节点和多个DataNode节点组成
- NameNode节点保存文件的元数据(单节点),DataNode保存文件Block数据(多节点)
- 面向文件包含:文件数据Data,元数据Metadata:文件描述信息
- NameNode负责存储和管理文件元数据,并维护一个层次型的文件目录树
- DataNode负责存储文件Block,并提供Block的读写
- DataNode与NameNode保持心跳,提交Block列表
- HdfsClient与NameNode交互元数据信息
- HdfsClient与DateNode交互文件Block数据
角色介绍
角色即进程
NameNode(NN)
一个NameNode负责管理多个DataNode
NameNode特性
1.基于内存存储,不会和磁盘发生交换
2.只存在内存中
3.持久化
内存掉电易失,通过快照(fsimage)+日志文件(edits)实现持久化,快照只能是定时记录,容易丢失部分数据,所以要结合日志文件
掉电后,上电时先把快照加载到内存,然后增量执行日志
NameNode主要功能
1.接受客户端的读写服务
2.收集DataNode汇报的Block列表信息
NameNode保存的metadata(元数据)信息
1.文件overship和permissions
2.文件大小、时间
3.Block列表:Block偏移量
Block每个副本的位置(由DateNode上报,NameNode不保存)
DataNode(DN)
- 本地磁盘目录存储数据(Block),文件形式
同时存储块的md5(校验文件完整性) - 启动DN时会向NN汇报Block信息
- 通过向NN发送心跳保持与其联系(3s一次),如果NN10分钟没有收到DN心跳,则认为其已经lost,并copy其上的Block到其他DN
Block副本放置策略
- 第一个副本:放置在上传文件的DN。如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点
- 第二个副本:放置在与第一个副本不同机架的节点上
- 第三个副本:与第二个副本相同机架的节点
- 更多副本:随机节点
Hdfs读写流程
写流程
- 客户端和NameNode请求块的3个位置
- NameNode根据副本存放规则返回3个位置
- 客户端根据3个位置做pipeline,以更小的包做流式传输
更小的包:把一个块切分成更小的块逐个传输
流式:第一个小块传输到DN1后,第二个小块继续向DN1传输的同时,DN1上一个小块就可以同步进行副本传输到DN2,实现了时间上的并行传输 - 第一个块传完后线性处理第二个块
- 节点各自心跳汇报,时间也重叠,块的副本数对客户端透明,传输时间约等于一个文件的传输时间,不会因为副本数增加
读流程
- 客户端和NameNode获取文件信息
1.距离优先:每个块有多个副本,每个副本和客户端的距离排序
2.下载任意块:全部,部分,一个 - 客户端根据NameNode返回信息从DateNode获取文件
- hdfs很好的支持了本地化读取
安全模式
- Hadoop搭建时会格式化,格式化操作会产生一个空的FsImage
- NameNode启动的时候,首先将印象文件(FsImage)载入内存,并执行编辑日志(EditLog)中的各项操作
- 一旦内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件和一个空的编辑日志
- 此刻NameNode运行在安全模式,即ND的文件系统对于客户端是只读的
- 此阶段ND收集个DN的报告,当数据块被确定安全后,再过若干时间,安全模式结束
- 当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置信息并不是ND位数的,而是以块列表形式存储在DN中