一、大数据文件,很是适合上T级别的大文件或者一堆大数据文件的存储,若是文件只有几个G甚至更小就没啥意思了。html
二、文件分块存储,HDFS会将一个完整的大文件平均分块存储到不一样计算器上,它的意义在于读取文件时能够同时从多个主机取不一样区块的文件,多主机读取比单主机读取效率要高得多得都。编程
三、流式数据访问,一次写入屡次读写,这种模式跟传统文件不一样,它不支持动态改变文件内容,而是要求让文件一次写入就不作变化,要变化也只能在文件末添加内容。缓存
四、廉价硬件,HDFS能够应用在普通PC机上,这种机制可以让给一些公司用几十台廉价的计算机就能够撑起一个大数据集群。服务器
五、硬件故障,HDFS认为全部计算机均可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,若是其中一台主机失效,能够迅速找另外一块副本取文件。网络
一、Block:将一个文件进行分块,一般是64M。框架
二、NameNode:保存整个文件系统的目录信息、文件信息及分块信息,这是由惟一 一台主机专门保存,固然这台主机若是出错,NameNode就失效了。在 Hadoop2.* 开始支持 activity-standy 模式----若是主 NameNode 失效,启动备用主机运行 NameNode。分布式
三、DataNode:分布在廉价的计算机上,用于存储Block块文件。oop
若是你想了解大数据的学习路线,想学习大数据知识以及须要免费的学习资料能够加群:784789432.欢迎你的加入。天天下午三点开直播分享基础知识,晚上20:00都会开直播给你们分享大数据项目实战。post
一、NameNode和DataNode节点初始化完成后,采用RPC进行信息交换,采用的机制是心跳机制,即DataNode节点定时向NameNode反馈状态信息,反馈信息如:是否正常、磁盘空间大小、资源消耗状况等信息,以确保NameNode知道DataNode的状况;学习
二、NameNode会将子节点的相关元数据信息缓存在内存中,对于文件与Block块的信息会经过fsImage和edits文件方式持久化在磁盘上,以确保NameNode知道文件各个块的相关信息;
三、NameNode负责存储fsImage和edits元数据信息,但fsImage和edits元数据文件须要按期进行合并,这时则由SecondNameNode进程对fsImage和edits文件进行按期合并,合并好的文件再交给NameNode存储。
一、NameNode初始化时会产生一个edits文件和一个fsimage文件,edits文件用于记录操做日志,好比文件的删除或添加等操做信息,fsImage用于存储文件与目录对应的信息以及edits合并进来的信息,即至关于fsimage文件在这里是一个总的元数据文件,记录着全部的信息;
二、随着edits文件不断增大,当达到设定的一个阀值的时候,这时SecondaryNameNode会将edits文件和fsImage文件经过采用http的方式进行复制到SecondaryNameNode下(在这里考虑到网络传输,因此通常将NameNode和SecondaryNameNode放在相同的节点上,这样就无需走网络带宽了,以提升运行效率),同时NameNode会产生一个新的edits文件替换掉旧的edits文件,这样以保证数据不会出现冗余;
三、SecondaryNameNode拿到这两个文件后,会在内存中进行合并成一个fsImage.ckpt的文件,合并完成后,再经过http的方式将合并后的文件fsImage.ckpt复制到NameNode下,NameNode文件拿到fsImage.ckpt文件后,会将旧的fsimage文件替换掉,而且更名成fsimage文件。
经过以上几步则完成了edits和fsimage文件的合并,依此不断循环,从而到达保证元数据的正确性。
一、HDFS客户端提交写操做到NameNode上,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有写权限,若是有,而后进行查看,看哪几个DataNode适合存放,再给客户端返回存放数据块的节点信息,即告诉客户端能够把文件存放到相关的DataNode节点下;
二、客户端拿到数据存放节点位置信息后,会和对应的DataNode节点进行直接交互,进行数据写入,因为数据块具备副本replication,在数据写入时采用的方式是先写第一个副本,写完后再从第一个副本的节点将数据拷贝到其它节点,依次类推,直到全部副本都写完了,才算数据成功写入到HDFS上,副本写入采用的是串行,每一个副本写的过程当中都会逐级向上反馈写进度,以保证明时知道副本的写入状况;
三、随着全部副本写完后,客户端会收到数据节点反馈回来的一个成功状态,成功结束后,关闭与数据节点交互的通道,并反馈状态给NameNode,告诉NameNode文件已成功写入到对应的DataNode。
一、HDFS客户端提交读操做到NameNode上,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有读权限,若是有,则给客户端返回存放数据块的节点信息,即告诉客户端能够到相关的DataNode节点下去读取数据块;
二、客户端拿到块位置信息后,会去和相关的DataNode直接构建读取通道,读取数据块,当全部数据块都读取完成后关闭通道,并给NameNode返回状态信息,告诉NameNode已经读取完毕。
代码实现