赞
踩
目录
7. fsimage和editlogs为什么要合并?如何合并?
hdfs(Hadoop Distribute File System)是分布式文件系统。
分布式文件系统 distributed file system 是指文件系统管理的物理存储资源不一定直接链接在本地节点上,而是通过计算机网络与节点相连,可让多机器上的多用户分享文件和存储空间。
说简单点就是将一个大文件分布式存储在不同的机器节点上
答:
1.HDFS为主从架构,由单个NameNode和多个DataNode组成,另外还包括SecondaryNameNode。
2.NameNode主要负责管理dataNode和记录元数据。由FsImage和EditLog两部分组成。
3.DataNode负责存储数据,同时定期与NameNode进行通信,汇报自己存储的信息。
4.SecondaryNameNode负责合并日志,定期将新的FsImage拷贝回dataNode。
详解:
HDFS具有主/从架构。HDFS集群由单个NameNode多个datanode构成。
1)Namenode是负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog。NodeName负责管理文件目录、文件和block的对应关系以及block和datanode的对应关系,维护目录树,接管用户的请求。NameNode节点仅存储元数据,而不存储真实的数据,可以理解NameNode存储真实的数据存放位置的信息。
如下图所示:
2)datanode数据节点,用来具体的存储文件,维护了blockId 与 datanode本地文件的映射。 需要不断的与namenode节点通信,来告知其自己的信息,方便nameode来管控整个系统。
将大文件分块存储在dataNode上,通过NameNode的上信息可以知道一个文件被分成了多少块,每一块存储在哪个dataNode上。
注意:有一个副本的概念,就是每一个块会默认生成三个副本,存储在多个dataNode上,这样就会防止dataNode失效导致数据丢失。
很多博文介绍HDFS读写流程上来就直接从文件分块开始,其实,要把读写过程细节搞明白前,你必须知道block、packet与chunk。
1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
5)然后就是读取下一个块的过程
设置备份数为1时, 就不会备份了.
延申—Hadoop中在哪里设置备份数, 是哪个字段?
在hdfs-site.xml中的dfs.replication变量
问题:
解决方法:
1)使用HAR
Archivehadoop Archive是一个高效地将小文件放入HDFS块中的文件存档文件格式,它能够将多个小文件打包成一个后缀为.har文件,这样减少namenode内存使用的同时,仍然允许对文件进行透明的访问。
使用HAR时需要两点
该方案需人工进行维护,适用管理人员的操作,而且har文件一旦创建,Archives便不可改变,不能应用于多用户的互联网操作。
2)sequence file
sequence file由一系列的二进制key/value组成,如果为key小文件名,value为文件内容,则可以将大批小文件合并成一个大文件。
Hadoop-0.21.0中提供了SequenceFile,包括Writer,Reader和SequenceFileSorter类进行写,读和排序操作。
该方案对于小文件的存取都比较自由,不限制用户和文件的多少,但是SequenceFile文件不能追加写入,适用于一次性写入大量小文件的操作
3)CombineFileInputFormat
CombineFileInputFormat是一种新的inputformat,用于将多个文件合成一个单独的split,而且它还可以考虑数据的存储位置。在mapper中将多个文件合成一个split作为输入。
1 NameNode. 集群的核心, 是整个文件系统的管理节点. 维护着
a) 文件系统的文件目录结构和元数据信息
b) 文件与数据块列表的对应关系
2 DataNode. 存放具体数据块的节点, 主要负责数据的读写, 定期向NameNode发送心跳
3 SecondaryNameNode. 辅助节点, 同步NameNode中的元数据信息, 辅助NameNode对fsimage和editsLog进行合并.
为什么要合并?
edits文件记录了客户端对HDFS所做的各种更新操作,客户端所有的写操作都被记录在了此文件中。
而fsimage文件记录了元数据的文件,这个文件不是实时的,通俗来说,更像是对HDFS的一个快照,它记录了某个时刻下的HDFS的状态信息。
在namenode运行期间, 客户端对hdfs的写操作都保存到edit文件中, 久而久之就会造成edit文件变得很大, 这对namenode的运行没有影响, 但是如果namenode重启, 它会将fsimage中的内容映射到内存中, 然后再一条一条执行edit文件中的操作, 所以日志文件太大会导致重启速度很慢. 所以在namenode运行的时候就要将edit logs和fsimage定期合并.
触发合并的条件
合并过程:
那么这两个文件是如何合并的呢?这就引入了checkpoint机制
checkpoint机制:
因为文件合并过程需要消耗io和cpu所以需要将这个过程独立出来,在Hadoop1.x中是由Secondnamenode来完成,且Secondnamenode必须启动在单独的一个节点最好不要和namenode在同一个节点,这样会增加namenode节点的负担,而且维护时也比较方便。同样在HA集群中这个合并的过程是由Standbynamenode完成的。
详细请看:https://blog.csdn.net/a602519773/article/details/80367582
其实总结一下:合并其实就是同步两个文件,生成一个新的fsimage文件,下次再启动hdfs的时候,就可以从上次同步的位置开始读取editlog即可。
很多人会将SecondaryNameNode认为是NameNode节点的备份节点。但是实际上不是的,SecondaryNameNode的本质作用是辅助NameNode进行fsimage和editlogs的合并操作。
下图展示了SecondaryNameNode的工作过程:
Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点。这也是它在社区内被认为是检查点节点的原因。
不行, 因为客户端通过namenode接收到在数据块上写入的许可后, 那个块会锁定直到写入操作完成, 所以不能在同一个块上写入.
故障的类型主要有以下三种,针对这三种故障类型,HDFS提供了不同的故障检测机制:
由于在读HDFS的过程中会从NameNode获取到数据块位置列表,如果某个DataNode失效,换个DataNode读即可。
写HDFS的过程中会对多个DataNode建立管道进行写入,每个DN收到数据包就会返回应答,如果数据发送者没有收到其中某个DataNode的ACK,则认为该DataNode失效,会跳过该DataNode并将数据写入剩余DataNode。
这样会导致副本数会减少,NameNode收集DataNode信息时发现文件的副本数与设置值不一致,会重新寻找一个DataNode保存副本。
在NameNode中会持有数据块表和DataNode两张表。
数据块表存储着某个数据块(包括副本)所在的DataNode,DataNode表存储着每个DataNode中保存的数据块列表。由于DataNode会周期性地给NameNode发送自己所持有的数据块信息,因此NameNode会持续更新数据块表和DataNode表。
NameNode还会周期性地扫描数据块表,如果发现数据块表中某个数据库的备份数量低于所设置的备份数,则会协调从其它DataNode复制数据到另一个DataNode上完成备份。
首先我们要明白机架与数据节点,集群会被分给不同的机架,每个机架上又有多个DN节点。
数据块的第一个副本优先放在写入数据块的客户端所在的节点上,但是如果这个客户端上的数据节点空间不足或者是当前负载过重,则应该从该数据节点所在的机架中选择一个合适的数据节点作为本地节点。
如果客户端上没有一个数据节点的话,则从整个集群中随机选择一个合适的数据节点作为此时这个数据块的本地节点
HDFS的存放策略是将一个副本存放在本地机架节点上,另外两个副本放在不同机架的不同节点上。
这样集群可在完全失去某一机架的情况下还能存活。同时,这种策略减少了机架间的数据传输,提高了写操作的效率,因为数据块只存放在两个不同的机架上,减少了读取数据时需要的网络传输总带宽。这样在一定程度上兼顾了数据安全和网络传输的开销。
对于NameNode本身就存在单点故障,如果NameNode出现故障,则整个集群会直接宕机。因此HDFS提供了HA的架构,对于一个典型的HA集群而言,NameNode会被配置在两台独立的机器上,在任何时间上,一个NameNode处于Active状态,而另一个NameNode处于Standby状态,Active状态的NameNode会响应集群中所有的客户端的请求,Standby状态的NameNode只是作为一个副本,保证在必要的时候提供一个快速的转移,使得上层对NameNode的切换无感知,Standby NameNode与Active NameNode应时刻保持同步,在Active NameNode和Standby NameNode之间要有个共享的存储日志的地方,Active NameNode把EditLog写到共享的存储日志中,Standby NameNode读取日志并执行,使得Active NameNode和Standby NameNode内存中的HDFS元数据保持同步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。