一、HDFS简述:
1、Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。
2、本身是用来存储数据的,当存储较大文件的时候会对文件进行切换。
二、HDFS的体系结构
1、NameNode:管理整个文件的元数据。
2、DataNode:负责管理用户的文件数据块。
3、Secondary NameNode用来监控hdfs状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
三、HDFS的存储特点
1、存储数据的节点:DataNode,管理数据的节点:NameNode。
2、HDFS存储数据的时候会将文件进行切换,并且给每一个文件块分配一个递增的编号。
3、HDFS存储数据的时候会对数据进行备份,每一个备份称为复本。在伪分布式中,复本设置为1,但在全分布式下,复本默认是3。
4、3个复本放在不同的DataNode中。
复本的放置策略–机架感知策略:
a、第一个复本:客户端连接的是哪一个DataNode,复本就放在哪一个DataNode上。
b、第二个复本:要放到另一个机架的datanode上
c、第三个复本:放到和第二个复本同机架的另一个datanode上
d、如果有更多的复本数量,其他的复本随机放到其他的datanode
5、如果某一个DataNode宕机,那这个时候NameNode就会将DataNode上所存放的复本进行复制,保证整个HDFS中有指定的复本数量
6、NameNode需要管理DataNode,NameNode中存储管理信息–元数据,-metadata— FileName replicas block-Ids id2host:
a、记录文件存储位置 /node01/a.txt
b、记录文件切的块数
c、文件块存储的datanode的地址
/test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}]
存储的文件是a.log文件,存储在/test路径下,复本数量为3,切了2块,编号为b1,b2,b1存放在h0,h1,h3节点下,b2存放在h0,h2,h4节点下
7、DataNode主动向namenode发送心跳,保持namenode对DataNode的管理。心跳信息包含:1、节点信息,2、节点存储的数据。
8、如果超过10分钟,namenode没有收到DataNode的心跳,namenode就会认为DataNode已经lost,那么namenode就会将这个lost的datanode中的数据进行备份。
四、HDFS的读流程
1、客户端向namenode请求下载文件,namenode通过查询元数据,找到文件块所在的datanode地址。
2、挑选一台datanode(就近原则,然后随机)服务器,请求读取数据。
3、datanode开始传输数据给客户端(从磁盘里面读取数据放入流,以packet为单位来做校验)。
4、客户端以packet为单位接收,先在本地缓存,然后写入目标文件。
五、HDFS的写流程
1、客户端向namenode请求上传文件,namenode检查目标文件是否已存在,父目录是否存在。
2、namenode返回是否可以上传。
3、客户端请求第一个 block上传到哪几个datanode服务器上。
4、namenode返回3个datanode节点,分别为dn1、dn2、dn3。
5、客户端请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成
6、dn1、dn2、dn3逐级应答客户端
7、客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答
8、当一个block传输完成之后,客户端再次请求namenode上传第二个block的服务器。(重复执行2.2.3-2.2.7步)
六、HDFS的优点
1、支持超大文件:将文件进行切块后分别放到不同的节点上。
2、检测和快速应对硬件故障:心跳机制。
3、流式数据访问。
4、简化的一致性模型:只要一个文件块写好,那么这个文件块就不允许再进行改动,只能读取。
5、高容错性:多复本。
6、HDFS具有较好的扩展性:可构建在廉价机器上。
七、HDFS的缺点
1、高延迟数据访问:不适合于交互式,也就意味着Hadoop不适合做实时数据分析,而是做离线数据分析。
2、大量的小文件:文件的存储要经过namenode,namenode中要记录元数据,元数据是存储在内存中。大量的小文件会产生大量的元数据,导致内存被大量占用,降低namenode的处理效率。
3、多用户写入文件、修改文件:在hadoop2.0版本中,不支持修改,但是支持追加。
4、不支持超强的事务。
八、NameNode的工作原理
1、第一阶段:namenode启动
1)第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2)客户端对元数据进行增删改的请求
3)namenode记录操作日志,更新滚动日志。
4)namenode在内存中对数据进行增删改查
2、第二阶段:Secondary NameNode工作
1)Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
2)Secondary NameNode请求执行checkpoint。
3)namenode滚动正在写的edits日志
4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
6)生成新的镜像文件fsimage.chkpoint
7)拷贝fsimage.chkpoint到namenode
8)namenode将fsimage.chkpoint重新命名成fsimage
3、web端访问SecondaryNameNode
1)启动集群
2)浏览器中输入:http://hadoop01:50090/index.html
3)查看SecondaryNameNode信息
九、DataNode的工作原理
1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。
3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器