《大数据技术实战案例教程》课件实验指导书-实验2HDFS实战_第1页
《大数据技术实战案例教程》课件实验指导书-实验2HDFS实战_第2页
《大数据技术实战案例教程》课件实验指导书-实验2HDFS实战_第3页
《大数据技术实战案例教程》课件实验指导书-实验2HDFS实战_第4页
《大数据技术实战案例教程》课件实验指导书-实验2HDFS实战_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

《大数据技术实战案例教程》实验指导书实验2HDFS实战编写者:徐鲁辉实验2HDFS实战2.1实验目的1.理解HDFS体系架构。2.理解HDFS文件存储原理和数据读写过程。3.熟练掌握HDFSWebUI界面的使用。4.熟练掌握HDFSShell常用命令的使用。5.熟练掌握HDFS项目开发环境的搭建。6.掌握使用HDFSJavaAPI编写HDFS文件操作程序。2.2实验环境本实验所需的软件环境包括全分布模式Hadoop集群、Eclipse安装包。2.3实验内容1.启动全分布模式Hadoop集群,守护进程包括NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager和JobHistoryServer。2.查看HDFSWebUI界面。3.练习HDFSShell文件系统命令和系统管理命令。4.在Hadoop集群主节点上搭建HDFS开发环境Eclipse。5.创建Java项目HDFSExample,在其下建立新包com.xijing.hdfs,使用HDFSJavaAPI编写HDFS文件操作程序,实现上传本地文件到HDFS的功能,采用本地执行和集群执行的两种执行方式测试,观察结果。6.使用HDFSJavaAPI编写HDFS文件操作程序,实现查看上传文件在HDFS集群中位置的功能,采用本地执行和集群执行的两种执行方式测试,观察结果。7.关闭全分布模式Hadoop集群。2.4实验原理2.4.1初识HDFSHDFS(HadoopDistributedFileSystem)是Hadoop分布式文件系统,是Hadoop三大核心之一,是针对谷歌文件系统GFS(GoogleFileSystem)的开源实现。HDFS是一个具有高容错性的文件系统,适合部署在廉价的机器上,HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。大数据处理框架如MapReduce、Spark等要处理的数据源大部分都存储在HDFS上,Hive、HBase等框架的数据通常也存储在HDFS上。简而言之,HDFS为大数据的存储提供了保障。经过多年的发展,HDFS自身已经十分成熟和稳定,且用户群愈加广泛,HDFS逐渐成为分布式存储的事实标准。2.4.2HDFS体系架构HDFS采用主从(Master/Slave)架构模型,一个典型的HDFS集群中,通常包括一个NameNode、一个SecondaryNameNode以及至少一个DataNode,HDFS客户端的数量不受限制。名称节点NameNode为主节点,数据节点DataNode为从节点,文件被划分为一系列的数据块(Block)存储在从节点DataNode上,NameNode不存储数据,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。HDFS体系架构如图2-1所示。图2-1HDFS体系架构2.4.3HDFS文件存储原理1.数据块BlockHDFS中的数据以文件块Block的形式存储,Block是最基本的存储单位,每次读写的最小单元是一个Block。对于文件内容而言,一个文件的长度大小是N,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。Hadoop2.0中默认Block大小是128MB,以一个N=256MB的文件为例,被切分成256/128=2个Block。不同于普通文件系统,HDFS中如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。Block的大小可以根据实际需求进行配置,可以通过HDFS配置文件hdfs-site.xml中的参数dfs.blocksize来定义块大小,但要注意,数字必须是2K,文件的大小可以不是Block大小的整数倍,这时最后一个块可能存在剩余。例如,一个文件大小是260MB,在Hadoop2.0中占用三个块,第三个块只使用了4MB。2.副本存放策略HDFS采用多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的DataNode上。HDFS副本策略实际上就是NameNode如何选择在哪个DataNode上存储副本的问题。这里需要对可靠性、写入带宽和读取带宽进行权衡。Hadoop对DataNode存储副本拥有自己的副本策略,块副本存放位置的选择严重影响HDFS的可靠性和性能。HDFS采用机架感知(RackAwareness)的副本策略来提高数据的可靠性、可用性和网络带宽的利用率。3.数据读取HDFS的真实数据分散存储在DataNode上,但是读取数据时需要先经过NameNode。HDFS数据读取的基本过程为:首先客户端连接到NameNode询问某个文件的元数据信息,NameNode返回给客户一个包含该文件各个块位置信息(存储在哪个DataNode)的列表;然后,客户端直接连接对应DataNode来并行读取块数据;最后,当客户得到所有块后,再按照顺序进行组装,得到完整文件。为了提高物理传输速度,NameNode在返回块的位置时,优先选择距离客户更近的DataNode。客户端读取HDFS上的文件时,需要调用HDFSJavaAPI一些类的方法,从编程角度来看,从HDFS读取数据主要经过以下几个步骤,如图2-2所示。客户端客户端JVM1352数据节点DataNode23515312客户端DistributedFileSytemFSDataInputStreamDFSInputStream名称节点NameNode(2)获取数据块信息(4)读取请求(7)关闭文件(3)生成对象实例(5)读取数据6.读取数据元数据(名称,块个数,地址,……)(1)打开文件(6)读取数据…数据节点DataNode数据节点DataNode图2-2HDFS数据读取过程(1)客户端生成一个FileSystem实例(DistributedFileSystem对象),并使用此实例的open()方法打开HDFS上的一个文件。(2)分布式文件系统(DistributedFileSystem)通过远程过程调用(RemoteProcedureCall,RPC)向NameNode发出请求,获得文件第一批块的位置信息,即数据块编号和所在DataNode地址,同一数据块按照副本数会返回多个位置信息,这些位置信息按照Hadoop拓扑结构排序,距离客户端近的排在前面。(3)FileSystem实例获得地址信息后,生成一个文件系统数据输入流(FSDataInputStream)对象实例返回给客户端,此实例封装了一个分布式文件系统数据输入流(DFSInputStream)对象,负责存储数据块信息和DataNode地址信息,并负责后续的文件内容读取工作。(4)客户端向FSDataInputStream发出读取数据的read()调用。(5)FSDataInputStream收到read()调用请求后,FSDataInputStream封装的DFSInputStream选择与第一个数据块最近的DataNode,并读取相应的数据信息返回给客户端,在第一个数据块读取完成后,DFSInputStream负责关闭指向第一个块的DataNode连接,接着读取下一个块。这些操作从客户端的角度来看只是在读一个持续不断的数据流。(6)DFSInputStream依次选择后续数据块的最近DataNode节点,并读取数据返回给客户端,直到最后一个数据块读取完毕。DFSInputStream从DataNode读取数据时,可能会遇到某个DataNode失效的情况,则会自动选择下一个包含此数据块的最近的DataNode去读取。(7)客户端读取完所有数据块,然后调用FSDataInputStream的close()方法关闭文件。从图2-5可以看出,HDFS数据读取的设计就是客户端直接连接DataNode来检索数据,并且NameNode负责为每一个块提供最优的DataNode。HDFS数据读取分散在了不同的DataNode节点上,基本上不存在单点问题,水平扩展性强,HDFS通过DataNode集群可以承受大量客户端的并发访问;对于NameNode节点,仅需处理块的位置请求,这些信息都加载在了NameNode内存中,数据I/O压力较小。4.数据写入HDFS的设计遵循“一次写入,多次读取”的原则,所有数据只能添加不能更新。数据会被划分为等尺寸的块写入不同的DataNode中。每个块通常保存指定数量的副本(默认3个)。HDFS数据写入基本过程为:客户端向NameNode发送文件写请求,NameNode给客户分配写权限,并分配块的写入地址——DataNode的IP,兼顾副本数量和块Rack自适应算法,例如副本因子是3,则每个块会分配到三个不同的DataNode,为了提高传输效率,客户端只会向其中一个DataNode复制一个副本,另外两个副本则由DataNode传输到相邻DataNode。从编程角度来说,将数据写入HDFS主要经过以下几个步骤,如图2-3所示。客户端客户端JVM1352数据节点DataNode23515312客户端DistributedFileSytemFSDataOutputStreamDFSOutputStream(2)创建文件元数据(3)写入数据(6)关闭文件(4)写入数据包(1)创建文件请求(5)接收确认包(4)(5)(5)(5)(7)写操作完成元数据(名称,块个数,地址,……)名称节点NameNode数据节点DataNode数据节点DataNode图2-3HDFS数据写入过程(1)客户端通过调用分布式文件系统DistributedFileSytem的create()方法创建新文件。(2)DistributedFileSytem通过RPC调用NameNode,在文件系统的命名空间中创建一个没有块关联的新文件。创建前,NameNode会做各种校验,例如文件是否存在、客户端有无创建文件的权限等,若校验通过,NameNode会记录下新文件,否则会抛出I/O异常。(3)FileSystem返回文件系统数据输出流(FSOutputStream)的对象,与数据读取相似,FSOutputStream被封装成分布式文件系统数据输出流(DFSOutputStream),DFSOutputStream可以协调NameNode和DataNode之间的协同工作。客户端开始写数据到DFSOutputStream。(4)DFSOutputStream将数据切成一个个小的数据包(Packet),然后排成数据队列(DataQueue)。DataQueue由DataStreamer读取,并通知NameNode分配DataNode,用来存储数据块(每块默认复制3块)。分配的DataNode放在一个数据流管道(Pipeline)里。DataStreamer将数据块写入Pipeline中的第一个DataNode,第一个DataNode将数据块发送给第二个DataNode,以此类推。(5)DFSOutputStream还维护着一个被称为响应队列(AckQueue)的队列,这个队列也由数据包组成,用于等待DataNode收到数据后返回响应数据包,当数据流管道中的所有DataNode都表示已经收到响应信息时,AckQueue才会把对应的数据包移除掉。(6)客户端完成写数据后,调用close()方法关闭写入流。(7)客户端通知NameNode把文件标记为已完成,然后NameNode把文件写成功的结果反馈给客户端,此时就表示客户端已完成了整个HDFS的数据写入过程。数据写入可以看作是一个流水线Pipeline过程,具体来说,客户端收到NameNode发送的块存储位置DataNode列表后,将做如下工作。(1)选择DataNode列表中的DataNode1,通过IP地址建立TCP连接。(2)客户端通知DataNode1准备接收块数据,同时发送后续DataNode的IP地址给DataNode1,副本随后会拷贝到这些DataNode。(3)DataNode1连接DataNode2,并通知DataNode2连接DataNode3,前一个DataNode发送副本数据给后一个DataNode,依次类推。(4)Ack确认消息遵从相反的顺序,即DataNode3收到完整块副本后返回确认给DataNode2,DataNode2收到完整块副本后返回确认给DataNode1。而DataNode1最后通知客户端所有数据块已经成功复制。对于三个副本,DataNode1会发送三个Ack给客户端表示三个DataNode都成功接收。随后,客户端通知NameNode,完整文件写入成功,NameNode更新元数据。(5)当客户端接到流水线已经建立完成的通知后,将会准备发送数据块到流水线中,然后各个数据块按序在流水线中传输。这样以来,客户端只需要发送一次,所有备份将在不同DataNode之间自动完成,提高了传输效率。2.4.4HDFS接口1.HDFSWebUIHDFSWebUI主要面向管理员,提供服务器基础统计信息和文件系统运行状态的查看功能,不支持配置更改操作。从该页面上,管理员可以查看当前文件系统中各个节点的分布信息,浏览名称节点上的存储、登录等日志,以及下载某个数据节点上某个文件的内容。HDFSWebUI地址为http://NameNodeIP:50070,进入后可以看到当前HDFS文件系统的Overview、Summary、NameNodeJournalStatus及NameNodeStorage等信息。其概览效果如图2-4所示。图2-4HDFSWebUI之概览HDFSWebUI的概要效果如图2-5所示,从图2-5中可以看到容量、活动节点等信息。图2-5HDFSWebUI之概要可以通过首页顶端菜单项『Utilities』→『Browsethefilesystem』查看目录,如图2-6所示。图2-6使用HDFSWebUI查看HDFS目录及文件2.HDFSShell1)HDFS文件系统命令HDFS文件系统命令的入口是“hadoopfs”,其语法是“hadoopfs[genericoptions]”,而命令“hdfsdfs[genericoptions]”也可以使用,它们两者的区别在于:“hadoopfs”使用面最广,可以操作任何文件系统,比如本地文件、HDFS文件、HFTP文件及S3文件系统等;而“hdfsdfs”则是专门针对HDFS文件系统的操作。“hadoopfs”命令的完整帮助如下所示。[xuluhui@master~]$hadoopfsUsage:hadoopfs[genericoptions] [-appendToFile<localsrc>...<dst>] [-cat[-ignoreCrc]<src>...] [-checksum<src>...] [-chgrp[-R]GROUPPATH...] [-chmod[-R]<MODE[,MODE]...|OCTALMODE>PATH...] [-chown[-R][OWNER][:[GROUP]]PATH...] [-copyFromLocal[-f][-p][-l][-d]<localsrc>...<dst>] [-copyToLocal[-f][-p][-ignoreCrc][-crc]<src>...<localdst>] [-count[-q][-h][-v][-t[<storagetype>]][-u][-x]<path>...] [-cp[-f][-p|-p[topax]][-d]<src>...<dst>] [-createSnapshot<snapshotDir>[<snapshotName>]] [-deleteSnapshot<snapshotDir><snapshotName>] [-df[-h][<path>...]] [-du[-s][-h][-x]<path>...] [-expunge] [-find<path>...<expression>...] [-get[-f][-p][-ignoreCrc][-crc]<src>...<localdst>] [-getfacl[-R]<path>] [-getfattr[-R]{-nname|-d}[-een]<path>] [-getmerge[-nl][-skip-empty-file]<src><localdst>] [-help[cmd...]] [-ls[-C][-d][-h][-q][-R][-t][-S][-r][-u][<path>...]] [-mkdir[-p]<path>...] [-moveFromLocal<localsrc>...<dst>] [-moveToLocal<src><localdst>] [-mv<src>...<dst>] [-put[-f][-p][-l][-d]<localsrc>...<dst>] [-renameSnapshot<snapshotDir><oldName><newName>] [-rm[-f][-r|-R][-skipTrash][-safely]<src>...] [-rmdir[--ignore-fail-on-non-empty]<dir>...] [-setfacl[-R][{-b|-k}{-m|-x<acl_spec>}<path>]|[--set<acl_spec><path>]] [-setfattr{-nname[-vvalue]|-xname}<path>] [-setrep[-R][-w]<rep><path>...] [-stat[format]<path>...] [-tail[-f]<file>] [-test-[defsz]<path>] [-text[-ignoreCrc]<src>...] [-touchz<path>...] [-truncate[-w]<length><path>...] [-usage[cmd...]]Genericoptionssupportedare:-conf<configurationfile>specifyanapplicationconfigurationfile-D<property=value>defineavalueforagivenproperty-fs<file:///|hdfs://namenode:port>specifydefaultfilesystemURLtouse,overrides'fs.defaultFS'propertyfromconfigurations.-jt<local|resourcemanager:port>specifyaResourceManager-files<file1,...>specifyacomma-separatedlistoffilestobecopiedtothemapreducecluster-libjars<jar1,...>specifyacomma-separatedlistofjarfilestobeincludedintheclasspath-archives<archive1,...>specifyacomma-separatedlistofarchivestobeunarchivedonthecomputemachinesThegeneralcommandlinesyntaxis:command[genericOptions][commandOptions]部分HDFS文件系统命令的说明如表2-1所示。表2-1HDFS文件系统命令说明(部分)命令选项功能-ls显示文件的元数据信息或者目录包含的文件列表信息-mv移动HDFS文件到指定位置-cp将文件从源路径复制到目标路径-rm删除文件,“-rm-r”或者“-rm-R”可以递归删除文件夹,文件夹可以包含子文件夹和子文件-rmdir删除空文件夹,注意:如果文件夹非空,则删除失败-put从本地文件系统复制单个或多个源路径上传到HDFS,同时支持从标准输入读取源文件内容后写入目标位置-get复制源路径指定的文件到本地文件系统目标路径指定的文件或文件夹-cat将指定文件内容输出到标准输出stdout-mkdir创建指定目录-setrep改变文件的副本系数,选项-R用于递归改变目录下所有文件的副本系数,选项-w表示等待副本操作结束才退出命令2)HDFS系统管理命令HDFS系统管理命令的入口是“hdfsdfsadmin”,其完整帮助如下所示。[xuluhui@master~]$hdfsdfsadminUsage:hdfsdfsadminNote:AdministrativecommandscanonlyberunastheHDFSsuperuser. [-report[-live][-dead][-decommissioning][-enteringmaintenance][-inmaintenance]] [-safemode<enter|leave|get|wait>] [-saveNamespace] [-rollEdits] [-restoreFailedStoragetrue|false|check] [-refreshNodes] [-setQuota<quota><dirname>...<dirname>] [-clrQuota<dirname>...<dirname>] [-setSpaceQuota<quota>[-storageType<storagetype>]<dirname>...<dirname>] [-clrSpaceQuota[-storageType<storagetype>]<dirname>...<dirname>] [-finalizeUpgrade] [-rollingUpgrade[<query|prepare|finalize>]] [-refreshServiceAcl] [-refreshUserToGroupsMappings] [-refreshSuperUserGroupsConfiguration] [-refreshCallQueue] [-refresh<host:ipc_port><key>[arg1..argn] [-reconfig<namenode|datanode><host:ipc_port><start|status|properties>] [-printTopology] [-refreshNamenodesdatanode_host:ipc_port] [-getVolumeReportdatanode_host:ipc_port] [-deleteBlockPooldatanode_host:ipc_portblockpoolId[force]] [-setBalancerBandwidth<bandwidthinbytespersecond>] [-getBalancerBandwidth<datanode_host:ipc_port>] [-fetchImage<localdirectory>] [-allowSnapshot<snapshotDir>] [-disallowSnapshot<snapshotDir>] [-shutdownDatanode<datanode_host:ipc_port>[upgrade]] [-evictWriters<datanode_host:ipc_port>] [-getDatanodeInfo<datanode_host:ipc_port>] [-metasavefilename] [-triggerBlockReport[-incremental]<datanode_host:ipc_port>] [-listOpenFiles] [-help[cmd]]Genericoptionssupportedare:-conf<configurationfile>specifyanapplicationconfigurationfile-D<property=value>defineavalueforagivenproperty-fs<file:///|hdfs://namenode:port>specifydefaultfilesystemURLtouse,overrides'fs.defaultFS'propertyfromconfigurations.-jt<local|resourcemanager:port>specifyaResourceManager-files<file1,...>specifyacomma-separatedlistoffilestobecopiedtothemapreducecluster-libjars<jar1,...>specifyacomma-separatedlistofjarfilestobeincludedintheclasspath-archives<archive1,...>specifyacomma-separatedlistofarchivestobeunarchivedonthecomputemachinesThegeneralcommandlinesyntaxis:command[genericOptions][commandOptions]3.HDFSAPIHDFS使用Java语言编写,所以提供了丰富了Java编程接口供开发人员调用,当然HDFS同时支持其它语言如C++、Python等编程接口,但它们都没有Java接口方便。凡是使用Shell命令可以完成的功能,都可以使用相应JavaAPI来实现,甚至使用API可以完成Shell命令不支持的功能。实际开发中,HDFSJavaAPI最常用的类是org.apache.hadoop.fs.FileSystem。关于HDFSJavaAPI常用类如表2-2所示。表2-2HDFSJavaAPI常用类类名说明org.apache.hadoop.fs.FileSystem通用文件系统基类,用于与HDFS文件系统交互,编写的HDFS程序都需要重写FileSystem类,通过该类,可以方便地像操作本地文件系统一样操作HDFS集群文件org.apache.hadoop.fs.FSDataInputStream文件输入流,用于读取HDFS文件org.apache.hadoop.fs.FSDataOutputStream文件输出流,向HDFS顺序写入数据流org.apache.hadoop.fs.Path文件与目录定位类,用于定义HDFS集群中指定的目录与文件绝对或相对路径org.apache.hadoop.fs.FileStatus文件状态显示类,可以获取文件与目录的元数据、长度、块大小、所属用户、编辑时间等信息;同时可以设置文件用户、权限等内容关于HDFSAPI的更多信息读者请参考官网/docs/r2.9.2/api/index.html。2.5实验步骤2.5.1启动HDFS集群在使用HDFS接口操作和管理HDFS文件之前,首先需要启动HDFS集群,只需在主节点上执行以下命令即可。[xuluhui@master~]$start-dfs.shstart-dfs.sh命令会在主、从节点上启动NameNode、DataNode和SecondaryNameNode服务。请注意,同第1章所述,即使对应的守护进程没有启动成功,Hadoop也不会在控制台显示错误消息,读者可以利用jps命令一步一步查询,逐步核实对应的进程是否启动成功。2.5.2使用HDFSShell命令【案例2-1】在/usr/local/hadoop-2.9.2目录下创建目录HelloData,在该目录下新建2个文件file1.txt和file2.txt,在其下任意输入一些英文测试语句。使用HDFSShell命令完成以下操作:首先创建HDFS目录/InputData,然后将file1.txt和file2.txt上传至HDFS目录/InputData下,最后查看这两个文件内容。(1)在本地Linux文件系统/usr/local/hadoop-2.9.2目录下创建一个名为HelloData的文件夹,使用的命令如下所示。[xuluhui@master~]$mkdir/usr/local/hadoop-2.9.2/HelloData(2)在HelloData文件夹下创建2个文件file1.txt和file2.txt。创建file1.txt文件使用的命令如下所示。[xuluhui@master~]$vim/usr/local/hadoop-2.9.2/HelloData/file1.txt然后在file1.txt中写入如下测试语句。HelloHadoopHelloHDFSHelloXijingUniversity创建file2.txt文件使用的命令如下所示。[xuluhui@master~]$vim/usr/local/hadoop-2.9.2/HelloData/file2.txt然后在file2.txt中写入如下测试语句。HelloSparkHelloFlinkHelloXijingUniversity(3)使用“hadoopfs”命令创建HDFS目录/InputData,使用的命令如下所示。[xuluhui@master~]$hadoopfs-mkdir/InputData(4)查看HDFS目录/InputData是否创建成功,使用的命令及效果如图2-7所示。图2-7查看HDFS目录/InputData是否创建成功(5)将file1.txt和file2.txt上传至HDFS目录/InputData下,使用的命令如下所示。[xuluhui@master~]$hadoopfs-put/usr/local/hadoop-2.9.2/HelloData/*/InputData(6)查看HDFS上文件file1.txt和file2.txt内容,使用的命令及效果如图2-8所示。图2-8查看HDFS文件file1.txt和file2.txt内容【案例2-2】使用HDFSShell系统管理命令打印出当前文件系统整体信息和各个节点的分布信息。使用的命令如下所示,效果如图2-9所示。[xuluhui@master~]$hdfsdfsadmin-report图2-9命令“hdfsdfsadmin-report”执行效果2.5.3使用HDFSWebUI界面【案例2-3】通过HDFSWebUI查看【案例2-1】中创建的HDFS目录/InputData及其下文件。(1)打开浏览器,输入HDFSWebUI的地址如30:50070,进入到HDFSWeb主界面【Namenodeinformation】,选择首页顶端菜单项『Utilities』→『Browsethefilesystem』进入到界面【BrowsingHDFS】查看目录,如图2-10所示。图2-10通过HDFSWebUI查看创建的HDFS目录/InputData(2)单击目录“InputData”,进入该目录,如图2-11所示,从图2-11中可以看出,该目录下有两个文件file1.txt和file.txt,它们的副本数“Replication”均为3,块大小“BlockSize”均为128M。图2-11通过HDFSWebUI查看/InputData下的文件(3)单击文件“file1.txt”,进入窗口【Fileinformation】,如图2-12所示,从图2-12中可以看到,该文件的块号“BlockID”为1073742656,该文件在DataNode节点slave1、slave2上存放。图2-12通过HDFSWebUI查看文件file1.txt信息2.5.4搭建HDFS开发环境Eclipse在Hadoop集群主节点上搭建HDFS开发环境Eclipse,当然,读者也可以在其它机器如外部物理机Windows操作系统上安装Eclipse。1.获取EclipseEclipse官方下载地址为/downloads/packages,本书选用的是2018年9月发布的Linux64位版本EclipseIDE2018-09forJavaDevelopers,其安装包文件eclipse-java-2018-09-linux-gtk-x86_64.tar.gz例如存放在master机器的/home/xuluhui/Downloads中。2.安装Eclipse在master机器上解压eclipse-java-2018-09-linux-gtk-x86_64.tar.gz到安装目录如/usr/local下,使用命令如下所示。[xuluhui@master~]$suroot[root@master~]#cd/usr/local[root@masterlocal]#tar-zxvf/home/xuluhui/Downloads/eclipse-java-2018-09-linux-gtk-x86_64.tar.gz3.打开EclipseIDE进入/usr/local/eclipse中通过可视化桌面打开EclipseIDE,默认的工作空间为“/home/xuluhui/eclipse-workspace”。Eclipse主界面如图2-13所示。图2-13EclipseIDE主界面2.5.5使用HDFSJavaAPI编程【案例2-4】使用HDFSJavaAPI编写HDFS文件操作程序,实现上传本地文件到HDFS的功能,采用本地执行和集群执行两种执行方式测试,观察结果。1.在Eclipse中创建Java项目打开EclipseIDE,进入主界面,选择菜单『File』→『New』→『JavaProject』,创建Java项目“HDFSExample”,如图2-14所示。本书中关于HDFS编程实例均存放在此项目下。图2-14创建Java项目“HDFSExample”2.在项目中添加所需JAR包为了编写关于HDFS文件操作的应用程序,需要向Java工程中添加JAR包,这些JAR包中包含了可以访问HDFS的JavaAPI,这些JAR包都位于Linux系统的$HADOOP_HOME/share/hadoop目录下,对于本书而言,就是在/usr/local/hadoop-2.9.2/share/hadoop目录下。读者可以按以下步骤添加该应用程序编写时所需的JAR包。(1)右键单击Java项目“HDFSExample”,从弹出的菜单中选择『BuildPath』→『ConfigureBuildPath…』,如图2-15所示。图2-15进入“HDFSExample”项目的“JavaBuildPath”(2)进入窗口【PropertiesforHDFSExample】,可以看到添加JAR包的主界面,如图2-16所示。图2-16添加JAR包主界面(3)单击图中的按钮AddExternalJARs,依次添加的JAR包包括:$HADOOP_HOME/share/hadoop/hdfs/hadoop-hdfs-2.9.2.jar$HADOOP_HOME/share/hadoop/hdfs/lib/*,即其下所有JAR包$HADOOP_HOME/share/hadoop/common/hadoop-common-2.9.2.jar$HADOOP_HOME/share/hadoop/common/lib/*,即其下所有JAR包这里编者为了方便,导入了$HADOOP_HOME/share/hadoop/hdfs/lib和$HADOOP_HOME/share/hadoop/common/lib下的所有JAR包,读者也可以根据实际编程需要导入必要的JAR包。其中添加JAR包hadoop-hdfs-2.9.2.jar的过程如图2-17所示,找到此JAR包后选中并单击右上角的OK按钮,这样就成功把hadoop-hdfs-2.9.2.jar增加到了当前Java项目中。添加其它JAR包的过程与此相同,不再赘述。图2-17添加hadoop-hdfs-2.9.2.jar到Java项目中(4)完成JAR包添加后的界面如图2-18所示,单击按钮ApplyandClose。图2-18完成JAR包添加后的界面(5)自动返回到Eclipse界面,如图2-19所示,从图中可以看到,项目“HDFSExample”目录树下多了“ReferencedLibraries”,内部有以上步骤添加进来的两个JAR包。图2-19添加JAR包后“HDFSExample”项目目录树变化3.在项目中新建包(1)右键单击Java项目“HDFSExample”,从弹出的菜单中选择『New』→『Package』,如图2-20所示。图2-20进入“ZooKeeperExample”项目新建包窗口(2)进入窗口【NewJavaPackage】,输入新建包的名字,例如“com.xijing.hdfs”,如图2-21所示,完成后单击Finish按钮。图2-21新建包“com.xijing.hdfs”4.编写Java程序下面编写一个Java应用程序,借助HDFSJavaAPI,实现上传本地文件到HDFS的功能,等价于HDFSShell命令“hadoopfs-put”。(1)右键单击Java项目“HDFSExample”中目录“src”下的包“com.xijing.hdfs”,从弹出的菜单中选择『New』→『Class』,如图2-22所示。图2-22进入“com.xijing.hdfs”包的新建类窗口(2)进入窗口【NewJavaClass】。可以看出,由于上步在包“com.xijing.hdfs”下新建类,故此处不需要选择该类所属包;输入新建类的名字,例如“UploadFile”,之所以这样命名,是因为本程序实现的是上传本地文件到HDFS,建议读者命名时也要做到见名知意;读者还可以选择是否创建main函数。本书中新建类“UploadFile”的具体输入和选择如图2-23所示。完成后单击Finish按钮。图2-23新建类“UploadFile”(3)自动返回到Eclipse界面,可以看到,Eclipse自动创建一个名为UploadFile.java的源代码文件,包、类、main方法已出现在代码中,如图2-24所示。图2-24新建类“UploadFile”后的Eclipse界面(4)为实现程序功能,在该文件中添加代码,该程序完整代码如下所示。packagecom.xijing.hdfs;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileStatus;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;publicclassUploadFile{ publicstaticvoidmain(String[]args)throwsIOException{ Configurationconf=newConfiguration(); FileSystemhdfs=FileSystem.get(conf); Pathsrc=newPath("/usr/local/hadoop-2.9.2/HelloData/file1.txt"); Pathdst=newPath("file1.txt"); hdfs.copyFromLocalFile(src,dst); System.out.println("Uploadto"+conf.get("fs.defaultFS")); FileStatusfiles[]=hdfs.listStatus(dst); for(FileStatusfile:files){ System.out.println(file.getPath()); } }}本例中首先实例化Configuration对象,然后实例化了一个FileSystem对象hdfs,接着用到了FileSystem类的方法copyFromLocalFile(src,dst),其功能是复制本地文件到目标文件系统指定路径下,最后通过代码“System.out.println(file.getPath())”将上传到HDFS上的文件路径显示出来。5.运行程序1)本地执行单击Eclipse工具栏中的Run按钮,直接运行UploadFile,执行结果如图2-25所示。从图2-25中可以看出,在/home/xuluhui/eclipse-workspace/HDFSExample目录下增加一个“file1.txt”文件,而file1.txt并没有上传到HDFS集群上,使用命令“hadoopfs-ls/”是查看不到file1.txt文件的。图2-25UploadFile本地执行结果因此,上述代码若在本地执行其结果是错误的。读者可以按照如下提示在上述代码“Configurationconf=……”和“FileSystemhdfs=……”之间加入一行代码,以达到本地执行目的。……Configurationconf=newConfiguration();conf.set("fs.defaultFS","hdfs://master:9000");//新加入代码行FileSystemhdfs=FileSystem.get(conf);……修改后的UploadFile本地执行结果如图2-26所示。从图2-26中可以看出,在HDFS目录/user/xuluhui下增加一个“file1.txt”文件。图2-26修改代码后UploadFile本地执行结果2)集群执行(1)打包代码,生成JAR文件。第一步,右键单击Java项目“HDFSExample”,从弹出的快捷菜单中选择『Export…』,如图2-27所示。图2-27生成JAR包(1)第二步,在弹出的“Export”对话框中,选择“JARfile”,单击按钮Next,如图2-28所示。图2-28生成JAR包(2)第三步,在弹出的“JARExport”对话框中,指定JAR包的存放路径等,本例中JAR包的存放路径及文件名是/home/xuluhui/eclipse-workspace/HDFSExample/hdfsexample.jar,单击按钮Finish,如图2-29所示。图2-29生成jar包(3)(2)使用命令“hadoopjar”将hdfsexample.jar提交到Hadoop集群执行,使用的命令及集群执行结果如图2-30所示。图2-30UploadFile集群执行结果(3)通过“hadoopfs-ls/”验证文件file1.txt是否已上传到HDFS文件/user/xuluhui下。【案例2-5】使用HDFSJavaAPI编写HDFS文件操作程序,实现查看HDFS文件的信息及在集群中位置的功能,采用本地执行和集群执行两种执行方式测试,观察结果。在已创建的Java项目“HDFSExample”包“com.xijing.hdfs”中新建类“FileLocation”,具体新建过程与【案例2-4】相同,此处不再赘述,查看【案例2-4】上传文件的“file1.txt”在HDFS集群中位置的完整代码如下所示。packagecom.xijing.hdfs;importjava.io.IOException;import.URI;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.BlockLocation;importorg.apache.hadoop.fs.FileStatus;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;publicclassFileLocation{ publicstaticvoidmain(String[]args){ Stringuri="hdfs://master:9000/user/xuluhui/file1.txt"; Configurationconf=newConfiguration(); try{ FileSystemfs=FileSystem.get(URI.create(uri),conf); Pathfpath=newPath(uri); FileStatusfilestatus=fs.getFileStatus(fpath); //文件名称 System.out.println("FileName:"+filestatus.getPath().getName()); //文件路径 System.out.println("FilePath:"+filestatus.getPath()); //文件大小 System.out.println("FileLength:"+filestatus.getLen()); //文件权限 System.out.println("FilePermission:"+filestatus.getPermission()); //文件所有者 System.out.println("FileGroup:"+filestatus.getOwner()); //获取文件存储的块信息 BlockLocation[]blockLocations=fs.getFileBlockLocations(filestatus,0,filestatus.getLen()); for(BlockLocationblockLocation:blockLocations){ //获取文件块存储的主机节点 String[]hosts=blockLocation.getHosts(); for(Stringhost:hosts){ System.out.println("StoredNode:"+host); } } }catch(IOExceptione){ e.printStackTrace(); } }}将【案例2-4】生成的/home/xuluhui/eclipse-workspace/HDFSExample/hdfsexample.jar删除,重新打包,将FileLocation也打包进去。使用命令“hadoopjar”将全新的hdfsexample.jar提交到Hadoop集群执行,使用的命令及集群执行结果如图2-31所示。图2-31FileLocation集群执行结果当然,读者也可以在Eclipse下使用本地执行的方式执行FileLocation,执行结果如图2-32所示。图2-32FileLocation本地执行结果使用HDFSJavaAPI实现在HDFS上创建目录的程序代码如下所示,其功能等价于HDFSShell命令“hadoopfs-mkdir”。packagecom.xijing.hdfs;importjava.io.IOException;import.URI;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;publicclassCreateDir{ publicstaticvoidma

温馨提示

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

评论

0/150

提交评论