HDFS原理及其个元素功能

来源:互联网 发布:软件qa岗位职责 编辑:程序博客网 时间:2024/06/05 20:11
一 为什么要进行分块(block)存储?
    (流水线)
     线下数据放到一台datanode上,其他副本以流水线(pipeline)方式也叫管道方式复写到其他节点上

    便于文件的写入和读取,对于大数据文件分块存储时,一旦中间某一块写入失败namenode会记录该数据块的偏移量,将该块数据重新写入到其他block中而不至于从头写入,这样大大提高数据的写入效率.同样读取数据时当读到某一块出现问题时,会向namenode发送消息,namenode将该数据块副本返回给client,而不至于从头开始读取这样也提高了数据的读取需效率.

二 .什么是DFS,允许文件通过
  分布式存储数据,通过网络将数据写到远程端数据块中,每一块数据都有多个副本.
特点:
  通透性强:client只注重数据写入读取方式,不关心实现原理
  优点:
   处理PB级及其以上数据量
   注重数据吞吐量
   处理非结构化数据
   一次写入,多次读取
  缺点:
    不处理小文件
    不支持结构化数据
    不能对数据进行实时修改(可追加)

常见的DFS: HDFS,G(Google)FS,Lustre,TFS(淘宝FS)

三  HDFS的shell
   hadoop fs -lsr -R /
   hadoop  fs -count /

四 HDFS原理
   元数据:是对数据的描述信息就像记录本

   hdfs结点元素
   NameNode
   DataNode
   SecondaryNameNode
五  HDFS体系结构
   client从namenode查询元数据信息,将元素局信息返回给client,client根据返回的信息到datanode读取信息,client再去信息时遵循就近原则.client写入数据时,同样先访问namenode,namenode写判断要写入的文件是否重复,然后再为其分配datanode中block写入空间.client根据该信息去将数据写入的相应的block,同时复制数据块.复制数据块遵循
一定原则,第一块随机分配,第二个副本与第一个处于不同的机架中,第三个副本与第二个在同一机架的同一集群的节点上中.


六 元数据 存储细节:

  1 HDFS为保证数据的安全性,会将元数据保存两份一份位于内存中的namenode节点中  一份在内存中

另一份NameNode的metadata中磁盘保存在内存中

  NameNode(FileName,replicas,block-ids,id2host....),

 /test/a.log,3,{blk_1,blk_2},[{blk_1:[h0,h1,h3]},{blk_2:[h0,h2,h4]}])

 存放路径,副本数量,切分文件,存放的具体的block数据块
 在读取时,根据crc32校验和机制来判断该block中数据是否被损坏.

 

NameNode:
 整个文件系统的管理节点,接受用户操作请求,和datanode心跳机制

NameNode 主要构成元素:

1 fsimage:元数据的镜像文件即是内存中的元数(保存在磁盘中)据序列化的到磁盘之后的文件的名字
2 edits:记录操作过程
3 fstime:记录最近一次做还原点的时间

 

  NameNode的工作特点:
  NameNode始终在内存中保存metedata,用于处理用户的 读请求.
 写请求namenode会首先在写editlog日志,记录写入数据的位置,数量等信息,然后返回到客户端,同时hadoop会维护一个fsiamge文件,即是namenode中matedata的镜像,然后Secondary namenode会合并fisimage和edits文件来更新NameNode的metedata产生新的fsimage.

7 SecondaryNameNode工作流程
切换 下载 合并 发送
执行以上过程的时机有两点:
    一是fistime中checkpoint大于3600秒
    二是edits中数据量大于64MB

八 Datanode
提供真实文件数据的存储服务
主要元素:
    文件块(block):基本存储单位,hadoop2.0默认大小128MB





九  RPC=Remote Procedure Call远程调用协议

不同进程之间方法调用,一个项目组中的两个方法 可能是一个进程在上海另一个在北京.可以通过RPC调用

十   HDFS源码分析:
FileSystem fs FileSystem.get(new URI("hdfs://file/path"));
InputStream  in  = fs.open(new  Path("/test.txt"));
IOUtils.cpoyBytes(in,out,4096,true);





0 0