HDFS的读写流程和文件块大小设置

仅供复习时使用。
HDFS写入数据:

  1. client端按128MB的块切分文件。
    HDFS的读写流程和文件块大小设置_第1张图片
    注意:
  • 在数据流式传输过程中,最小传输单位是Packet,大小为64k,其中Packet是由512bytes的chunk和4bytes的chunksum(chunk校验码)组成;
  • 客户端向NameNode发出写文件请求。
  • client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。
    (注:并不是写好一个块或一整个文件后才向后分发)
  • datanode之间传递时,数据会产生一个ACK队列(里面存放的就是Packet数据),即一个缓冲区队列,当应答成功后(要注意应答也是从后往前,逐级应答的,收到了应答说明这个节点之后的节点已经完成写入操作),缓冲区内的数据才会被删除;
  • 一个Block传输完成后,客户端再次请求 NameNode 上传第二个 Block 的服务器。(重复图中步骤)

datanode写入数据过程中如果发生故障:首先关闭管线,队列中的数据的所有数据包都添加到数据队列的最前端,(确保故障节点下游的datanode不会漏掉任何一个数据;另一正常的datanode的当前数据块指定一个标识,并发送给namenode,方便在后续故障datanode恢复后删除存储的部分数据;)然后从管道线中删除故障datanode,基于正常的datanode重新建立管道线,余下的数据块写入管道中正常的datanode;

HDFS读数据:
HDFS的读写流程和文件块大小设置_第2张图片
读取DataNode的选择条件:

1、与客户端的距离;2、负载均衡;
(1)客户端通过 DistributedFileSystem 向 NameNode 请求下载文件,NameNode 通过查询元数据,找到文件块所在的 DataNode 地址。
(2)挑选一台 DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode向输入流中中写数据,以packet为单位来校验。
(4)关闭输入流。

文件块大小和小文件处理:
HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadoop2.x和3.x中是128M,在1.x中式64M;
为什么这么定大小:
​ 比如寻址时间是10ms,而寻址时间为传输时间的1%时为最佳状态,即传输时间大致为1秒,现在硬盘的传输速度约为100MB/S,所以大致为128MB,为什么不选100MB,因为磁盘是以1024为基础单位的;
为什么块的大小不能太大,也不能太小;
​ 块太小,会增加大量的寻址时间,程序一直在找块的位置;
​ 块太大,磁盘传输时间太长,导致程序在处理这个块时,非常慢;

补充内容:
2NN的作用:
第一阶段:NameNode启动
(1)第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode 记录操作日志,更新滚动日志。
(4)NameNode 在内存中对元数据进行增删改。

fsimage:元数据镜像文件(文件系统的目录树。)
edits:元数据的操作日志(针对文件系统做的修改操作记录)
namenode内存中存储的是=fsimage+edits

存储数据位置:fsimage(存储着HDFS文件系统的所有目录和文件inode的序列化信息);
Edits文件:追加内容(只记录过程,不计算结果);
服务器启动后:fsimage和Edits文件会综合数据,并存入内存中,开始工作;(启动时会进行一次合并)可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并。

2NN作用:定期帮助这两个文件进行合并;
(了解)
在hadoop102主服务器中/opt/module/hadoop-3.1.3/data/dfs/name/current目录中有这两种文件;
在hadoop104secondaryNameNode所在服务器中/opt/module/hadoop-3.1.3/data/dfs/namesecondary/current目录中也有这两种文件;
两个目录的文件内容差不多,但102主服务器中会多一个edits_inprogress_…(镜像文件)文件和一个seen_txid文件(保存最后一个edits的数字);
seen_txid文件保存的是一个数字,就是最后一个edits_的数字

你可能感兴趣的:(HADOOP集群知识,大数据,hadoop,hdfs)