HDFS 为了做到可靠性( reliability ) 创建了多份数据块(data blocks)的复制(replicas) ,并将它们放置在服务器群的计算节点中(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据了。
NameNode DataNode
存储元数据(文件名,文件属性) 存储文件内容
元数据保存在内存中(磁盘中也会有一份),工作过程中在内存中读数据 文件内容保存在磁盘
保存文件,block,datanode之间的映射关系 维护了block id到datanode本地文件的映射关系
NameNode存储的是元数据,元数据的多少取决于文件的多少,元数据是存储在内存中的。
不适合大量的小文件存储
国内大部分网盘是用的HDFS
HDFS客户端请求的是NameNode, NameNode负责处理任务的请求,NameNode再将请求转发给DataNode,请求DataNode实际是HDFS客户端请求,图有问题。
DataNode把所有数据都存储在磁盘上
一个块只可能存一个文件中的数据。只是一个逻辑结构,若不满64mb的,磁盘上存储的是文件的实际大小。
三个副本存储在不同机器上
整个过程中,metadata记录的信息,磁盘中有一份,内容中也会有一份。(block位置信息不会保存在磁盘中)
如果启动后进行了新添加文件的操作,那么这个操作就会记录到edits日志文件中,并不会马上修改fsimage文件,后期会进行合并操作。
NameNode工作的数据都在内存上
合并会有大量的IO操作,如果合并操作由NameNode自己做的话,那么计算机将会分配大量的内存空间给NameNode来做合并,会影响用户的使用,NameNode主要是用来接收用户的请求操作的,合并由SecondaryNameNode来做的话,可保证NameNode工作的专一性,提供性能。
SecondaryNameNode合并后会生成一个新的fsimage,会将该文件传送给NameNode,替换原来的fsimage
合并流程:
fsimage: 磁盘中的元数据文件
edits: 日志记录文件
在将 edits、fsimage拷贝到SecondaryNameNode的同时,NameNode会新建一个edits文件,来记录用户的操作,edits文件为上次合并的时候产生的新的edits 文件。
在SecondaryNameNode将edits 和 fsimage合并成一个新的fsimage文件,合并之后,将fsimage推送给NameNode, NameNode将之前的fsimage替换掉
不是热备,如果NameNode挂掉,那么将会损失edits.new中的文件操作。
如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点
机架:在节点的配置文件中会标明属于哪个机架。
在客户端调用api请求NameNode,NameNode返回给数据块的位置信息
客户端拿到数据块的位置信息后,通过另一个API并发的去读各个block,拿到block之后合并为一个文件。(一般是读小的文件)
1.客户端调用 Distributed FileSystem API ,参数包括文件信息,文件的拥有者2.NameNode拿到文件信息后,就可以计算出需要切几个block,block分别存储在哪些DataNode上,返回给客户端
3.客户端获取之后,通过接口FSData CutputStream API 先将一个block写入到DataNode中,其余的副本由DataNode开启新的线程根据副本放置规则,往其它DataNode上进行复制。
4.复制完成后会返回一个回馈信息,然后再将该信息汇报给NameNode
注:DataNode中的副本,是由第一个接收到block的DataNode复制产生的。
注:现在好像加密码认证了。
在刚启动HDFS的时候,会先进入一个安全模式,此模式下只可进行读操作。
原文:http://www.cnblogs.com/EnzoDin/p/7203487.html