Hadoop之HDFS的读数据与写数据

NameNode和DataNode的概述

NameNode概述:


 1.NameNode也称为Master,是HDFS的核心
  2.NameNode仅存储HDFS的元数据,文件系统中所有文件的目录树,并限制整个集群中的文件
  3.NameNode不存储实际文件中的数据,数据本身实际存储在DataNode中
  4.NameNode知道HDFS中任何给定文件中的块列表及其位置
  5.NameNode并不持久化存储每个文件中各个块所在的DataNode的位置信息,这些信息会在系统启动时从数据节点重建
  6.NameNode对于HDFS至关重要,当NameNode关闭时,HDFS/Hadoop集群无法访问
  7.NameNode是Hadoop集群中的单点故障
  8.NameNode所在机器通常会配置大量内存(RAM)
DataNode概述:
  1.DataNode也称为Slave
  2.DataNode负责将实际数据存储在HDFS中
  3.DataNode所在机器通常配置有大量的硬盘空间,因为实际数据存储在DataNode中
  4.当某个DataNode关闭时,他不会影响数据或者几群的可用性,NameNode将安排由其他的DataNode管理的块进行副本复制
  5.DataNode会定期(dfs.heartbeat.interval 配置项配置,默认是3秒)向NameNode发送心跳,如果NameNode
  长时间没有接收到DataNode发送的心跳,NameNode就会认为该DataNode失效
  6.DataNode启动时,它会与NameNode通信,并汇报自己负责持有的快列表
  7.block汇报时间时间读取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时
 

Hdfs写数据流程:


1.client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在返回是否可以上传
2.client请求第一个block该传输到那些DataNode服务器上
3.NameNode根据配置文件中指定的备份数量及机器感知原理进行文件分配,返回可用的DataNode的地址如:A,B,C
注意:hadoop在设计是考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内
其他某一节点上一份,不同机架的某一节点上一份
4.client请求三台DataNode的一台A上传数据(本质上是一个RPC调用,建立pipline),A收到请求就会调用B,然后B调用C,将整个pipeline建立完成,后祖籍返回client
5.client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(64k),A收到一个packet就回传给B,B传给C,A没传一个packet会放入一个应答队列等待应答
6.数据被分割成一个个packet数据包在pipline上一次传输,在pipline反方向上,组个发送ack(命令正确应答),最终由pipline中第一个DataNode节点A将pipline ack发送给clinet
7.当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器

 hdfs读数据流程:


1.Client向NameNode发起RPC的请求,来确定请求文件block所在位置
2.NamenODE会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址
3.这些返回的DataNode地址,会按照集群拓步结构得出DatanODE与客户端的距离,然后进行排序,排序两个规则,网络拓扑结构中距离Client近的排靠前,心跳机制中超时汇报的DN状态为STALE,这样的排靠后
4.Client选取排序靠前的DataNode来读取BLOCK,如果客户端本身就是DataNode,那么将从本地直接获取数据
5.底层上本质是建立Socket Stream(FSDatalnputStream),重复的调用父类DatalnputStream的read方法,直到这个快上的数据读取完毕
6.当读完列表的block后,若文件读取还没有结束,客户端会继续向NameNode获取下一批的block列表
7.读取完一个block都会进行checksun验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后在从下一个拥有该block副本的DataNode继续读
8.read方法是并行的读取block信息,不是一块一块的读取;NameNode只是返回Client请求包含快的DataNode地址,并不是返回请求快的数据
9.最终读取的block块,所有的都会合并为一个完整的文件

 元数据管理概述

 1.文件,目录自身的属性信息,列如文件名,目录名,修改信息等。
2.文件的存储相关信息,列如存储快信息,分块情况,副本个数等
3.记录HDFS的datanode的信息,用于datanode的管理

这些元数据是存储在哪里的?有两个选择
1,元数据存放在NameNode的磁盘中。
2,元数据存放在NameNode的内存中
元数据存放在NameNode节点的磁盘中,元数据可以完整保存和持久化,但是客户端的每个操作都需要去访问磁盘,效率很低,响应很慢
元数据存放在NameNode节点的内存中,客户端的每个操作都访问内存,效率高,响应快,但内存中的数据一旦断电就丢失了
所以元数据的保存需要内存和磁盘组合,既能保存操作效率高,又能保存元数据的持久化

2.元数据目录相关文件
在hadoopdir/etc/hadoop/core-site.xml配置文件中配置了hadoop.tmp.dir,具体如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Liunx-201:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/export/hdfs-data/tmp</value>
</property>
</configuration>

ls /export/hdfs-data/tmp/dfs/name/current,效果如下:

-rw-r--r--  1 root root  42 5月  8 04:17   edits_00000000000000000429-0000000000000000000430
-rw-r--r--  1 root root  42 5月  8 04:17   edits_00000000000000000429-0000000000000000000430
VERSION

cat VERSION
namespaceID = 1288890822
clusterID=CID-b2948645-148b-4adf-a531-f4117a266af7
cTime=0
storageType=NAME_NODE
blockpoolID=BP-816633810-192.168.100.201-1587954258850
layoutVersion=-63

nameSpaceID/clusterID:这些都是HDFS集群的唯一标识符,标识符被用来防止DataNodes以外注册到另一个集群中的namenode上

storageType:说明这个文件存储的是什么进程的数据结构信息(如果是DataNode,storageType=Data_node)
cTime:NameNode存储系统创建时间,首次格式化文件系统这个属性是0,当文件系统升级之后,该值会更新到升级之后的时间戳
layoutVersion:表示HDFS永久型数据结构的版本信息,是一个负整数

补充说明:
格式化集群的时候,可以指定集群的cluster_id,但是不能与环境中其他集群有冲突,如果没有提供cluster_id,则会生成一个唯一的ClusterID。
hdfs namenode -format -clusterId   <cluster_id>


fsimage_xxx
某一时刻内存中元数据的镜像

fsimage_xxx.md5
校验fsimage_xxx的数据有没有被修改

edits_xxx
记录某一时刻后客户端的所有操作
当内存中的元数据更新时,如果同时更新fsimage,就会导致效率低下,但如果不更新,就会发生数据一致性问题,一旦NameNode节点断电,就会丢失部分数据,所以,引入edits文件,每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到edits中,这样通过fsimage和edits进行合并就可以得到完整元数据

 3.SecondaryNameNode
NameNode职责是管理元数据信息,DataNode的职责是负责数据具体存储,那么SecondaryNameNode的作用是什么?对很多初学者来说非常迷惑的,他为什么会出现在HDFS中,从他的名字看,它给人的感觉好像是NameNode的备份,但它实际上却不是,当HDFS集群进行一段时间后,就会出现下面一些问题,
1.edits文件会变得很大,读入和写入数据需要花费更多的时间
2.NameNode重启挥发费很长时间,因为有很多改动要整合并到fsimages
因此客服了这些问题,我们需要一个易于管理的机制来帮助我们减少edits文件的大小和得到一个最新的fsimage文件,这样也会减少在NameNode上的压力
SecondaryNameNode就是来帮助我解决上述问题的,它的职责是合并NameNode的edits到fsimage文件中

4.Checkpoint
由secondary namenode将namenode上的edits和fsimage栽到本地,并加载到内存今次那个merge(这个过程称之为checkpoint)

 oiv查看fsimage文件
语法,hdfs  oiv -p 文件类型 -i 镜像文件 -o 输出路径
 

猜你喜欢

转载自blog.csdn.net/weixin_46300935/article/details/119768498