Hadoop架构之1.0
本文主要讲述Hadoop中HDFS的架构,详细的MapReduce将放到后面写一篇专门的博客
文章目录
- Hadoop架构之1.0
- hadoop1.0架构
- HDFS组件
- HDFS存储过程
- 写入操作
- 读取过程
- HDFS的不足
hadoop1.0架构
HDFS组件
- NameNode
- 管理整个文件系统的目录树结构和元数据信息
- 保管文件与Block块序列之间的对应关系,以及Block块与DataNode节点之间对应关系
- Block副本及其存储位置等管理数据
- DataNode状态监控
- 两者通过段时间间隔的心跳来传递管理信息和数据信息,通过这种方式的信息传递,NameNode 可以获知每个 DataNode 保存的 Block 信息、DataNode 的健康状况、命令 DataNode 启动停止等(如果发现某个 DataNode 节点故障,NameNode 会将其负责的 block 在其他 DataNode 上进行备份)
- 负责接受用户的操作请求
元数据管理操作:
**fsimage:**内存命名空间元数据在外存的镜像文件
**editlog:**各种元数据操作的write-ahead-log文件,在体现到内存数据变化前首先会将操作记入editlog中,以防数据丢失。
hadoop中的元数据管理主要通过fsimage文件和editlog文件进行操作,Secondary定期从NameNode中拉去fsimage和editlog,并对两个文件进行合并,形成新的fsimage传回NameNode中。
- Secondary
- 处理fsimage和editlog文件的合并
- 减轻NameNode的工作压力,提供检查点功能服务的服务点。(并不能作为NameNode的备份)
- DataNode
- 负责数据块的实际存储和读写工作
- Block默认是64MB,默认副本数为3
HDFS存储过程
写入操作
- client 调用DistributeFileSystem对象的create方法,创建一个文件输出流对象FSDataOutputStream
- 通过DistributeFileSystem对象与集群的NameNode进行一次RPC的远程调用,在HDFS中创建一个文件条目(Entry),此时该条目没有任何的Block,NameNode会返回该数据每个快需要拷贝的DataNode地址信息;
- 通过FSDataOutputStream对象,开始向DataNode写入数据,数据首先被写入FSDataOutputStream对象内部的数据队列中,数据队列由DataStreamer使用,它通过选择合适的DataNode列表来存储副本,从而要去NameNode分配新的Block
- DataStreamer将数据包以流式传输的方式传输到分配的第一个DataNode中,该数据流将数据包存储到第一个DataNode中,并将其转发到第二个DataNode中,接着第二个DataNode节点会将数据包转发到第三个DataNode节点。
- DataNode确认数据传输完成,最后由第一个DataNode通知client数据写入完成
- 完成向文件写入数据,Client在文件输出流(FSDataOutputStream)对象上调用close方法,完成文件写入
- 调用DistributeFileSystem对象的complete方法,通知NameNode文件写入成功,NameNode会将相关接锅记录到editlog中
读取过程
- client通过DistributeFileSystem对象与集群的NameNode进行一次RPC远程调用,获取文件block位置
- NameNode返回存储的每个块的DataNode列表
- client将连接到列表中最近的DataNode
- client开始从DataNode并行读取数据
- 一旦client获得了所有必须的block,他就会将这些block组合起来形成一个文件
HDFS的不足
- NameNode单点问题
NameNode只有一个,SecondaryNameNode同步备份数据存在一定的延迟,还是可能会存在数据丢失的问题 - 拓展性问题
NameNode在内存中存储了整个分布式文件系统中的元数据信息,并且只能有一台机器,无法拓展,NameNode的内存必然有其极限的地方 - 性能问题
HDFS中存储大量的小文件时,造成NameNode的内的文件目录极具庞大,造成节点内存压力加大,同时造成DataNode资源浪费 - 隔离性问题
单个NameNode难以提供隔离性,任务之间相互争抢CPU资源,相互影响