结构

  • HDFS一个块默认大小64MB
  • 子节点可以没有NameNode
  • HDFS采用Java实现
  • 文件一旦写入就无法修改只能读取
  • HDFS安全性较弱
  • 不适合低延迟数据访问
  • 无法高效存储大量小文件

概念

默认块大小64MB,是处理的最小单位。

名称节点和数据节点

  • NameNode包括FsImage和EditLog。FsImage维护文件树,EditLog是操作日志。
  • NameNode不参与数据传输,除非将其也作为DataNode。

    通信协议

    采用TCP/IP协议。NameNode不乏其RPV,只响应RPC请求。

    局限性

  1. NameNode保存在内存中,能容纳的文件树受内存影响。
  2. 整个系统的吞吐量受NameNode限制。
  3. 只有一个NameNode,无法程序隔离
  4. NameNode坏了整个集群报废。

存储原理

  • 文件会在多个节点上保存副本。
  • SecondaryNameNode用于备份Master的NameNode。

数据读写过程

读数据

open->read->close

  1. 用FileSystem.open打开文件,创建DFSInputStream。
  2. 调用NameNode获取数据节点地址,记录在DFSInputStream的实例FSDataInputStream返回给客户端。
  3. read读数据,读一个Block,FSDataInputStream就关一个节点。
  4. close

    写数据

    create->write->close
    过程类似读数据,将Input换为Output
  • 数据会被分为分包,打包为数据包后发给第一个节点
  • 第一个节点存完后发给第二点节点
  • 每个节点都会收到全部的数据,在后一个节点告诉它后面的数据没问题(ACK)后,再把多余的数据删除。这个过程类似TCP通信。

应用实践

  • 可以通过Web路径直接访问文件
  • 可以用Java直接操作Hadoop