HDFS基础(1)

一、特点
高容错性(数据多副本)、批处理(移动计算)大数据处理(PB)、流式文件访问(一次写入多次读取,写入后可追加不可修改)

不适合低延时数据访问、小文件存储和并发写入、文修改。

二、组件

1、架构:Master/Slave

2.Client:客户端:
文件切分
与 NameNode 交互,获取文位置信息
与 DataNode 交互,读取、写入数据。
管理与访问HDFS

3、NameNode:Master
管理 HDFS 的名称空间
管理数据块位置信息
配置副本策略
处理客户端读写请求

4、DataNode:Slave
存储实际的数据块
执行数据块的读/写操作

5、Secondary NameNode
辅助 NameNode,分担其工作量,辅助恢复 NameNode。
定期合并 fsimage和edits,推送给NameNode

三、HDFS 读文件

1、调用FileSystem对象的open方法(DistributedFileSystem的实例)。

2、DistributedFileSystem通过RPC获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照 hadoop拓扑结构排序,距离客户端近的排在前面。

3、返回一个FSDataInputStream对象,封装成 DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode。

4、数据从datanode源源不断的流向客户端。

5、如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,然后DFSInputStream去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。

四、HDFS 写文件

1、客户端通过调用 DistributedFileSystem 的create方法,创建一个新的文件。

2、DistributedFileSystem 通过 RPC调用 NameNode,NameNode 会做校验(文件是否存在、客户端有无权限),校验通过,NameNode 就会记录下新文件。

3、返回 FSDataOutputStream 的对象,封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode和 DataNode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列 data queue。

4、DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几
个DataNode里,并把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。

5、DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。

6、客户端完成写数据后,调用close方法关闭写入流。

7、DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。

五、HDFS 副本存放策略

副本1:与Client同一个节点;
副本2:不同机架上的一个节点;
副本3:第二个副本同一个机架上的另一个节点;
其他副本:随机

六 、hadoop2.x

1、内存横向扩展:多个NameNode,每个NameNode分管一部分目录,NameNode共用DataNode
2、Namenode HA:NN有主备,日志、镜像写入JN,DN向主备NN都汇报,ZK选举主
3、YARN:资源管理和调度

代码交流 2021