Hadoop家族之HDFS分布式文件体系
一、HDFS概念HDFS先容
[*]HDFS是 Hadoop Distribute File System 的简称,意为:Hadoop分布式文件体系。是Hadoop核心组件之一,作为最底层的分布式存储服务而存在。
[*]分布式文件体系解决的标题就是大数据存储。它们是高出在多台盘算机上的存储体系。分布式文件体系在大数据时代有着广泛的应用远景,它们为存储和处理超大规模数据提供所需的扩展能力。
[*]DFS使用多台盘算机存储文件,并且提供同一的访问接口,像是访问一个普通文件系同一样使用分布式文件体系
https://i-blog.csdnimg.cn/direct/120a50db4f7c46b4be38b77c8a4a9afc.png
HDFS设计目标
[*]硬件故障是常态, HDFS将有成百上千的服务器组成,每一个组成部分都有可能出现故障。因此故障的检测和自动快速恢复是HDFS的核心架构目标。
[*]HDFS上的应用与一般的应用差别,它们重要是以流式读取数据。HDFS被设计成适合批量处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。
[*]典范的HDFS文件巨细是GB到TB的级别。所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持万万级别的文件。
[*]大部分HDFS应用对文件要求的是write-one-read-many访问模子。一个文件一旦创建、写入、关闭之后就不必要修改了。这一假设简化了数据一致性标题,使高吞吐量的数据访问成为可能。
[*]移动盘算的代价比之移动数据的代价低。一个应用哀求的盘算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将盘算移动到数据附近,比之将数据移动到应用所在显然更好。
[*]在异构的硬件和软件平台上的可移植性。这将推动必要大数据集的应用更广泛地接纳HDFS作为平台。
二、HDFS重要特性
[*]首先,HDFS 是一个文件体系,用于存储文件,通过同一的命名空间目录树来定位文件
[*]其次,它是分布式的,由很多服务器团结实现其功能,集群中的服务器有各自的脚色
主从架构
[*]HDFS集群式标准的master/slave主从架构集群
[*]一般一个HDFS集群是由一个NameNode和一定数目标Datanode组成
[*]Namenode是HDFS主节点,Datanode是HDFS从节点,两种脚色各司其职,共同协调完身分布式的文件存储服务。
分块存储
[*]HDFS中的文件在物理上是分块存储(block)的,默认巨细是128M,不敷128M则本身就是一块
[*]块(block)的巨细可用通过配置参数来规定,参数位于hdfs-default.xml中:dfs.blocksize。(默认是134217728,即128M)
[*]分块存储好处:针对块并行操作提高效率
https://i-blog.csdnimg.cn/direct/63187f2f7e3341acbdb9d567dad2c95c.png
副本机制
[*]文件的全部block都会有副本。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。
[*]副本数由参数dfs.replication控制,默认值为3,也就是额外再复制2份,连同本身总共3份副本
[*]设置副本备份的作用:冗余存储,保障数据安全
Namenode 元数据管理
[*]我们把目录布局及文件分块位置信息叫元数据。Namenode负责维护整个hdfs文件体系的目录树布局,以及每一个文件对应的block块信息(block的id,及所在datanode服务器)
[*]在HDFS中,Namenode管理的元数据具有两种类型:
[*]文件自身的属性信息
[*]文件名称、权限、修改时间、文件巨细、复制因子、数据块巨细
[*]文件块位置映射信息
[*]纪录文件块和DataNode之间的映射信息,即哪个位于哪个节点上
[*]元数据纪录的功能:快速定位文件位置便于查找
Datanode数据存储
[*]文件的各个block的具体存储管理由datanode节点负担。每一个block都可以在多个datanode上。Datanode必要定时向Namenode报告本身持有的block信息
名字空间(Namespace)
[*]HDFS支持传统的层次型文件组织布局。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件体系名字空间的层次布局和大多数现有的文件体系雷同:用户可以创建、修改、删除、移动或重命名文件。
[*]Namenode负责维护文件体系的名字空间,任何对文件体系名字空间或属性的修改都会被Namenode纪录下来。
[*]HDFS会给客户端提供一个同一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。’
三、HDFS工作流程与机制
HDFS集群脚色
主脚色:namenode
[*]NameNode是Hadoop分布式文件体系的核心,架构中的主脚色。
[*]NameNode维护和管理文件体系元数据,包括名称空间目录树布局、文件和块的位置信息、访问权限等信息。
[*]基于此,NameNode成为了访问HDFS的唯一入口。
从脚色:datanode
[*]DataNode是Hadoop HDFS中的从脚色,负责具体的数据块存储。
[*]DataNode的数量决定了HDFS集群的团体数据存储能力。通过和NameNode配合维护着数据块。
主脚色辅助脚色: secondarynamenode
[*]除了DataNode和NameNode之外,尚有另一个守护进程,它称为secondary NameNode。充当NameNode的辅助节点,但不能替代NameNode。
[*]当NameNode启动时,NameNode归并Fsimage和edits log文件以还原当前文件体系名称空间。假如edits log过大不利于加载,Secondary NameNode就辅助NameNode从NameNode下载Fsimage文件和edits log文件进行归并。
Namenode职责
[*]NameNode仅存储HDFS的元数据:文件体系中全部文件的目录树,并跟踪整个集群中的文件,不存储现实数据。
[*]NameNode知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道怎样从块中构建文件
[*]NameNode不持久化存储每个文件中各个块所在的datanode的位置信息,这些信息会在体系启动时从DataNode重修。
[*]NameNode对于HDFS至关重要,当NameNode关闭时,HDFS / Hadoop集群无法访问。
[*]NameNode是Hadoop集群中的单点故障。
[*]NameNode所在呆板通常会配置有大量内存(RAM)
DataNode 职责
[*]NameNode和DataNode会保持不停通讯。
[*]DataNode启动时,它将本身发布到NameNode并报告本身负责持有的块列表。
[*]当某个DataNode关闭时,它不会影响数据或聚集的可用性。NameNode将安排由其他DataNode管理的块进行副本复制。
[*]DataNode所在呆板通常配置有大量的硬盘空间。因为现实数据存储在DataNode中。
[*]DataNode会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向NameNode发送心跳,假如NameNode长时间没有接受到DataNode发送的心跳, NameNode就会认为该DataNode失效。
[*]block报告时间间隔取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时.(报活)
HDFS的工作机制
[*]NameNode负责管理整个文件体系元数据;DataNode负责管理具体文件数据块存储;Secondary NameNode协助NameNode进行元数据的备份。
[*]HDFS的内部工作机制对客户端保持透明,客户端哀求访问HDFS都是通过向NameNode申请来进行。
https://i-blog.csdnimg.cn/direct/609317f2e84743caaae9287acb50b4bf.png
HDFS写数据流程
https://i-blog.csdnimg.cn/direct/d072c1d3ac0f4bba86078c184be0e2ac.png
1、client发起文件上传哀求,通过RPC与NameNode创建通讯,NameNode查抄目标文件是否已存在,父目录是否存在,返回是否可以上传
2、client 哀求第一个block该传输到哪些DataNode服务器上
3、NameNode根据配置文件中指定的备份数量及副本放置策略进行文件分配,返回可用的DataNode的地址,如:A,B,C
[*]注:默认存储策略由BlockPlacementPolicyDefault类支持。也就是日常生存中提到最经典的3副本策略。
[*]1st replica 假如写哀求方所在呆板是此中一个datanode,则直接存放在当地,否则随机在集群中选择一个datanode.
[*]2nd replica 第二个副本存放于差别第一个副本的所在的机架.
[*]3rd replica 第三个副本存放于第二个副本所在的机架,但是属于差别的节点
https://i-blog.csdnimg.cn/direct/021b0083bd97441d89773f811197970e.png
4、client 哀求3台DataNode中的一台A上传数据(本质是一个RPC调用,创建pipeline),A收到哀求会继承调用B,然后B调用C,整个pipeline创建完成,后逐级返回client
5、client开始往A上传第一个block(先从磁盘读取数据放到一个当地内存缓存),以packet为单位(默认64k),A收到一个packet就会传给B,B传给C;A每传一个packet就会放入一个应答队列期待应答
6、数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中的第一个DataNode节点A将pipeline ack发送给client
7、当一个block传输完成之后,client再次哀求NameNode上传第二个block到服务器
HDFS 读数据流程
https://i-blog.csdnimg.cn/direct/7e7c6d9f77934346979cfe2ed9b52e8f.png
1、Client 向NameNode发起RPC哀求,来确定哀求文件block所在的位置
2、NameNode会视情况返回文件的部分或全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址
3、这些返回的DN地址,会按照集群拓扑布局得出DataNode与客户端的距离,然后进行排序,按照两个规则:网络拓扑布局中距离Client近的排靠前;心跳机制中超时报告的DN状态为STALE,这样的靠后排
4、Client 选取排序靠前的DataNode来读取block,假如客户端本身就是DataNode,那么将从当地直接获取数据;
5、底层上本质是创建FSDataInputStream,重复的调用父类DataInputStream的read方法,直到这个块上的数据读取完毕;一旦到达块的末尾,DFSInputStream关闭毗连并继承定位下一个块的下一个Datanode
6、当读完列表的block后,若文件读取还没结束,客户端会继承先NameNode获取下一批的block列表;一旦客户端完成读取,它就会调用close()方法
7、读取完一个block都会进行checksum验证,假如读取DataNode时出现错误,客户端会关照NameNode,然后再从下一个拥有该block副本的DataNode继承读。
8、NameNode只是返回Client哀求包含块的DataNode地址,并不是返回哀求块的数据
9、最终读取来全部的block会归并成一个完备的最终文件
四、namenode、datanode之间的通讯
[*]启动时,DataNode必要向NameNode注册本身并报告本身持有的数据块信息;
工作时,主从之间有心跳机制,数据块报告机制;
[*]DataNode会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向NameNode发送心跳,假如NameNode长时间没有接受到DataNode发送的心跳, NameNode就会认为该DataNode失效。
[*]DataNode会定期向NameNode进行本身持有的数据块信息报告,报告时间间隔取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时
https://i-blog.csdnimg.cn/direct/9d7a89716e09439c83e45effd1e619c5.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]