• HDFS基础


    hdfs原理,以及各个模块的作用

    Client:切分文件;访问或通过命令行管理HDFS;与NameNode交互,获取文件位置信息;与DataNode交互,读取和写入数据。 
    
    NameNode:Master节点,只有一个,管理HDFS的名称空间和数据块映射信息;配置副本策略;处理客户端请求。 
    
    DataNode:Slave节点,存储实际的数据;执行数据块的读写;汇报存储信息给NameNode。
    
    Secondary NameNode:辅助NameNode,分担其工作量;定期合并fsimage和fsedits,推送给NameNode;紧急情况下,可辅助恢复NameNode,但Secondary NameNode并非NameNode的热备。

    Hdfs文件读取

    1.首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例 
    
    2.DistributedFileSystem通过rpc获得文件的第一批个block的locations,同一block按照重复数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面. 
    
    3.前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接。 
    
    4.数据从datanode源源不断的流向客户端。 
    
    5.如果第一块的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。 
    
    6.如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。

    Hdfs的文件写入

    1.客户端通过调用DistributedFileSystem的create方法创建新文件 
    
    2.DistributedFileSystem通过RPC调用namenode去创建一个没有blocks关联的新文件,创建前,namenode会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,namenode就会记录下新文件,否则就会抛出IO异常. 
    
    3.前两步结束后会返回FSDataOutputStream的对象,和读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream,DFSOutputStream可以协调namenode和datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列data quene。 
    
    4.DataStreamer会去处理接受data quene,他先问询namenode这个新的block最适合存储的在哪几个datanode里,比如重复数是3,那么就找到3个最适合的datanode,把他们排成一个pipeline.DataStreamer把packet按队列输出到管道的第一个datanode中,第一个datanode又把packet输出到第二个datanode中,以此类推。 
    
    5.DFSOutputStream还有一个对列叫ack quene,也是有packet组成,等待datanode的收到响应,当pipeline中的所有datanode都表示已经收到的时候,这时akc quene才会把对应的packet包移除掉。 
    
    6.客户端完成写数据后调用close方法关闭写入流 
    
    7.DataStreamer把剩余得包都刷到pipeline里然后等待ack信息,收到最后一个ack后,通知datanode把文件标示为已完成。

    Hdfs的块存储位置放置机制

    如果写请求方所在机器是其中一个datanode,则直接存放在本地,否则随机在集群中选择一个datanode. 
    
    第二个副本存放于不同第一个副本的所在的机架. 
    
    第三个副本存放于第二个副本所在的机架,但是属于不同的节点.

    Hdfs的块的流水式复制

    当客户端写数据到HDFS文件中时,如上所述,数据首先被写入本地文件中,假设HDFS文件的复制因子是3,当本地文件堆积到一块大小的数据,客户端从名字节点获得一个数据节点的列表。这个列表也包含存放数据块副本的数据节点。当客户端刷新数据块到第一个数据节点。第一个数据节点开始以4kb为单元接收数据,将每一小块都写到本地库中,同时将每一小块都传送到列表中的第二个数据节点。同理,第二个数据节点将小块数据写入本地库中同时传给第三个数据节点,第三个数据节点直接写到本地库中。一个数据节点在接前一个节点数据的同时,还可以将数据流水式传递给下一个节点,所以,数据是流水式地从一个数据节点传递到下一个。

  • 相关阅读:
    YYModel Summary
    Custom-->TableView_Swizzle
    创建UIBarButtonItem的分类
    为家庭版系统添加组策略
    JSDOM
    JavaScript
    python基础三元表达式和内置函数列表
    二.ubuntu14.04 3D特效设置
    一.ubuntu14.04安装、亮度设置、显卡设置等一体化讲解
    oracle12c及PLSQL Developer安装全程记录
  • 原文地址:https://www.cnblogs.com/wakerwang/p/9498970.html
Copyright © 2020-2023  润新知