| 编辑推荐: | 
								   
										
                                    本文来自于简书,本文主要介绍为什么需要分布式文件系统以及HDFS对文件的存储读取和如何使用HDFS,希望对您的学习有所帮助。 
                                   | 
								   
							 
						 | 
                           
                         
                        
                          
                          
                         
                           HDFS作为Hadoop的核心部分,是Hadoop中MapReduce框架的存储层。 
                            1、为什么需要分布式文件系统 
                            当文件的大小超过了单台计算机的存储能力时,就需要将其分区存储在不同单独的计算机上。 
                            
                          
                            分布式文件系统概念图文件系统的三个主要组成部分:被管理的文件、文件管理相关软件、实施文件管理所需要的数据结构 
                           将文件分布式存储后带来的问题:文件不完整,系统复杂度加大,引入网络编程 
                            
                          
                            2、HDFS对文件的读取方式:流处理访问模式 
                            
						  
                            HDFS以流处理访问模式来存储文件什么是流处理访问模式呢?为什么分布式文件系统场景下这种文件访问模式更合适? 
                            操作系统中文件访问方式有好几种,常见的是随机数据访问方式,这种方式要求文件定位、查询或者修改数据的延迟比较小,比较适合常见数据后多次查询、读写的场景,传统关系型数据库非常符合这一点。 
                            大数据场景与关系系数据库的场景有非常大的不同。大数据的数据源通常由源生成或从数据源直接复制而来,接着长时间在此数据集上进行各类分析,不需要搬来搬去;这种数据访问场景是典型的一次写入,多次读取的场景(写入数据只需要生成数据的那一次,基本没有修改数据的要求,后面就是多次读取以分析),所以这种场景下的数据访问方式更适合采用流处理方式。 
                            流处理数据访问方式试磁盘寻址开销最小化:只需要一次寻址(起始地址),然后就是连续的流式读取。硬盘的物理构造导致寻址开销的优化跟不上读取开销,所以流式读取更加适合硬盘的本身特性,当然大文件的特点也更适合流式读取。 
                             
						  
                            流处理模型: HDFS存储的数据集作为Hadoop的分析对象。在数据集生成后,长时间在此数据集上进行各种分析。每次分析都将设计该数据集的大部分数据甚至全部数据,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要 
                            HDFS是用流处理方式处理文件,每个文件在系统里都能找到它的本地化映像,所以对于用户来说,不用关心文件是什么格式的,也不用在意被分到哪里,只管从HDFS里取出就可以了。 
                            3、HDFS对文件的存储方式:分片冗余存储 
                            压缩存储 
                            先说一说压缩存储。 
                            在存储资源无法满足数据量增长时,需要对数据压缩后再存储,重复数据删除技术是无损压缩的技术之一,它的基本原理是对目标文件分块,然后以块为单位进行重复内容的比对,若发现内容相同的数据块,只在存储介质上存放一份,并记录相关逻辑关系,从而减少实际存储开销。 
                            这种数据压缩方式影响数据的安全性和可用性,如下图: 
                           
                            
						  
                            数据单元2只属于文件C,因此数据单元2故障只会影响文件C;而数据单元5同时属于4个文件,它故障了会同时影响4个文件不能正常使用。 
                            冗余存储 
                            为了保证分布式存储后的文件具有高可用性,采用冗余存储这种容错策略。常用的方法是数据复制技术、纠删码技术。 
                            / 数据复制技术 / 
                            数据复制技术是副本冗余策略,对存储系统中的数据块进行多处副本保存(存储开销相对较大)。 
                            就数据而言,HDFS采用每份数据3副本的方式,保证某些数据损失之后仍能继续使用。 
                           
                            
						  
                            / 纠删码技术 / 
                            数据的容错除了副本还有另一种做法,就是把丢失的数据计算出来。这就是纠删码的思想了。与副本相比,纠删码的优点在于节省存储空间,缺点在于有计算开销而且修复需要一定时间,而副本损失只要复制出来损失的数据,未损失的数据可以继续提供服务。 
                            简单原理:纠删码(erasure coding,EC)技术是将数据块分为m个数据块,然后通过编码冗余扩展至n个数据块(n>m),这n个数据块中有 
                            k=n-m 个是校验块,如果m个数据块中任意一个丢失了,可以通过k个校验块计算恢复出来,这也是一种冗余存储策略,不过相比副本技术而言更佳节省存储空间 
                            [4]。 
                            纠删码可以用于有大量数据和任何需要容错的应用程序或系统中,比如磁盘阵列系统、数据网格、分布式存储应用程序、对象存储或归档存储。目前,纠删码的一个常见的使用案例是基于对象的云存储。 
                            4、HDFS对文件的校验方式:分片冗余,本地校验 
                            分布式文件系统负责数据分布存储和数据管理,并提供对数据高吞吐量访问的性能。主要功能除了读写操作之外,还有一个就是数据校验功能,此功能在数据读写过程中都会运用到。它是数据完整性的良好保障。分布式文件系统在读写数据时读取一个文件块可能由于存储设备、网络或者软件的缺陷等原因而出现损坏的情况。对于大数据处理,原本复杂繁重的计算任务再加上数据校验过程会给分布式文件系统带来额外负担,读写速率也会随之有所下降,这就需要建立一个完整的体系,在保证数据完整的情况下尽量减小因为数据校验而给系统带来的影响。 
                            HDFS的解决方案是分片冗余,本地校验;数据冗余式存储,直接将多份的分片文件交给分片后的存储服务器去校验;冗余后的分片文件还有个额外功能,只要冗余的分片文件中有一份是完整的,经过多次协同调整后,其他分片文件也将完整。 
                            DFS通过CheckSum和DataBlockScanner两种方式同时来保证保存在数据节点上的数据时完整的。HDFS中的DataNode在本地文件系统存储数据块的元数据用于CRC校验。对于每一个块,向DataNode请求checksum信息,返回的信息中包括块的所有checksum的MD5摘要,如果向一个DataNode请求失败,会向另一DataNode请求,最后将所有块的MD5合并,并计算这些内容的MD5摘要。[5] 
                            5、HDFS的概念 
                            HDFS可以用下面这个抽象图的具体实现: 
                           
                            
						  
                            何为元数据 
                            元数据是用于描述要素、数据集或数据集系列的内容、覆盖范围、质量、管理方式、数据的所有者、数据的提供方式等有关的信息。更简单的说,是关于数据的数据。 
                           
                            
						  
                            块与块大小的设置 
                            块是文件存储处理的逻辑单元。 
                            磁盘存储文件时,是按照数据块来存储的,也就是说,数据块是磁盘的读/写最小单位。数据块也称磁盘块。构建于单个磁盘上的文件系统是通过磁盘块来管理文件系统,一般来说,文件系统块的大小是磁盘块的整数倍。特别的,单个磁盘文件系统,小于磁盘块的文件会占用整个磁盘块。磁盘块的大小一般是512字节。 
                            在HDFS中,也有块(block)这个概念,默认为64MB,每个块作为独立的存储单元。 
                            
                          与其他文件系统不一样,HDFS中每个小于块大小的文件不会占据整个块的空间。 
                            HDFS为什么使用大块 
                            (1)减少NameNode的压力 
                            NameNode用来存储hdfs上文件的元数据信息,如果是小文件,会导致产生大量的元数据信息。HDFS中每个文件、目录和数据块的存储信息大约在150字节,如果大量小文件会导致NameNode内存不够用。 
                            (2)最小化寻址时间 
                            如果块设置的足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需要的时间,因而,传输一个由多块组成的文件时间取决于传输速率(寻址时间可忽略不计)。 
                            T(存储时间)=T(定位时间)+T(传输时间) 
                            如果每个要传输的块设置得足够大,那么从磁盘传输数据的时间可以明显大于定位这个块开始位置的时间 
                            T(存储时间)=T(定位时间) )[-∞]+T(传输时间)[∞] 
                            近似等于:T(存储时间)=T(传输时间) 
                          如果我们设置的块过小,那么一个文件就是产生很多的块,当我们要对块进行操作的时候,就会产生好多次的寻址,这样就导致了寻址的时间会很长。 
                            当寻址时间比io还长的时候,寻址时间就成为了瓶颈。所以,合理设置大小能提高吞吐量。 
                            (3)块的大小也不合适太大 
                            HDFS提供给MapReduce数据服务,而一般来说MapReduce的Map任务通常一次处理一个块中的数据,如果任务数太少(少于集群中节点的数量),就没有发挥多节点的优势,甚至作业的运行速度就会和单节点一样,如果块设置的太大,就无法充分利用并行的特性。 
                            分布式的文件抽象能够带来的优势 
                            一个文件可以大于每个磁盘 
                            文件不用全在一个磁盘上 
                            简化了存储子系统的设计 
                            基于元数据块的存储方式非常适合用于备份,利用备份可提供数据容错能力和可用性 
                            HDFS中的两类节点(node) 
                            
						  
                            NameNode 
                            是管理节点,存放文件元数据: 
                            (1)文件与数据块的映射表 
                            (2)数据块与数据结点的映射表 
                            客户端读取数据之前,先从NameNode中读取元数据,从而得知文件存放在那些DataNode上的,再从数据节点中拿到数据块,拼装成想要的文件。 
                            DataNode 
                            是工作节点,存放数据块 
                            心跳检测 
                            NameNode和DataNode之间有心跳协议,DataNode定期向NameNode汇报自身状况,是否处于active状态、网络是否正常、机器是否正常运行 
                            Secondary NameNode(二级NameNode) 
                            二级NameNode并不是NameNode的备份,定期同步元数据映像文件(fsimage)和修改日志(edit 
                            logs)的,详见:Secondary NameNode:它究竟有什么作用? 
                            Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点。这也是它在社区内被认为是检查点节点的原因。 
                            HDFS中文件读写的流程 
                            读文件流程 
                             
						  
                            HDFS文件读取流程 
                            (1)客户端(java/shell/...)发起文件读取请求,将文件名、路径告知NameNode; 
                            (2)NameNode查询并返回元数据给客户端,包括该文件在哪些块中、这些快要在哪些机器中的哪些DataNode中去找; 
                            (3)客户端根据信息去读block,将block下载下来后进行组装,读取完成。 
                            写文件流程 
                             
						  
                            HDFS写文件流程 
                            (1)将文件拆分成块(固定大小64M),通知NameNode; 
                            (2)NameNode将当前可用并且大小符合的DataNode信息返回; 
                            (3)客户端将blocks写入相应的DataNode; 
                            (4)block写入后进行流水线复制; 
                            (5)更新元数据; 
                            (6)每次写一个block 
                            6、HDFS的关键运作机制 
                            HDFS是基于主从结构(master/slaver)构件。 
                             
						  
                            7、如何使用HDFS 
                            HDFS是在安装hadoop-0.20.2.tar.gz并成功配置后即可使用。无论是使用shell脚本,或者使用WEB 
                            UI进行操作,使用前必须得明白HDFS的配置,便于存储操作或者操作优化。 
                        
                             
                              # lists the commands 
                                supported by Hadoop shell 
                                $bin/hdfs dfs -help 
  
                                # displays more detailed help for a command 
                                  $bin/hdfs dfs -help command-name  
                                 bin/hadoop fs <==> bin/hdfs dfs 
                               | 
                             
                           
                          hadoop fs 
                            This command is documented in the File System Shell 
                            Guide. It is a synonym for hdfs dfs 
                            when HDFS is in use(当HDFS在使用时,hadoop fs和hdfs dfs 是“同义词”). 
                           
                         
                             
                               $hadoop fs -ls 
                                / 
                                $hadoop fs -put <file> <dest> 
                                $hadoop fs -mkdir <file>  
                                $...  | 
                             
                           
                             
                          
                            |