书上关于这部分分了三个点:
1.数据存放
2.数据读取
3.数据复制
但数据存放和数据复制都是数据写操作过程中的,“存放”体现一种思想,“复制”体现过程,整个数据写操作过程如下:
1.分块:当客户端写入一个文件时,该文件首先会被切分为若干个块(block),每个块的大小由HDFS的设定值决定。
2.块向NN发起请求:每个数据块会向NameNode发起写请求。
3.NN为块给出DN列表:NameNode会根据数据块的存放策略,选择三个DataNode组成一个列表返回给客户端。如果是集群内发起的写操作,则将发起操作的节点作为第一个DN,如果是集群外发起的,则随机一个DN。第二个DN与第一个要是不同机架,第三个DN要与第一个DN同机架不同节点。
4.DN复制:客户端在接收到这个DataNode列表后,开始使用流水线复制的方法进行数据块的复制。具体步骤如下:
- 客户端将数据和列表传给第一个DataNode。
- 第一个DataNode接收到数据后,将其写入本地存储,并同时将数据和列表传递给第二个DataNode。
- 第二个DataNode接收到数据后,也将其写入本地存储,并继续将数据和列表传递给第三个DataNode。
这个过程是并行进行的,也就是在第一个DataNode在接收到数据后,会立即开始将数据写入本地存储,并且几乎同时,它也会将数据转发给下一个DataNode(即第二个DataNode)。第二个DataNode也会立即开始写入数据,并继续将数据传递给第三个DataNode。也就是第一个DataNode不需要等待自己完全写完数据后再传递给下一个DataNode;相反,它可以一边写入数据,一边将数据传递给下一个节点。这种流水线复制的方式可以显著提高数据写入的效率。
5.写毕:当最后一个DataNode完成写入后,它会沿着列表逆序发送数据写完毕信号“ACK确认包”,通知客户端和整个流水线中的数据节点,表示该数据块已成功复制到所有目标节点。
因此,可以说HDFS数据块的复制和存放是一个协同进行的过程,它们相互依赖、相互促进,共同保证了数据在HDFS中的可靠存储和高效访问。
其余补充:
1.NameNode的内存中存储了当前的元数据,而FsImage和EditLog则存储在磁盘上,用于持久化和恢复元数据。
2.Region元数据:记录Region与Region服务器的映射关系,存内存
NameNode元数据:除了目录-文件-块-DataNode的映射关系(分几块,存在哪里),还包括了文件的描述属性。(是什么)
3.hbase表的meta表和root表也是存在Region上的
4.hbase空间大小受root表大小限制(region大小)
hdf存储空间大小受namenode内存大小限制
5.hadoop1.0对于hdfs的namenode单点失效问题采取第二名称节点方式解决
hadoop2.0对于hdfs的namenode单点失效问题采取NN Federation方法解决
hbase对于master单点失效问题采取zookeeper协调选取主管方式解决
6.region以行划分
store以列族划分
7.region服务器重启:若hlog里有缓存,也就是上次关机memstore里剩余没刷新的内容,执行hlog恢复memstore,刷新,删除hlog文件
region失效:把hlog中的操作全部重新做一次恢复memstore,与重启类似