1、HDFS默认分块64M,一个文件可能被分成多个快存储。
2、HDFS的nameNode和dataNode
NameNode存储元数据,存储在内存中,保存文件、block、datanode之间的映射关系,起到数据目录的作用;
DataNode存储数据,文件保存到磁盘,维护了dataNode id 与本地文件映射关系。
NameNode的数据结构:FsImage,维护文件树以及文件树中文件,文件夹的关系。FsImage没有记录快存储在哪一个数据节点上,而是由名称节点把这些映射保存在内存中,数据节点会把自己所包含的块列表上报给名称节点,并定期执行这个操作;
EditLog记录了所有针对文件的创建、删除、重命名等操作。
名称节点启动的时候,会首先将FsImage的内容加载到内存中,然后执行EditLog文件中的操作,保证内存中的元数据与实际同步。一旦内存中成功建立文件系统元数据的映射,则创建一个新的FsImage和一个空的EditLog文件。因为FsImage可能很大,所以每一次名称节点起来以后,会对FsImage和EditLog进行合并,生成一个新的FsImage和空的EditLog,删除原来的FsImage ,所以每一次更新从EditLog读取。
3、随着对HDFS的不断操作,EditLog也会不断变大,这时候SecondryNameNode起作用了,SecondryNameNode的工作情况:
1)定期与namenode通信,请求其停止使用EditLog,暂时将新的写操作写到一个新文件edit.new上;这个操作瞬间完成,上层基本感受不到;
2)SecondryNameNode通过http get请求,将namenode的EditLog和FsImage下载到本地相应的文件目录下;
3)SecondryNameNode合并FsImage和EditLog;
4)SecondryNameNode post新的FsImage到namenode上;
5)nameNode接收到FsImage后,替换掉原来的FsImage,并且edit.new替换掉原来的EditLog,从而减小EditLog。
4、数据节点
数据节点会根据客户端或者namenode的调度进行数据的存储和检索,并定期向namenode发送自己的存储块的列表;
数据节点的数据是存储在本地的Linux文件系统中。
5、HDFS采用Master/slave结构,HDFS的命名空间包括目录、文件、块,和传统的分级文件系统一致。
6、HDFS使用的是TIC/IP协议,客户端通过TCP协议向名称节点发起请求并且使用的是客户端协议进行交互;
名称节点与数据节点使用数据节点协议进行交互。客户端与数据节点的交互是用的是RPC协议。
名称节点不会主动发起RPC交互,二是响应客户端和数据节点的RPC请求。
7、HDFS的冗余存储
HDFS采用多副本方式对数据进行冗余存储,通常一个数据块的多个副本保存在不同的数据节点上;
优点:加快数据传输;容易检查数据错误;保证数据的可靠性。
8、多副本冗余备份的数据存取策略
第一副本放在上传文件的数据节点;如果是分布式,则随机选取一个cpu和磁盘不太忙的节点存储;
第二副本放在与第一副本不同机架的节点上;
第三副本放在与第一副本相同机架不同的数据节点上。
9、多副本的读取策略
HDFS提供API确定数据节点机架ID,客户端也可以调用APi获取自己所在的机架ID。客户端读取数据的时候,从名称节点获取数据块列表,找到副本所在的数据节点,然后通过API确定客户端与这些数据节点的机架ID;当发现某个数据块节点的机架ID与客户端相同时,就选择该副本进行读取,如果没有,则随机选取一个副本进行读取。