Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Hdfs

1,323 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Hdfs

  1. 1. HDFS源代码学习笔记<br />
  2. 2. 目录<br />Google File System体系结构<br />HDFS体系结构<br />具体设计:NameNode & DataNode<br />读文件块<br />写文件块<br />HDFS Federation体系结构<br />个人总结<br />
  3. 3. Google File System<br />
  4. 4. HDFS体系结构<br /> HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。<br />还有一个Secondary NameNode。周期性将NameNode的命名空间镜像文件和修改日志合并以防日志文件过大。<br />
  5. 5. 当前的体系结构提供两层服务:<br /><ul><li>命名空间的管理:</li></ul>管理目录、文件和块的命名空间,支持文件或目录的文件系统操作(创建、删除、修改等)。<br /><ul><li>块存储:
  6. 6. 块的管理(块的创建、删除等操作、副本的放置等)
  7. 7. 块数据的物理存储和访问。</li></li></ul><li>具体实现<br />NameNode实现:<br /><ul><li>命名空间的管理(Namespace Management):管理元数据信息(文件目录结构,具体文件由哪些block组成等)
  8. 8. 块的管理(Block Management):支持客户端对块文件的访问。</li></ul>DataNode实现:<br />块数据的物理存储和访问。Datanode向NameNode的块管理层(非命名空间管理层)注册以形成存储层。<br />
  9. 9. NameNode的详细设计<br />NameNode主要存储了元数据信息和支持客户端对文件的访问。主要包含两大类:NameNode服务器类(Server类和HttpServer类)和FSNamesystem类。FSNamesystem类实际负责文件系统的管理。而NameNode服务器类则主要向外提供RPC接口和HTTP接口等服务。<br />
  10. 10. 根据文件名定位文件块<br />NameNode主要工作之一就是向请求读写操作的客户端提供所处理文件在DataNode中的具体位置。<br />根据客户端提供的文件名查找该文件对应块所在的Datanode的详细位置,主要分两步:<br /><ul><li>沿着INodeDirectory所构建的目录树从根目录查找该文件所对应的所有块,即得到该文件的块列表。
  11. 11. 对于块列表中的每一块,从BlocksMap中保存的从Block到BlockInfo映射表中得到BlockInfo,而BlockInfo则记录该块所在的DataNode的描述信息(DataNodeDescriptor)。</li></li></ul><li>DataNode的详细设计<br />DataNode类中有一个FSDataSet类,该类用于对该DataNode上的整个存储空间进行管理。<br />Storage是Hadoop中最大的结构,而Block是DataNode上最小的结构。Storage类保存了和存储相关的信息。<br />一个DataNode上可指定多个Storage来存储块。由于HDFS规定了一个目录中能存放的Block数目,所以一个Storage上存在多个目录。对应的,FSDataset中用FSVolume来对应一个Storage,FSDir对应一个目录。所有的FSVolume通过FSVolumeSet管理,FSDataset中通过一个FSVolumeSet对象就可管理它的所有存储空间。<br />
  12. 12. 两大存储类<br />
  13. 13. 主要使用两大存储类来记录整个文件系统:FSDataset类与Storage类。<br />Storage类的FSVolume与Storage类的StorageDirectory相对应。<br />Storage类主要是通常的文件组织形式的逻辑结构,便于以常用I/O接口对其进行访问。<br />FSDataset类则主要针对hadoop自身访问特性而组织文件存储的另一种逻辑结构形式。<br />整个文件系统在本地磁盘中以Storage类来存储整个文件系统,而运行前必须将以Storage类存储的文件系统转换为FSDdataset类。<br />
  14. 14. DataNode的工作流程<br />启动DataNode之前需要与NameNode进行握手实现DataNode与NameNode布局版本一致。<br />初始化DataNode的FSDataset对象,即初始化该DataNode所管理所有的存储空间。<br />向NameNode注册,告知NameNode该DataNode的主机名、存储ID以及提供服务的端口号等信息(并没有告知详细的Block信息)。<br />进入循环,每隔一段时间向NameNode发送心跳(heartbeat),其中主要内容如下图所示:<br />NameNode根据接收到的心跳进行处理,并返回相应的命令给DataNode,使其继续执行工作。 <br />
  15. 15.
  16. 16. 上述DataNode与NameNode之间的交互始终围绕着如下原则进行:NameNode负责整个文件系统的命名空间的管理。真正的文件系统操作(读、写、修改等)的数据并不经过NameNode,而仅将这一过程反映到NameNode所管理的命名空间中,实际的工作是由DataNode来完成的。 <br />
  17. 17. 读文件过程<br />
  18. 18. 写文件过程<br />
  19. 19. 局限性<br /><ul><li>命名空间可扩展性</li></ul> 整个文件系统的元数据都存储在NameNode的内存中。节点的内存大小限制了元数据的大小。<br /><ul><li>性能可扩展性</li></ul> NameNode单个节点的吞吐量限制了整个文体系统操作的吞吐量。<br /><ul><li>隔离性(多租户环境下)
  20. 20. 可用性</li></li></ul><li>HDFS Federation体系结构<br />BlockPool:块集合。互不相交,每个块仅属于一个BlockPool。由块管理层管理。<br />Datanode提供共享存储层,存储该集群上归属于所有blockpool的文件块。<br />一个命名空间可使用多个BlockPool,一个BlockPool仅属于一个命名空间,不能跨越命名空间。但在最新的设计中,一个命名空间仅有一个BlockPool<br />
  21. 21. 各个NameNode之间是相互独立的,不存在相互之间的协调。<br />
  22. 22.
  23. 23. 个人总结与学习心得<br />HDFS的设计背景是用大量廉价、易出故障的机器组成集群来提供海量数据的存储服务,并且假设大量的读写访问,而修改则很少。因此,HDFS整个设计的核心就是保证可靠性(副本)以及快速实现文件的读写访问且以尽量少的代价来提供修改的服务。<br />阅读源代码时应多从设计者的角度来思考,这样有利于更好地理解源代码。<br />
  24. 24. Q&A<br />谢谢!<br />

×