大数据课件1第4章-分布式文件系统HDFS_第1页
大数据课件1第4章-分布式文件系统HDFS_第2页
大数据课件1第4章-分布式文件系统HDFS_第3页
大数据课件1第4章-分布式文件系统HDFS_第4页
大数据课件1第4章-分布式文件系统HDFS_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第4章Hadoop分布式文件系统4.1分布式文件系统的结构4.2HDFS基本特征4.3HDFS存储架构及组件功能4.4HDFS的文件访问过程4.5HDFS操作常用Shell命令4.6HDFS编程实践4.1分布式文件系统的结构4.1.1主控服务器4.1.2数据服务器4.1.3客户端4.1分布式文件系统的结构本地文件系统管理本地的磁盘存储资源、提供文件到存储位置的映射,并抽象出一套文件访问接口供用户使用。当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区并存储到若干台单独的计算机上,管理网络中跨越多台计算机存储的文件系统称为分布式文件系统(DistributedFileSystem)。分布式文件系统将数据存储在物理上分散的多个存储节点上,对这些节点的资源进行统一的管理与分配,并向用户提供文件系统访问接口,其主要解决了本地文件系统在文件大小、文件数量、打开文件数等的限制问题。4.1分布式文件系统的结构分布式文件系统架构,通常包括主控服务器(主,或称元数据服务器、名字服务器等),主控服务器(备,以便在故障时接管服务),多个数据服务器(或称存储服务器,存储节点等),以及多个客户端。4.1分布式文件系统的结构分布式文件系统的数据存储解决方案大量的文件,均匀分布到多个数据服务器上后。对于很大的文件,将大文件划分成多个相对较小的片段,存储在多个数据服务器上。理论上,分布式文件系统可以只有客户端和多个数据服务器组成:客户端根据文件名决定将文件存储到哪个数据服务器。但一旦有数据服务器失效时,客户端并不知道数据服务器宕机的消息,仍然连接它进行数据存取,导致整个系统的可靠性极大地降低而且完全由客户端决定数据分配无法根据文件特性制定不同的分布策略。4.1分布式文件系统的结构数据服务器的状态管理可分为分散式:让多个数据服务器相互管理,每个服务器向其他所有的服务器发送心跳信息。集中式:通过一个独立的服务器(如上图中的主控服务器)来管理数据服务器,每个服务器向其汇报服务状态来达到集中管理的目的,该方式简单易实现,目前很多分布式文件系统都采用这种方式如GFS、TFS、MooseFS等。主控服务器在负载较大时会出现单点失效,较好的解决方案是配置备用服务器,以便在故障时接管服务。4.1.1主控服务器主控服务器主要负责命名空间的维护、数据服务器管理、服务调度、主备(主)容灾。(1)命名空间的维护负责维护整个文件系统的命名空间,并暴露给用户使用,命名空间的结构主要有目录树结构如MooseFS等,扁平化结构如淘宝TFS(目前已提供目录树结构支持),图结构(主要面向终端用户,方便用户根据文件关联性组织文件)。(2)数据服务器管理通过轮询数据服务器或由数据服务器报告心跳的方式实现对数据服务器的管理4.1.1主控服务器(2)数据服务器管理通过轮询数据服务器或由数据服务器报告心跳的方式实现对数据服务器的管理。在接收到客户端写请求时,主控服务器需要根据各个数据服务器的负载等信息选择一组(根据系统配置的副本数)数据服务器为其服务;当主控服务器发现有数据服务器宕机时,需要对一些副本数不足的文件(块)执行复制计划;当有新的数据服务器加入集群或是某个数据服务器上负载过高,主控服务器也可根据需要执行一些副本迁移计划。4.1.1主控服务器(3)服务调度主控服务器最终的目的还是要服务好客户端的请求,除了一些周期性线程任务外,主控服务器需要服务来自客户端和数据服务器的请求。(4)主备(主)容灾主控服务器维护文件(块)到数据服务器的映射、管理所有的数据服务器状态并在某些条件触发时执行负载均衡计划等。为了避免主控服务器的单点失效问题,通常会为其配置备用服务器,以保证在主控服务器节点失效时接管其工作。4.1.2数据服务器数据服务器主要负责数据本地存储、状态维护、副本管理、服务调度。(1)数据本地存储负责文件数据在本地的持久化存储,最简单的方式是将客户每个文件作为一个本地文件存储,但这种方式并不能很好的利用分布式文件系统的特性,很多文件系统使用固定大小的块来存储数据,典型的块大小为64M。对于小文件的存储,可以将多个文件的数据存储在一个块中,并为块内的文件建立索引,这样可以极大的提高存储空间利用率。对于大文件的存储,则可将文件存储到多个块上。4.1.2数据服务器(2)状态维护数据服务器除了简单的存储数据外,还需要维护一些状态,首先它需要将自己的状态以心跳包的方式周期性的报告给主控服务器,使得主控服务器知道自己是否正常工作,通常心跳包中还会包含数据服务器当前的负载状况(CPU、内存、磁盘IO、磁盘存储空间、网络IO等、进程资源,视具体需求而定),这些信息可以帮助主控服务器更好的制定负载均衡策略。4.1.2数据服务器(3)副本管理为了保证数据的安全性,分布式文件系统中的文件会存储多个副本到数据服务器上,写多个副本的方式,主要分为3种。最简单的方式是客户端分别向多个数据服务器写同一份数据,如DNFS采用这种方式;第2种方式是客户端向主数据服务器写数据,主数据服务器向其他数据服务器转发数据,如TFS采用这种方式;第三种方式采用流水复制的方式,client向某个数据服务器写数据,该数据服务器向副本链中下一个数据服务器转发数据,依次类推,如HDFS、GFS采取这种方式。4.1.2数据服务器(3)副本管理为了保证数据的安全性,分布式文件系统中的文件会存储多个副本到数据服务器上,写多个副本的方式,主要分为3种。最简单的方式是客户端分别向多个数据服务器写同一份数据,如DNFS采用这种方式;第2种方式是客户端向主数据服务器写数据,主数据服务器向其他数据服务器转发数据,如TFS采用这种方式;第三种方式采用流水复制的方式,client向某个数据服务器写数据,该数据服务器向副本链中下一个数据服务器转发数据,依次类推,如HDFS采取这种方式。(4)服务调度参考主控服务器服务调度一节。4.1.3客户端(1)接口用户最终通过文件系统提供的接口来存取数据,linux环境下,最好莫过于能提供POSIX接口的支持,如果不能支持POSIX接口,则为了支持不同语言的开发者,需要提供多种语言的客户端支持,如常用的C/C++、Java、php、Python客户端。(2)缓存分布式文件系统的文件存取,要求客户端先连接主控服务器获取一些用于文件访问的元信息,这会加重主控服务器的负担,增加了客户端的请求的响应延迟。为了加速该过程,同时减小主控服务器的负担,可将元信息进行缓存,TFS可利用tair作为缓存(减小主控服务器负担、降低客户端资源占用)。15第4章Hadoop分布式文件系统4.1分布式文件系统的结构4.2HDFS基本特征4.3HDFS存储架构及组件功能4.4HDFS的文件访问过程4.5HDFS操作常用Shell命令4.6HDFS编程实践4.2HDFS基本特征(1)大规模数据分布存储能力(2)流数据读写(3)强大的容错能力(4)简单的文件模型HDFS采用“一次写入、多次读取”的简单文件模型,支持大量数据的一次写入,多次读取;不支持已写入数据的更新操作,但允许在文件尾部添加新的数据。(5)数据块存储模式HDFS采用基于大粒度数据块的方式存储文件,默认的块大小是64MB,这样做的好处是可以减少元数据的数量,并且可以允许将这些数据块通过随机方式选择节点,分布存储在不同的地方。17第4章Hadoop分布式文件系统4.1分布式文件系统的结构4.2HDFS基本特征4.3HDFS存储架构及组件功能4.4HDFS的文件访问过程4.5HDFS操作常用Shell命令4.6HDFS编程实践4.3HDFS存储架构及组件功能HDFS是一个建立在一组分布式服务器节点的本地文件系统之上的分布式文件系统。HDFS采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成:分别为Client、NameNode、DataNode和SecondaryNameNode。NameNode是一个中心服务器,负责管理文件系统的名字空间(NameSpace)及客户端对文件的访问。一个DataNode节点运行一个DataNode进程,负责管理它所在节点上的数据存储。NameNode和DataNode共同协调完成分布式的文件存储服务。4.3.2数据块在传统的文件系统中,为了提高磁盘读写效率,一般以数据块block为单位,而不是以字节为单位。HDFS同样有block的概念,但是它是一个更大的单元——默认128M(hadoop2.x)。HDFS中的文件也分解成block大小的数据块,独立保存在各单元中。不像单一磁盘文件系统,如果HDFS中的文件比block小,它不会占用block的整个存储空间(例如,一个1M的文件存储在128M的block中,它只使用1M的磁盘空间而不是128M)。4.3.3名称节点名称节点(NameNode)是一个中心服务器,负责管理整个文件系统的名字空间(Namespace)和元数据,以及处理来自客户端的文件访问请求。NameNode保存了文件系统的三种元数据:1)命名空间,即整个分布式文件系统的目录结构;2)数据块与文件名的映射表;3)每个数据块副本的位置信息,每一个数据块默认有3个副本。4.3.4数据节点DataNode节点用来实际存储文件的数据块,文件的每个数据块默认的大小为128M(hadoop2.x)。为了防止数据丢失,一个数据块Block会在多个DataNode中进行冗余备份,每个数据块默认有3个副本。一个HDFS集群可能包含上千个DataNode节点,它们定时和NameNode进行通信,接受NameNode的指令;为了减轻NameNode的负担,NameNode上并不永久保存哪个DataNode上有哪些数据块的信息,而是通过DataNode启动时的上报来更新NameNode上的映射表。DataNode和NameNode建立连接后,就会不断地和NameNode保持联系进行信息反馈,反馈信息中也包含了NameNode对DataNode的一些命令,如删除数据块或者把数据块复制到另一个DataNode。4.3.4数据节点DataNode也作为服务器接受来自客户端的访问,处理数据块读/写请求。DataNode之间还会相互通信,执行数据块复制任务,同时,在客户端执行写操作的时候,DataNode之间需要相互配合,以保证写操作的一致性。DataNode会通过心跳(Heartbeat)定时向NameNode发送所存储的文件块信息。4.3.5第二名称节点Hadoop中使用SecondaryNameNode来备份NameNode的元数据,以便在NameNode失效时能从SecondaryNameNode恢复出NameNode上的元数据。但NameNode中保存了整个文件系统的元数据,而SecondaryNameNode只是周期性保存NameNode的元数据,包括元数据镜像文件(FsImage)数据和操作日志文件(EditLog)数据。FsImage相当于HDFS的检查点,NameNode启动时会读取FsImage的内容到内存,并将其与EditLog日志中的所有修改信息合并生成新的FsImage;在NameNode运行过程中,所有关于HDFS的修改都将写入EditLog。若NameNode失效,可以通过SecondaryNameNode中保存的FsImage和EditLog数据恢复出NameNode最近的状态。4.3.6客户端严格来讲,客户端并不能算是HDFS的一部分,但客户端是用户和HDFS通信最常见也是最方便的渠道,而且部署的HDFS都会提供客户端。客户端为用户提供了一种可以通过与Linux中的Shell类似的方式访问HDFS的数据。客户端支撑最常见的操作如打开、读取、写入等,而且命令的格式也和Shell十分相似,大大方便了程序员和管理员的操作。Client(代表用户)通过与NameNode和DataNode交互访问HDFS中的文件。25第4章Hadoop分布式文件系统4.1分布式文件系统的结构4.2HDFS基本特征4.3HDFS存储架构及组件功能4.4HDFS的文件访问过程4.5HDFS操作常用Shell命令4.6HDFS编程实践4.4HDFS的文件访问过程在一个集群中采用单一的NameNode可大大简化系统的架构,简化操作流程。虽然NameNode记录了HDFS的元数据,但是,客户端程序访问文件时,实际的文件数据流并不会通过NameNode传送,而是从NameNode获得所需访问数据块的存储位置信息后,直接去访问对应的DataNode获取数据。这样设计有两个好处:一是可以允许一个文件的数据能同时在不同DataNode上并发访问,提高访问数据的速度;二是可以大大减少NameNode的负担,避免NameNode成为访问数据的瓶颈。4.4HDFS的文件访问过程HDFS的基本文件访问过程如下。(1)首先,用户通过客户端将文件名发送至NameNode;(2)NameNode接收到文件名之后,在HDFS的目录中检索文件名对应的数据块,再根据数据块信息找到保存数据块的DataNode地址,将这些地址回送给客户端;(3)客户端接收到这些DataNode地址之后,与这些DataNode并行地进行数据传输操作,同时将操作结果的相关日志(比如数据读写是否成功、修改后的数据块信息等)提交到NameNode。4.4HDFS的文件访问过程4.4.1HDFS读文件流程4.4HDFS的文件访问过程4.4.1HDFS读文件流程(1)客户端首先调用DistributedFileSystem对象的open方法打开文件,调用open方法后,DistributeFileSystem会创建输入流FSDataFileSystem,对于HDFS而言,具体的输入流就是DFSInputStream。(2)输入流通过ClientProtocal.getBlockLocations()远程调用名称节点,获得文件的第一批数据块的位置,同一数据块按照副本数会返回多个位置,距离客户端近的排在前面;然后,DistributedFileSystem会利用DFSInputStream来实例化FSDataInputStream,返回给客户端,同时返回数据块的数据节点地址。(3)获得输入流DFSInputStream对象后,客户端调用read方法开始读取数据,通过DFSInputStream可以方便的管理DataNode和NameNode数据流。DFSInputStream就会找出离客户端最近的DataNode建立连接并读取数据。4.4HDFS的文件访问过程4.4.1HDFS读文件流程(4)数据从DataNode源源不断的流向客户端,如果第一个数据块的数据读完了,就会关闭指向第一个数据块的DataNode连接。输入流通过getBlockLocations方法查找下一个数据块(如果客户端缓存中已经包含了该数据块的位置信息,就不需要调用该方法)读取数据。(5)如果第一批数据块都读完了,DFSInputStream就会去NameNode获取下一批数据块的位置,然后继续读,如果所有的数据块都读完,调用FSDataInputStream的close方法,关闭输入流。4.4HDFS的文件访问过程4.4.2HDFS写文件流程32第4章Hadoop分布式文件系统4.1分布式文件系统的结构4.2HDFS基本特征4.3HDFS存储架构及组件功能4.4HDFS的文件访问过程4.5HDFS操作常用Shell命令4.6HDFS编程实践4.5HDFS操作常用Shell命令HDFS支持多种Shell命令方式,例如hadoopfs、hadoopdfs和hdfsdfs都是HDFS最常用的Shell命令,分别用来查看HDFS文件系统的目录结构、上传和下载数据、创建文件等,这3个命令既有相同点又有区别。(1)hadoopfs:适用于任何不同的文件系统,例如本地文件系统和HDFS文件系统。(2)hadoopdfs:只能适用于HDFS文件系统。(3)hdfsdfs:跟hadoopdfs命令的作用一样,也只能适用于HDFS文件系统。4.5HDFS操作常用Shell命令4.5.1查看命令使用方法登录Linux系统,打开一个终端,首先启动Hadoop,命令如下:cd/usr/local/hadoop./sbin/start-dfs.sh可以在终端输入如下命令,查看hdfsdfs总共支持哪些操作cd/usr/local/hadoop./bin/hdfsdfshdfsdfs命令的统一格式是类似hdfsdfs–ls这种形式,即在“-”后面跟上具体的操作。4.5HDFS操作常用Shell命令4.5.2HDFS目录操作Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。命令如下:cd/usr/local/hadoop./bin/hdfsdfs-mkdir-p/user/hadoop该命令表示在HDFS中创建一个/user/hadoop目录,-mkdir是创建目录的操作,-p表示如果是多级目录,则父目录和子目录一起创建,这里/user/hadoop就是一个多级目录,因此必须使用参数-p,否则会出错。36第4章Hadoop分布式文件系统4.1分布式文件系统的结构4.2HDFS基本特征4.3HDFS体系结构4.4HDFS的文件访问过程4.5HDFS操作常用Shell命令4.6HDFS编程实践4.6HDFS编程实践Hadoop采用Java语言开发,提供了JavaAPI与HDFS进行交互。上面介绍的Shell命令,在执行时实际上会被系统转换成JavaAPI调用。本书采用Eclipse工具编写Java程序。4.6.1在Eclipse中创建项目Eclipse启动以后,选择File→New→JavaProject命令,开始创建一个Java工程,会弹出如图3-4所示的界面。4.6HDFS编程实践单击界面底部的Next按钮,进入下一步设置。4.6.2为项目添加需要用到的JAR包这些JAR包中包含了可以访问HDFS的JavaAPI。这些JAR包都位于Linux系统的Hadoop安装目录下,对于本书而言,就是在/usr/local/hadoop/share/hadoop目录下。单击界面中的Libraries选项卡,然后单击界面右侧的AddExternalJARs按钮,会弹出如图3-6所示的界面。4.6HDFS编程实践单击界面底部的Next按钮,进入下一步设置。4.6.2为项目添加需要用到的JAR包为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:(1)/usr/local/hadoop/share/hadoop/common目录下的hadoop-common-2.7.1.jar和hadoop-nfs-2.7.1.jar。(2)/usr/local/hadoop/share/hadoop/common/lib目录下的所有JAR包。(3)/usr/local/hadoop/share/hadoop/hdfs目录下的hadoop-hdfs-2.7.1.jar和hadoop-hdfs-nfs-2.7.1.jar。(4)/usr/local/hadoop/share/hadoop/hdfs/lib目录下的所有JAR包。4.6HDFS编程实践4.6.3编写Java应用程序下面编写一个Java应用程序,用来检测HDFS中是否存在一个文件。在Eclipse工作界面左侧的PackageExplorer面板中找到刚才创建好的工程名称HDFSExample(如图3-9所示),然后在该工程名称上右击,在弹出的菜单中选择New→Class命令。出现如图3-10所示的界面。4.6HDFS编程实践4.6.3编写Java应用程序下面编写一个Java应用程序,用来检测HDFS中是否存在一个文件。在Eclipse工作界面左侧的PackageExplorer面板中找到刚才创建好的工程名称HDFSExample(如图3-9所示),然后在该工程名称上右击,在弹出的菜单中选择New→Class命令。出现如图3-10所示的界面。在该界面中,只需要在Name后面输入新建的Java类文件的名称,这里采用名称HDFSFileIfExist,其它都可以采用默认设置,然后单击界面右下角的Finish按钮,出现如图3-11所示的界面。4.6HDFS编程实践4.6.3编写Java应用程序下面编写一个Java应用程序,用来检测HDFS中是否存在一个文件。在Eclipse工作界面左侧的PackageExplorer面板中找到刚才创建好的工程名称HDFSExample(如图3-9所示),然后在该工程名称上右击,在弹出的菜单中选择New→Class命令。出现如图3-10所示的界面。在该界面中,只需要在Name后面输入新建的Java类文件的名称,这里采用名称HDFSFileIfExist,其它都可以采用默认设置,然后单击界面右下角的Finish按钮,出现如图3-11所示的界面。可以看出,Eclipse自动创建了一个名为HDFSFileIfExist.java的源代码文件,请在该文件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论