Hadoop架构之1.0

Hadoop架构之1.0

本文主要讲述Hadoop中HDFS的架构,详细的MapReduce将放到后面写一篇专门的博客

hadoop1.0架构

Hadoop架构之1.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存储过程

写入操作

Hadoop架构之1.0

  1. client 调用DistributeFileSystem对象的create方法,创建一个文件输出流对象FSDataOutputStream
  2. 通过DistributeFileSystem对象与集群的NameNode进行一次RPC的远程调用,在HDFS中创建一个文件条目(Entry),此时该条目没有任何的Block,NameNode会返回该数据每个快需要拷贝的DataNode地址信息;
  3. 通过FSDataOutputStream对象,开始向DataNode写入数据,数据首先被写入FSDataOutputStream对象内部的数据队列中,数据队列由DataStreamer使用,它通过选择合适的DataNode列表来存储副本,从而要去NameNode分配新的Block
  4. DataStreamer将数据包以流式传输的方式传输到分配的第一个DataNode中,该数据流将数据包存储到第一个DataNode中,并将其转发到第二个DataNode中,接着第二个DataNode节点会将数据包转发到第三个DataNode节点。
  5. DataNode确认数据传输完成,最后由第一个DataNode通知client数据写入完成
  6. 完成向文件写入数据,Client在文件输出流(FSDataOutputStream)对象上调用close方法,完成文件写入
  7. 调用DistributeFileSystem对象的complete方法,通知NameNode文件写入成功,NameNode会将相关接锅记录到editlog中

读取过程

Hadoop架构之1.0

  1. client通过DistributeFileSystem对象与集群的NameNode进行一次RPC远程调用,获取文件block位置
  2. NameNode返回存储的每个块的DataNode列表
  3. client将连接到列表中最近的DataNode
  4. client开始从DataNode并行读取数据
  5. 一旦client获得了所有必须的block,他就会将这些block组合起来形成一个文件

HDFS的不足

  • NameNode单点问题
    NameNode只有一个,SecondaryNameNode同步备份数据存在一定的延迟,还是可能会存在数据丢失的问题
  • 拓展性问题
    NameNode在内存中存储了整个分布式文件系统中的元数据信息,并且只能有一台机器,无法拓展,NameNode的内存必然有其极限的地方
  • 性能问题
    HDFS中存储大量的小文件时,造成NameNode的内的文件目录极具庞大,造成节点内存压力加大,同时造成DataNode资源浪费
  • 隔离性问题
    单个NameNode难以提供隔离性,任务之间相互争抢CPU资源,相互影响

MapReduce架构

MapReduce组件

MapReduce数据处理过程

MapReduce不足