Hadoop–HDFS的两大核心
文章目录
- Hadoop--HDFS的两大核心
- 一:写数据
- 1)具体步骤
- 2)在pipeline上的datanode如果出现了异常?
- 3)注意
- 二:读数据
- 1)具体步骤
一:写数据
1)具体步骤
1.客户端向namenode发送RPC请求;
2.namenode检查权限以及文件是否存在(是否可以上传);
3.namenode确认可以上传文件的话会向客户端发送一个确认信息;
4.客户端将文件分块(每个block块128M)按照顺序上传,向namenode申请这些block块存储的datanode列表;
5.上传第一个block块:
1.通过交换机建立一个pipelin通道;
2.block会以“packet queue”的形式传输,每一个packet的大小是64k;
3.为了保证packet传输的正确,当packet向最后一个datanode的传输完成之后,datanode会返回一个ack packet(确认传输到了),在客户端维护着一个ack queue(确认队列),客户端收到一个ack就会从ack queue中移除一个ack;
4.每传输8个packet(即512k)就需要进行一个校验;
5.节点列表在通道中进行复制;
5.整个block块的所有packet重复改动作;
6.其他的block块和第一个block传输方式一致,传输完成关闭pipeline.
2)在pipeline上的datanode如果出现了异常?
将会被移除,nn会分配新的dn加入pipeline(保证副本的个数)
3)注意
只要写入了 dfs.replication.min(最小写入成功的副本数)的复本数(默认为 1),写操作就会成功,并且这个块可以在集群中异步复制,直到达到其目标复本数(dfs.replication的默认值为 3),因为 namenode 已经知道文件由哪些块组成,所以它在返回成功前只需要等待数据块进行最小量的复制。
二:读数据
1)具体步骤
客户端将要读取的文件路径发送给 namenode,namenode 获取文件的元信息(主要是 block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应 datanode 逐个获取文件的 block 并在客户端本地进行数据追加合并从而获得整个文件
1.客户端向远程的HDFS发送RPC请求;
2.通过交换机建立通道,如果数据存在,namenode会视情况返回整个文件的block块列表,对于每个block块,namenode都会返回拷贝的datanode地址;
3.客户端收到block列表,会选取离客户端最近的datanode去读取block块,如果最近block的在本地就是本地读取;
4.读完一个block块之后,断开与datanode的连接,client去寻找下一个block块最近的datanode;
5.读完列表block块之后,如果文件还没有读取完成,namenode会返回下一批block块的列表;
6.每次读取完一个block之后都会进行checksum校验,如果读取错误,客户端会通知 namenode,然后再从下一个拥有该 block 拷贝的 datanode 继续读。