版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章HDFS分布式文件系统HDFS的简介HDFS存储架构和数据读写流程HDFS的Shell命令Java程序操作HDFSHadoop序列化Hadoop小文件处理通信机制RPCHDFS的简介HDFS存储架构和数据读写流程HDFS的Shell命令Java程序操作HDFSHadoop序列化Hadoop小文件处理通信机制RPC掌握HDFS的架构和原理了解Hadoop小文件处理方式掌握HDFS的Shell和JavaApi操作了解Hadoop序列化3.1HDFS的简介3.1.1HDFS的概念3.1.2HDFS数据的存储和读取方式3.1.3HDFS的特点3.1 HDFS的简介HDFS(HadoopDistributedFileSystem,Hadoop分布式文件系统)是一种通过网络实现文件在多台主机上进行分布式存储的文件系统。分布式存储比普通存储方式节省时间。例如,现有10台计算机,每台计算机上有1TB的硬盘。如果将Hadoop安装在这10台计算机上,就可以使用HDFS进行分布式的文件存储。相当于登录到一台具有10TB存储容量的大型机器,而用HDFS分布式文件存储方式在10台计算机上存储,显然比用普通方式在1台计算机上存储更节省时间,这就如同3个人吃3个苹果比1个人吃3个苹果要快。3.1.1 HDFS的概念3.1 HDFS的简介3.1.1 HDFS的概念1.NameNodeNameNode(名称节点)管理文件系统的命名空间。它负责维护文件系统树及树内所有的文件和目录。这些信息以两个文件(命名空间镜像文件和编辑日志文件)的形式永久保存在本地磁盘上。同时NameNode也记录着每个文件中各个块所在的数据节点信息,但它并不永久保存块的位置信息,因为这些信息在系统启动时由数据节点重建。2.DataNodeDataNode(数据节点)是HDFS实例中在单独机器上运行的一个软件,Hadoop集群中包含了一个NameNode和大量的DataNode。一般情况下DataNode以机架的形式组织,机架通过一个交换机把所有的系统连接起来。3.1 HDFS的简介3.1.1 HDFS的概念Hadoop的一个假设是:机架内部节点之间的传输速度要快于机架间的传输速度。DataNode响应来自HDFS客户机的读写请求。它们还响应来自NameNode的创建、删除和复制块的命令。NameNode依赖来自每个DataNode的定期心跳(Heartbeat)消息。每条消息都包含一个块报告,NameNode可以根据这个报告验证块映射和其他文件系统元数据。如果DataNode不发送心跳消息,NameNode将采取修复措施,重新复制该节点上丢失的块。3.1 HDFS的简介(1)对大文件的存储,HDFS采用分割的方式解决。HDFS将大文件分割到既定的存储块(Block)中进行存储,并通过本地设定的任务节点进行预处理。(2)对于大量小文件的存储,HDFS通过普通的编程与压缩方式。在实际工作中,更多时候需要存储大量的小文件。(3)对于普通文件的读取操作,HDFS通常采用分批次的方式。(4)对于大量数据的读取,HDFS采用集中式。存储时的优化使得读取能够在一个连续的区域内进行,节省读取数据的时间。(5)对于少量数据的随机读取,HDFS一般采用按序读取的方式,即先把少量的随机读取操作合并,然后按顺序读取数据。3.1.2 HDFS数据的存储和读取方式3.1 HDFS的简介1.HDFS的优点(1)成本低。HDFS可以部署在价格低廉的硬件上,成本较低。例如,只要有台式机或笔记本电脑,就可以部署HDFS。(2)高容错。HDFS利用众多服务器实现分布式存储,每个数据文件都有2个冗余备份,也就是每个数据文件都将被存储3次。如果存储数据的某个服务器发生了故障,数据还有2个备份,因此,HDFS具有高容错的特性,允许服务器发生故障。(3)高吞吐量。吞吐量是指单位时间内完成的工作量。HDFS实现了并行处理海量数据,大大缩短了处理时间,从而实现了高吞吐量。(4)存储数据种类多。HDFS可以存储任何类型的数据,如结构化的数据、非结构化的数据、半结构化的数据。3.1.3 HDFS的特点3.1 HDFS的简介(5)可移植。HDFS可以实现不同平台之间的移植。2.HDFS的缺点(1)高延时。HDFS不适用于对延迟敏感的数据访问。(2)不适合小文件存取场景。对Hadoop系统而言,小文件通常指远小于HDFS的数据块大小(128MB)的文件,由于每个文件都会产生各自的元数据,Hadoop通过NameNode来存储这些信息,若小文件过多,容易导致NameNode存储出现瓶颈。(3)不适合并发写入。HDFS目前不支持并发多用户的写操作,写操作只能在文件末尾追加数据。3.1.3 HDFS的特点3.2HDFS存储架构和数据读写流程3.2.1HDFS的存储架构3.2.2HDFS的数据读写流程3.2 HDFS存储架构和数据读写流程对于HDFS架构来说,一个HDFS基本集群的节点主要包括NameNode、DataNode、SecondaryNameNode。HDFS采用的主/从模式架构,如图所示。3.2.1 HDFS的存储架构1.HDFS的Client、NameNode、DataNode在上图中,Client是客户端,NameNode是名称节点,SecondaryNamenode是辅助名称节点,DataNode是数据节点。下面分别介绍各部分的功能。(1)Client。Client主要负责切分文件,与各节点进行交互。切分文件是把文件分割成数据块(Block)。数据块默认大小是128M,每个数据块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认有3个副本)。交互包括与NameNode进行交互,Client从NameNode获取文件的元数据;从DataNode读取数据和向DataNode写入数据。3.2.1 HDFS的存储架构3.2 HDFS存储架构和数据读写流程元数据是指描述数据属性的数据。数据属性包括存储位置、格式、权限、大小、历史版本等。(2)NameNode。NameNode是HDFS架构中的主节点(Master)。HDFS架构中只有一个NameNode。NameNode主要负责管理HDFS的元数据,配置副本的放置策略,处理Client请求。HDFS副本的放置策略称为机架感知策略。以默认的3个副本为例,具体策略如下。①第一个副本放在本地机架的一个节点上。②第二个副本放在同一机架的另一个节点(随机选择)上。③第三个副本放在不同机架的节点上。如果还有更多的副本就随机放在集群的其他节点上。3.2.1 HDFS的存储架构3.2 HDFS存储架构和数据读写流程这种策略减少了机架间的数据传输,从而提高了写操作的效率。机架故障的可能性远小于节点故障的可能性,因此这个策略保证了数据的可靠性。为了降低整体的带宽消耗和读取延时,HDFS会让程序尽量读取离它最近的副本。如果读取程序的同一个机架上有一个副本,那么就读取该副本;如果一个Hadoop集群跨越多个数据中心,那么优先读取本地数据中心的副本。(3)DataNode。DataNode是HDFS架构中的从节点(Slave)。DataNode负责存储Client发来的数据块,执行数据块的读写操作,汇报存储信息NameNode。3.2.1 HDFS的存储架构3.2 HDFS存储架构和数据读写流程(4)fsimage和edits。fsimage(镜像文件)和edits(日志文件)是NameNode中两个很重要的文件。fsimage是元数据镜像文件,内容是NameNode启动时对整个文件系统的快照(即备份)。edits是元数据操作日志,内容是每次保存fsimage之后至下次保存fsimage之间进行的所有HDFS操作。(5)SecondaryNameNode。SecondaryNameNode主要是用来进行镜像备份,对NameNode中的edits文件与fsimage文件进行定期合并。镜像备份是指备份fsimage文件。随着操作HDFS的次数越来越多,edits文件也会越来越多,所占存储空间越来越大。如果NameNode出现故障,NameNode重启时,会先把fsimage文件加载到内存中,然后合并edits文件,edits文件占空间大会导致NameNode重启很耗时。对于实际操作来说,这是一个比较麻烦的问题。SecondaryNameNode对Namenode中的edits文件与fsimage文件进行定期合并,很好地解决了这一问题,这也是HDFS高容错特点的一个表现。3.2.1 HDFS的存储架构3.2 HDFS存储架构和数据读写流程合并edits文件和fsimage文件,SecondaryNameNode每隔1小时执行1次,可能会出现数据丢失问题。目前大部分企业采用Hadoop的HA(HighAvailable,高可用)模式下备用的NameNode,对Namenode中的edits文件与fsimage文件进行实时合并。2.HDFS数据损坏的处理在HDFS架构使用过程中,可能会出现数据损坏的情况。这种情况发生时HDFS处理步骤如下。(1)当DataNode读取Block时,会计算Checksum(校验和)。(2)如果计算出的Checksum与Block创建时值不一样,说明该Block已经损坏。(3)Client读取其他DataNode上的Block。3.2.1 HDFS的存储架构3.2 HDFS存储架构和数据读写流程(4)NameNode标记该Block已经损坏,然后复制Block达到预先设置的文件副本数。(5)DataNode在新文件创建三周后验证其Checksum。3.2.1 HDFS的存储架构3.2 HDFS存储架构和数据读写流程HDFS的数据读取流程,如下图所示。3.2.2 HDFS的数据读写流程3.2 HDFS存储架构和数据读写流程下面对这一过程进行具体讲解。(1)Client(客户端)通过调用FileSystem对象的get()方法打开需要读取的文件,这是一个常见的HDFS读取实例。(2)FileSystem通过远程过程调用协议调用NameNode的元数据来确定文件的前几个Block在DataNode上的存放位置,以便加快读取速度。接下来,DataNode按照机架距离进行排序,如果Client本身就是一个DataNode,那么优先从本地DataNode节点读取数据。HDFS实例做完以上工作后,返回一个FSDataInputStream(输入流)给Client,让其从FSDataInputStream中读取数据。接下来,FSDataInputStream封装一个DFSInputStream,用来管理DataNode和NameNode的输入或输出(Input或Output,I/O)。(3)NameNode向Client返回一个包含数据信息的地址,Client根据地址创建一个FSDataInputStream开始对数据进行读取。3.2.2 HDFS的数据读写流程3.2 HDFS存储架构和数据读写流程(4)FSDataInputStream根据前几个Block在DataNode的存放位置,连接到最近的DataNode。Client反复调用read()方法,从DataNode读取数据。(5)当读到Block的结尾时,FSDataInputStream会关闭当前DataNode的连接,查找能够读取下一个Block的最近的DataNode。(6)读取完成后,调用close()方法,关闭FSDataInputStream。以上是HDFS的数据读取流程。如果在HDFS数据读取期间,Client与DataNode间的通信发生错误,Client会寻找下一个最近的DataNode。Client记录发生错误的DataNode,以后不再读取该DataNode上数据。3.2.2 HDFS的数据读写流程3.2 HDFS存储架构和数据读写流程HDFS的数据写入流程,如图所示。3.2.2 HDFS的数据读写流程3.2 HDFS存储架构和数据读写流程下面对这一过程进行具体讲解。(1)Client通过调用FileSystem的create()方法来请求创建文件。(2)FileSystem通过对NameNode发出远程请求,在NameNode里面创建一个新的文件。FileSystem给Client返回一个FSDataOutputStream(输出流)用来写入数据。FSDataOutputStream封装一个DFSOutputStream用于DataNode与NameNode间的通信。(3)FSDataOutputStream把需要写入的数据分成Packet(数据包)的形式,由DataStreamer来读取。DataStreamer的职责是让NameNode给合适的DataNode分配Block来备份数据。假设有3个DataNode,DataStreamer将数据写入第一个DataNode后,第一个DataNode将Packet复制到第二个DataNode,然后第二个DataNode将Packet复制到第三个DataNode。3.2.2 HDFS的数据读写流程3.2 HDFS存储架构和数据读写流程(4)FSDataOutputStream维护了一个内部关于Packets的队列,其中存放等待被DataNode确认无误的Packets的信息。这个队列称为等待队列。当且仅当Packet被所有DataNode确认无误后,一个Packet才被移出本队列。(5)Client完成数据的写入后,会调用数据流的close()方法,关闭数据流。Client再将写入完成的信息反馈给NameNode。以上是HDFS的数据写入流程。如果写入数据时,DataNode发生错误,其处理过程如下。(1)发现错误后,关闭数据流,将没有被确认的数据放到数据队列的开头。当前的Block被赋予一个新的标识,发给NameNode,在损坏的DataNode恢复后,删除这个没有被完成的Block。3.2.2 HDFS的数据读写流程3.2 HDFS存储架构和数据读写流程(2)移除损坏的DataNode。NameNode检测到一个Block的信息还没有被复制完成,转而在其他的DataNode上安排复制。接下来,Block写入操作见HDFS的数据写入流程。以上对HDFS数据的读取和写入的流程进行了讲解,了解这些基本原理,对于深入学习和应用HDFS非常重要。3.2.2 HDFS的数据读写流程3.2 HDFS存储架构和数据读写流程HDFS提供了Shell命令来操作HDFS,这些Shell命令和对应的LinuxShell命令相似,这样设计有利于使用者快速学会操作HDFS。在使用Shell命令操作HDFS之前,需要先启动Hadoop。3.3 HDFS的Shell命令HDFS常见的Shell命令如下。1.put(1)put命令可以上传本地(CentOS系统)文件或本地目录到HDFS目录,使用方法如下。HDFSShell命令的一般格式如下。(2)通过示例演示其用法。①新建本地文件1.txt,并写入内容hello。3.3 HDFS的Shell命令②把本地文件1.txt上传到HDFS的根目录下。③新建本地目录data,把目录data上传到HDFS的根目录下。2.ls(1)ls命令可以列出HDFS文件或目录,使用方法如下。(2)通过示例演示其用法。3.cat(1)cat命令可以查看HDFS文件的内容,使用方法如下。(2)通过示例演示其用法。3.3 HDFS的Shell命令4.get(1)gat命令可以下载HDFS文件或目录到本地,使用方法如下。(2)通过示例演示其用法。3.3 HDFS的Shell命令5.其他常用命令3.4Java程序操作HDFS3.4.1HDFSJavaAPI概述3.4.2使用JavaAPI操作HDFS3.4 Java程序操作HDFS除了可以使用HDFSShell命令操作HDFS外,还可以通过Java程序操作HDFS。在实际工作中,大多数情况下是通过程序来操作HDFS的。3.4 Java程序操作HDFSJava程序通过Hadoop提供的文件操作类可以进行读写HDFS文件、上传HDFS文件等操作。这些文件操作类都在org.apache.hadoop.fs包中(详见Hadoop的JavaAPI文档)。API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数。API使应用程序与开发人员获得了一种重要能力:无须访问源码或理解内部工作机制细节,即可访问一组例程。3.4.1 HDFSJavaAPI概述3.4 Java程序操作HDFS本节将通过JavaAPI来演示如何操作HDFS文件系统,包括文件上传、下载以及目录。1.配置开发环境(1)配置Java环境。在Windows系统下配置Java环境,也就是安装JDK,记住JDK安装路径。这里用的JDK版本是1.8.0_121,安装包见附录(jdk-8u121-windows-x64.exe)。(2)安装InterlliJIDEA(安装包见附录),导入配置文件Settings,添加Maven依赖(配置pom.xml文件)。①Maven简介。Maven是通过项目对象模型文件pom.xml来管理项目的构建、报告和文档的工具。简言之,Maven是一种项目管理工具。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFSpom.xml文件是Maven的基本单元。Maven最强大的功能是通过pom.xml文件自动下载项目依赖库。②配置文件Settings。用户在熟练使用InterlliJIDEA后,可以对InterlliJIDEA进行个性化配置。本书直接提供了Settings文件,有利于缩短前期的探索时间。导入配置文件Settings的方法:单击InterlliJIDEA中菜单栏中的“File”,在下拉列表中单击“ImportSettings...”选项,选择Settings文件的存放位置,单击“OK”即可。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS2.InterlliJIDEA新建项目InterlliJIDEA新建项目(Project)步骤如下。(1)单击InterlliJIDEA菜单栏的“File”,在下拉列表中单击“New”选项,再在出现的列表中单击“Project...”选项,如左图所示。进入新建项目对话框,如右图。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(2)在上右图中“ProjectSDK”一栏中,单击“New”按钮,出现选择JDK安装路径(SelectHomeDirectorforJDK)对话框,如图所示。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(3)在上图中,单击“jdk1.8.0_121”后,单击“OK”按钮,回到新建项目对话框;单击“Next”按钮,进入询问是否从模板中创建项目对话框,如图所示。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(4)在上图中,单击“Next”按钮,进入填写项目名称、存放位置对话框,如图所示。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(5)在上图中,在”Projectname”栏中填写“testHadoop”,在“Projectlocation”栏中填写“D:\IdeaProjects\testHadoop”,单击“Finish”按钮,出现询问是否创建目录对话框,如图所示。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(6)在上图中,单击“OK”按钮,进入新建项目完成界面,如图所示。至此,InterlliJIDEA新建项目完成。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS3.InterlliJIDEA新建模块InterlliJIDEA新建模块(Module)步骤如下。(1)在上图中,右键单击左侧“Project”栏中的项目名“testHadoop”,在出现的列表中单击“New”选项,再在出现的列表中单击“Module”选项,如左图所示,进入新建模块对话框,如右图所示。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(2)在上由图中,单击“Maven”,在“ProjectSDK”一栏中,单击“New”按钮,选择JDK的安装路径(不再赘述)。单击“Next”按钮,进入填写组织名、模块名、版本对话框,如图所示。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(3)在上图中的“GroupId”栏填写组织名“com.qf”,在“ArtifactId”栏填写模块名“testHDFS”,单击“Next”按钮,进入填写模块名称等内容的对话框,如图所示。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(4)在上图中,单击“Finish”按钮,出现待填写的pom.xml文件,如图所示。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(5)修改pom.xml文件内容如下。至此,InterlliJIDEA新建模块完成。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS4.编写Java程序(1)新建JavaOperateHDFS类。在左图中,依次双击“Project”树状目录中的“testHadoop”“testHDFS”“src”“main”目录,右键单击出现的java目录,在出现的列表中依次单击“New”“JavaClass”选项,在出现的创建新类对话框中的“Name”栏输入“com.qf.OperateHDFS”,单击“OK”按钮,出现程序编写界面,如右图所示。3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS(2)通过Java程序操作HDFS。接下来演示使用Java程序实现三个功能:将数据写入HDFS文件中,读取HDFS文件的数据,从Windows上传文件到HDFS。示例代码参见教材例3-1。(3)测试代码。①在虚拟机qf01中,单独开启HDFS进程。②进行单元测试。单元测试是指对一个模块、一个函数或者一个类进行正确性检验的测试工作。在例3-1的代码共有3个单元:将数据写入HDFS文件,读取HDFS文件,从Windows上传文件到HDFS。以“将数据写入HDFS文件”单元为例,单元测试的步骤:3.4.2 使用JavaAPI操作HDFS3.4 Java程序操作HDFS在InterlliJIDEA中,单击程序OperateHDFS.java中的“RunTest”按钮。在出现的列表中,单击“Run‘writeToHDFS()’”选项运行程序。③测试结果。运行方法writeToHDFS()后,在虚拟机qf01的终端中输入以下命令。3.4.2 使用JavaAPI操作HDFS输出helloworld即正确。运行方法readHDFSFile()后,控制台显示如下内容即正确。3.4 Java程序操作HDFS程序运行结束后,在虚拟机qf01的终端中输入以下命令。3.4.2 使用JavaAPI操作HDFS输出HelloXiaoqian即正确。至此,使用Java程序操作HDFS完成。3.5Hadoop序列化3.5.1Hadoop序列化简介3.5.2常用实现Writable接口的类3.5.3自定义实现Writable接口的类3.5 Hadoop序列化1.序列化和反序列化序列化是将对象转化为字节流,以便在网络间进行传输或者在磁盘上永久存储的过程。反序列化是将字节流转换为原对象的过程。序列化在Hadoop生态圈中有两个主要应用领域:进程间通信和永久存储。2.Hadoop序列化概述(1)序列化机制在Hadoop中的应用。Hadoop实现进程间通信的RPC(RemoteProcedureCall,远程过程调用)中就使用了序列化机制。RPC可以将消息序列转化成字节流后发送到远程节点,远程节点接着将字节流反序列化为原始消息。RPC的序列化实现了紧凑、快速、可扩展、兼容性好的格式,能够使用户充分利用网络带宽这一稀缺资源。3.5.1 Hadoop序列化简介3.5 Hadoop序列化(2)Hadoop序列化的实现。Hadoop的序列化是通过Writable接口来实现的。Writable接口的源码如下。由以上源码可知,Writable接口包含两个方法:write(DataOutputout)与readFields(DataInputin)。write()用来将数据写入指定的流中,readFields()用来从指定的流中读取数据。3.5.1 Hadoop序列化简介3.5 Hadoop序列化(3)Hadoop不使用Java的序列化的原因。Java序列化机制的缺点:计算时开销大,序列化的结果占用存储空间大,序列化后的对象有时比序列化前的对象大数倍乃至十几倍;Java序列化的引用机制导致大文件不能分割。这些缺点使得Java的序列化机制对Hadoop来说是不合适的。于是Hadoop实现了一套自己的序列化框架,相对于Java的序列化更简洁,集群信息传递的速度更快,所占存储空间更小。3.5.1 Hadoop序列化简介3.5 Hadoop序列化由于实现Writable接口的类将Java的数据类型进行了序列化,因此可以把Writable类看作Java数据类型的封装。Hadoop实现Writable接口的类与Java数据类型等的对应关系,如表所示。3.5.2 常用实现Writable接口的类实现Writable接口的类大多在HadoopAPI中的org.apache.hadoop.io包下,详见Hadoop官方网站。在Hadoop实现Writable接口的类中,最常用的是IntWritable类和Text类,下面对这两个类进行简单讲解。3.5 Hadoop序列化1.IntWritable类通过查看HadoopAPI可知,IntWritable类直接实现的是Writable接口的子接口WritableComparable。WritableComparable接口除了继承了Writable接口,还继承了java.lang.Comparable接口。WritableComparable接口对于后续学习的MapReduce非常重要。IntWritable类中的部分源码如下。3.5.2 常用实现Writable接口的类3.5 Hadoop序列化2.Text类Text类和java中的String类使用标准的Unicode(统一码),两者的区别如下。(1)两者编码方式不同。Text类使用的编码是UTF-8,String类使用的编码是UTF-16。(2)两者值的长度、索引位置的含义不同。Text值的索引位置是指UTF-8编码后的字节偏移量,Text值的长度是指UTF-8编码后的字节数组大小;而String值的索引位置是指字符在字符串中的位置,String值的长度是指字符的个数。3.5.2 常用实现Writable接口的类3.5 Hadoop序列化Text类的大多数操作与Java的String类一样,但是当使用多字节的值时,就可以看出两者的区别。接下来编写程序,来验证Text类和Java的String类的区别。在InterlliJIDEA中testHDFS模块的src/main/java文件夹下,新建类com.qf.serialize.TestText,示例代码参见教材例3-2。3.5.2 常用实现Writable接口的类3.5 Hadoop序列化Hadoop自带一系列实现Writable接口的类,绝大多数情况下可以满足用户的需求,但有时需要自定义实现Writable接口的类,来应对复杂的业务需求。下面通过编程来自定义实现Writable接口的类,本书以自定义实现Writable的子接口WritableComparable为例。在InterlliJIDEA中testHDFS模块的src/main/java文件夹下,新建类com.qf.serialize.PersonWritable,示例代码参见教材例3-3。3.5.3 自定义实现Writable接口的类3.6Hadoop小文件处理3.6.1压缩小文件3.6.2创建序列文件3.6 Hadoop小文件处理Hadoop是为处理大型文件所设计的,在小文件的处理上效率较低,然而在实际生产环境中,需要Hadoop处理的数据往往存放在海量小文件中。因此,高效处理小文件对于提高Hadoop的性能至关重要。这里的小文件是指小于HDFS中一个块(Block)大小的文件。Hadoop处理小文件有两种方法:压缩小文件和创建序列化文件。3.6 Hadoop小文件处理Hadoop在存储海量小文件时,需要频繁访问各节点,非常耗费资源。如果某个节点上存放1000万个600Byte大小的文件,那么该节点上至少需要提供4GB的内存。为了节省资源,海量小文件在存储到HDFS之前,需要进行压缩。1.Hadoop压缩格式Hadoop进行文件压缩的作用:减少存储空间占用,降低网络负载。这两点对于Hadoop存储和传输海量数据非常重要。Hadoop常用的压缩格式,如表所示。3.6.1 压缩小文件3.6 Hadoop小文件处理2.编解码器编解码器(Codec)是指用于压缩和解压缩的设备或计算机程序。Hadoop中的编压缩解码器主要是通过Hadoop的一些类来实现的,如表所示。3.6.1 压缩小文件对于LZO压缩格式,Hadoop实现压缩编解码器的类不在press包中,可前往GitHub官方网站下载。3.6 Hadoop小文件处理3.压缩格式的效率对上述6种压缩格式的压缩效率、解压效率、压缩占比进行测试,测试结果如下。3.6.1 压缩小文件在实际生产环境中,可以参考以上的测试结果,根据业务需要做出恰当的选择。3.6 Hadoop小文件处理创建序列文件主要是指创建SequenceFile(顺序文件)和MapFile(映射文件)。1.SequenceFile(1)SequenceFile简介。SequenceFile是存储二进制键值(Key-Value)对的持久数据结构。通过SequenceFile可以将若干小文件合并成一个大的文件进行序列化操作,实现文件的高效存储和处理。3.6.2 创建序列文件3.6 Hadoop小文件处理(2)SequenceFile的内部结构SequenceFile由一个文件头(Header)和随后的一条或多条记录(Record)组成(如图所示)。Header的前三个字节SEQ(顺序文件代码),随后的一个字节是SequenceFile的版本号。Header还包括Key类的名称、Value类的名称、压缩细节、Metadata(元数据)、SyncMarker(同步标识)等。SyncMarker的作用在于可以读取SequenceFile任意位置的数据。3.6.2 创建序列文件3.6 Hadoop小文件处理记录有无压缩、记录压缩、块压缩三种压缩形式,默认为无压缩。①当采用无压缩(NoCompress)时,每条记录由记录长度、键长度、键、值组成,将键与值序列化写入SequenceFile。②当采用记录压缩(RecordCompress)时,只压缩值,不压缩键,其他方面与无压缩类似。③块压缩(BlockCompress)利用记录间的相似性进行压缩,一次性压缩多条记录,比单条记录的压缩方法压缩效率更高。当采用块压缩时,多条记录被压缩成默认1MB的数据块,每个数据块之前插入同步标识。数据块由表示数据块字节数的字段和压缩字段组成,其中,压缩字段包括键长度、键、值长度、值。3.6.2 创建序列文件3.6 Hadoop小文件处理下面通过编程来理解SequenceFile的读写操作。(3)SequenceFile写操作。①在虚拟机qf01上启动Zookeeper集群和Hadoop集群。查看处于活跃状态的NameNode,以下操作需要在活跃的NameNode上进行。本书以nn1处于活跃状态为例进行讲述。3.6.2 创建序列文件2)在虚拟机qf01上新建空文件MySequenceFile.seq,并上传到HDFS的根目录下。③编写程序,实现SequenceFile写操作,具
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆公务员试题及答案
- 管理公务员试题及答案
- 公务员分析试题及答案
- 吕梁市临县2025-2026学年第二学期四年级语文第八单元测试卷(部编版含答案)
- 哈尔滨市平房区2025-2026学年第二学期五年级语文第八单元测试卷(部编版含答案)
- 青岛市胶南市2025-2026学年第二学期五年级语文第八单元测试卷(部编版含答案)
- 吕梁市离石区2025-2026学年第二学期四年级语文第八单元测试卷(部编版含答案)
- 沪科版八年级全册第六节 神奇的眼睛教学设计
- 清新区2025年中考语文三模试卷
- 初中语文19 皇帝的新装教学设计
- 脐带脱垂急救的护理个案
- NCCN临床实践指南:急性髓性白血病(2026.v3)课件
- 消防工程施工总结汇报
- 园长培训协议书范本
- 2025课堂惩罚 主题班会:马达加斯加企鹅课堂惩罚 课件
- 棉花枯萎病课件
- 雨课堂学堂云在线《高级医学英语(首都医大 )》单元测试考核答案
- 电阻器中职课件
- 客户订单管理SOP文件
- 学校教辅选用管理委员会成立方案
- 储能电站无人值守运行方案
评论
0/150
提交评论