结构
- HDFS一个块默认大小64MB
- 子节点可以没有NameNode
- HDFS采用Java实现
- 文件一旦写入就无法修改只能读取
- HDFS安全性较弱
- 不适合低延迟数据访问
- 无法高效存储大量小文件
概念
块
名称节点和数据节点
- NameNode包括FsImage和EditLog。FsImage维护文件树,EditLog是操作日志。
- NameNode不参与数据传输,除非将其也作为DataNode。
通信协议
采用TCP/IP协议。NameNode不乏其RPV,只响应RPC请求。局限性
- NameNode保存在内存中,能容纳的文件树受内存影响。
- 整个系统的吞吐量受NameNode限制。
- 只有一个NameNode,无法程序隔离
- NameNode坏了整个集群报废。
存储原理
- 文件会在多个节点上保存副本。
- SecondaryNameNode用于备份Master的NameNode。
数据读写过程
读数据
open->read->close
- 用FileSystem.open打开文件,创建DFSInputStream。
- 调用NameNode获取数据节点地址,记录在DFSInputStream的实例FSDataInputStream返回给客户端。
- 用read读数据,读一个Block,FSDataInputStream就关一个节点。
- close
写数据
create->write->close
过程类似读数据,将Input换为Output
- 数据会被分为分包,打包为数据包后发给第一个节点
- 第一个节点存完后发给第二点节点
- 每个节点都会收到全部的数据,在后一个节点告诉它后面的数据没问题(ACK)后,再把多余的数据删除。这个过程类似TCP通信。
应用实践
- 可以通过Web路径直接访问文件
- 可以用Java直接操作Hadoop