HDFS分布式文件系统简单介绍

 解决问题:
        海量数据的存储    ->    分布式架构设计
         分布式-特点:集群,多台机器共同协作完成
                               主从架构设计
    1.namenode - 主节点 - 领导
        存储文件的元数据包括的内容如下:

>>>文件的名称
>>>文件的位置
>>>副本数
>>>拥有者、组、权限
    在某个用户的底下创建了某个文件,这个文件的拥有着就是该用户
>>>存储块
   文件系统中,对文件的存储是以块的大小来存储的,而且块是有固定大小的。为256M
>>>各个块在哪些datanode节点上

2.datanode - 从节点 - 随从
        机架:
            对于处于连接同一个交换机的物理机,划分为同一个机架上
        对于数据的备份存储:
            至少一个文件的副本数,要在不同的机架上
            当其中一个文件有问题,优先选择物理拓扑结构上离该文件最近的恢复,
            如果机架有问题,还可以从另外一个机架上获取文件  
    3.读文件的原理
        client    ->    namenode
        client    ->    datanode  
        就近原则,根据网络拓扑的就近原则,跨机架拿,会消耗网络资源。
        其实可以通过java代码读写HDFS上的数据
        此处摘抄《hadoop权威指南》一书中的细节描述:

>>客户端通过调用FileSystem对象的open()方法,来打开希望读取的问题件,对HDFS来说,这个对象是>>DistributeFileSystem通过使用远程过程调用(RPC)来调用 namnode,以确定文件起始块的位置
  此外,这些datanode根据它们与客户端的距离来排序(根据集群中的网路拓扑)
  如果该客户端本身就是一个datanode,那么该客户端将会从保存有相应数据块副本的本地datanode读取数据
>>DistributeFileSyste类返回一个FSDataInputStream对象,客户端对这个输入流调用read()方法
>>通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端
>>到达块的末端时,DFSInputStream关闭与该datanode的连接,然后寻找下一个块的最佳datanode
>>客户端从流中读取数据时,块是按照打开DFSInputStream与datanode新建连接的顺序读取的,它也会根据需要询问namenode来检索下一批数据块的datanode位置
 一旦客户端读取完成,就对FSDataInputStream调用close()方法

 4.写文件的原理
     此处摘抄《hadoop权威指南》一书中的部分描述

>>客户端通过对DistributedFileSystem对象调用create()来新建文件,
>>DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件
>>namenode执行各种不同的价差以确保这个文件不存在以及客户端有新建该文件的权限。如果这些检车通过,namenode就会为创建新文件记录一条记录
>>在客户端写入数据时DFSoutputStream将数据分成一个一个数据包(一般问64k),并写入内部队列,称为“data queue”
>>dataStreamer处理数据队列,它的责任是挑选出适合存储数据副本的一组datanode,并据此要求namenode分配新的数据块,这一组datanode构成一个管线,我们假设副本书为3,所以管线中有3个节点,DataStreamer将数据包流式传输到管线中第一个datanode,该datanode存储数据包,并将它发送到管线中的第二个datanode,同样,第二个datanode存储该数据包并且发送给管线中的第三个datanode
>>DFSOutputstream也维护着一个内部数据包队列来等待datanode的收到确认回执,称为确认队列,收到管道中所有datanode确认信息后,该数据包从确认队列中删除
>>客户端完成数据的写入后,对数据流调用close方法
>>将生于所有数据包写入datanode管线,并联系到namenode告知其文件写入完成之前,等待确认。这样namenode在返回成功之前只需要等待数据块进行最小量的复制。


            

猜你喜欢

转载自blog.csdn.net/sinat_37513998/article/details/82559633
今日推荐