Hadoop大数据处理技术基础与实践(第3版)课件 第3章-HDFS 技术_第1页
Hadoop大数据处理技术基础与实践(第3版)课件 第3章-HDFS 技术_第2页
Hadoop大数据处理技术基础与实践(第3版)课件 第3章-HDFS 技术_第3页
Hadoop大数据处理技术基础与实践(第3版)课件 第3章-HDFS 技术_第4页
Hadoop大数据处理技术基础与实践(第3版)课件 第3章-HDFS 技术_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

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

文档简介

第3章HDFS技术什么是分布式文件系统和HDFSHDFS设计目标HDFS的基本组件HDFS架构图和工作原理HDFS的shell操作java接口及常用api学习目标22024/8/21分布式文件系统和HDFS

32024/8/21分布式文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的基于客户机/服务器模式。通常,一个分布式文件系统提供多个供用户访问的服务器。分布式文件系统一般都会提供备份和容错的功能分布式文件系统一般都基于操作系统的本地文件系统ext3,ext4NTFS为什么需要分布式文件系统传统文件系统最大的问题是容量和吞吐量的限制多用户多应用的并行读写是分布式文件系统产生的根源一块硬盘的读写性能,比不上多块硬盘同时读写的性能1HDD=75MB/sec1000HDDs=75GB/sec扩充存储空间的成本低廉可提供冗余备份可以为分布式计算提供基础42024/8/21什么是HDFSHDFS=HadoopDistributedFileSystemHDFS是一个使用Java实现的、分布式的、可横向扩展的文件系统是Hadoop的核心组件基于*nix52024/8/21HDFS的设计目标基于廉价的普通硬件,可以容忍硬件出错系统中的某一台或几台服务器出现故障的时候,系统仍可用且数据保持完整大数据集(大文件)HDFS适合存储大量文件,总存储量可以达到PB,EB级HDFS适合存储大文件,单个文件大小一般在百MB级之上文件数目适中简单的一致性模型HDFS应用程序需要一次写入,多次读取一个文件的访问模式支持追加(append)操作,但无法更改已写入数据顺序的数据流访问HDFS适合用于处理批量数据,而不适合用于随机定位访问侧重高吞吐量的数据访问,可以容忍数据访问的高延迟为把“计算”移动到“数据”提供基础和便利62024/8/21HDFS的特点(1)简单一致性(2)故障检测和自动恢复(3)流式数据访问(4)支持超大文件(5)优化的读取(6)数据完整性72024/8/21HDFS架构HDFS是典型的主从架构,一个主节点(NameNode或者MetadataNode),负责系统命名空间(NameSpace)的管理、客户端文件操作的控制和存储任务的管理分配;多个从节点或者说是数据节点(DataNode),提供真实文件数据的物理支持。HDFS架构块元数据NameNodeDataNode客户端块(Block)在传统的块存储介质中,块是读写的最小数据单位(扇区)传统文件系统基于存储块进行操作为了节省文件分配表空间,会对物理存储块进行整合,一般大小为4096字节HDFS也使用了块的概念,但是默认大小设为64M字节可针对每个文件配置,由客户端指定每个块有一个自己的全局IDHDFS将一个文件分为一个或数个块来存储每个块是一个独立的存储单位以块为单位在集群服务器上分配存储与传统文件系统不同的是,如果实际数据没有达到块大小,则并不实际占用磁盘空间如果一个文件是200M,则它会被分为4个块:64+64+64+8102024/8/21使用块的好处当一个文件大于集群中任意一个磁盘的时候,文件系统可以充分利用集群中所有的磁盘管理块使底层的存储子系统相对简单块更加适合备份,从而为容错和高可用性的实现带来方便112024/8/21块的冗余备份每个块在集群上会存储多份(replica)默认复制份数为3可针对每个文件配置,由客户端指定可动态修改某个块的所有备份都是同一个ID系统无需记录“哪些块其实是同一份数据”系统可以根据机架的配置自动分配备份位置第一份在集群的某个机架的某台机器上其他两份在另外的一个机架的两台机器上此策略是性能与冗余性的平衡机架信息需要手工配置122024/8/21HDFS的元数据元数据包括文件系统目录树信息

文件名,目录名

文件和目录的从属关系

文件和目录的大小,创建及最后访问时间

权限文件和块的对应关系

文件由哪些块组成块的存放位置机器名,块IDHDFS对元数据和实际数据采取分别存储的方法元数据存储在一台指定的服务器上(NameNode)实际数据储存在集群的其他机器的本地文件系统中(DataNode)2024/8/2113NameNodeNameNode是用来管理文件系统命名空间的组件一个HDFS集群只有一台NameNode一个HDFS集群只有一个命名空间,一个根目录NameNode上存放了HDFS的元数据一个HDFS集群只有一份元数据目前有单点故障的问题元数据保存在NameNode的内存当中,以便快速查询1G内存大致可以存放1,000,000个块对应的元数据信息按缺省每块64M计算,大致对应64T实际数据2024/8/2114DataNode块的实际数据存放在DataNode上每个块会在本地文件系统产生两个文件,一个是实际的数据文件,另一个是块的附加信息文件,其中包括数据的校验和,生成时间DataNode通过心跳包(Heartbeat)与NameNode通讯客户端读取/写入数据的时候直接与DataNode通信2024/8/2115HDFS客户端需要访问HDFS文件服务的用户或应用命令行客户端同一个Hadoop安装包API客户端Java库非POSIX接口封装了通信细节2024/8/2116HDFS架构图2024/8/2117元数据的持久化NameNode里使用两个非常重要的本地文件来保存元数据信息:fsimagefsimage里保存了文件系统目录树信息fsimage里保存了文件和块的对应关系editsedits保存文件系统的更改记录(journal)当客户端对文件进行写操作(包括新建或移动)的时候,操作首先记入edits,成功后才会更改内存中的数据并不会立刻更改硬盘上的fsimage块的位置信息并不做持久化2024/8/2118元数据的载入和更新NameNode启动时通过fsimage读取元数据,载入内存执行edits中的记录,在内存中生成最新的元数据清空edits,保存最新的元数据到fsimage收集DataNode汇报的块的位置信息NameNode运行时

对文件创建和写操作,记录到edits更新内存中的元数据收集DataNode汇报的块的创建和复制信息2024/8/2119HDFS创建文件流程客户端客户端请求NameNode在命名空间中建立新的文件元信息如果不能创建文件则NameNode会返回失败文件已存在资源不足如创建成功,客户端得到此文件的写保护锁NameNodeNamenode检查集群和文件状态创建写保护锁来保证只有一个客户端在操作该文件建立该文件的元信息把创建文件这个事件加入edits为该文件分配块,以及块的冗余备份位置2024/8/2120HDFS写操作流程客户端写一个文件并不是直接写到HDFS上HDFS客户端接收用户数据,并把内容缓存在本地当本地缓存收集足够一个HDFS块大小的时候,客户端同NameNode通讯注册一个新的块注册块成功后,NameNode会给客户端返回一个DataNode的列表列表中是该块需要存放的位置,包括冗余备份客户端向列表中的第一个DataNode写入块当完成时,第一个DataNode向列表中的下个DataNode发送写操作,并把数据已收到的确认信息给客户端,同时发送确认信息给NameNode之后的DataNode重复之上的步骤当列表中所有DataNode都接收到数据并且由最后一个DataNode校验数据正确性完成后,返回确认信息给客户端收到所有DataNode的确认信息后,客户端删除本地缓存客户端继续发送下一个块,重复以上步骤当所有数据发送完成后,写操作完成2024/8/2121HDFS写操作流程图2024/8/2122HDFS的读操作流程客户端与NameNode通讯获取文件的块位置信息,其中包括了块的所有冗余备份的位置信息:DataNode的列表客户端获取文件位置信息后直接同有文件块的DataNode通讯,读取文件如果第一个DataNode无法连接,客户端将自动联系下一个DataNode如果块数据的校验值出错,则客户端需要向NameNode报告,并自动联系下一个DataNode2024/8/2123HDFS追加写(append)的操作流程客户端与NameNode通讯,获得文件的写保护锁及文件最后一个块的位置(DataNode列表)客户端挑选一个DataNode作为主写入节点,并对其余节点上的该数据块加锁开始写入数据与普通写入流程类似,依次更新各个DataNode上的数据更新时间戳和校验和最后一个块写满,并且所有备份块都完成写入后,向NameNode申请下一个数据块2024/8/2124客户端和HDFS服务器端配置文件的关系客户端的配置文件名与服务器端相同,字段名也相同客户端不会从HDFS集群端同步配置文件客户端只使用部分配置信息dfs.block.sizedfs.replication如果客户端没有配置信息,则使用客户端Hadoop程序包里的缺省值而不是服务器端的值2024/8/2125HDFS的安全性和用户认证缺省情况下,Hadoop不启用认证采用客户端系统的登录用户名或可以通过API设置从而,虽然HDFS有权限控制,但并没有安全性可言可以在NameNode上启用用户认证目前只支持Kerberos可以与LDAP集成2024/8/2126SecondaryNameNode不是备份节点SecondaryNameNode的主要的工作是阶段性的合并fsimage和edits文件,以此来控制edits的文件大小在合理的范围为了缩短集群重启时NameNode重建fsimage的时间在NameNode硬盘损坏的情况下,SecondaryNameNode也可用作数据恢复,但绝不是全部一般情况下SecondaryNamenode运行在不同与NameNode的主机上,并且它的内存需求和NameNode是一样的一个特殊的角色:SecondaryNameNode272024/8/21SecondaryNameNode的运行过程SecondaryNameNode根据配置好的策略决定多久做一次合并fs.checkpoint.period和fs.checkpoint.size通知NameNode现在需要回滚edits日志,此时NameNode的新操作将写入新的edits文件SecondaryNameNode通过HTTP从NameNode取得fsimage和editsSecondaryNameNode将fsimage载入内存,执行所有edits中的操作,新建新的完整的fsimageSecondaryNameNode将新的fsimage传回NameNodeNameNode替换为新的fsimage并且记录此checkpoint的时间2024/8/2128NameNode与SecondaryNameNode2024/8/2129HDFS服务进程NameNodeSecondaryNameNodeDataNode使用jps查看HDFS服务进程24913NameNode16566SecondaryNameNode15744DataNode2024/8/2130HDFS的未来发展高可用性多NameNode自治目前已在2.0版本中但还不够成熟,在生产环境使用前需要多做测试2024/8/2131HDFS中所有对文件的操作都需要先通过NameNode,如果NameNode出现问题,这个集群将不可用维护硬件失效软件失效操作失误解决方案:为NameNode提供备份节点HDFS高可用性322024/8/21HDFS高可用性的实现方式2024/8/2133HDFS高可用性实现细节把元数据信息存在第三方地点只需保存fsimage和editsActiveNN和StandbyNN通过开源组件ZooKeeper来决定主从StandbyNN从第三方地点实时读取edits当ActiveNN失败,切换到StandbyNN时,StandbyNN需要确保读取完所有edits之后才能对外提供服务块位置信息Datanode同时汇报给两个NameNode客户端需要知道有两个NameNode存在如果ActiveNamenode失效,客户端可以自动的将操作发往Standby节点2024/8/2134NameNode的自治(Federation)NameNode的瓶颈内存客户端的并发访问解决方案拆分目录树共享DataNode资源池2024/8/2135普通NameNode的架构层次2024/8/2136NameNode自治的实现方式2024/8/2137HDFS命令行工具HDFS安全模式启动、停止HDFS服务如何查看HDFS日志如何查看HDFSWeb控制台HDFS参数配置HDFS实战382024/8/21HDFS命令行工具HadoopFilesystemshell$HADOOP_HOME_BASE/bin/hadoopfs<args>FSshell使用URIs地址Schema://autority/path例如hdfs://namenodehost:port/folder1/folder2file:///home/tcloud/child如果不指定schema,则使用配置文件中的默认地址可以使用hadoopfs–help查看所有命令2024/8/2139cat用途显示一个或多个文件内容到控制台使用方法hadoopfs-catURI[URI...]例子:hadoopfs-cathdfs://host1:port1/file1hdfs://host2:port2/file2hadoopfs-catfile:///file3/user/hadoop/file42024/8/2140put/copyFromLocal用途将本地一个或多个文件导入HDFS以上两个命令唯一的不同时copyFromLocal的源只能是本地文件,而put可以读取stdin的数据使用方法hadoopfs-put/copyFromLocal<localsrc>URI例子:hadoopfs-putlocalfile.txt/user/hadoop/hadoopfile.txthadoopfs-putlocalfile1localfile2/user/hadoop/hadoopdirhadoopfs-putlocalfilehdfs://host:port/hadoop/hadoopfilehadoopfs-put-hdfs://host:port/hadoop/hadoopfilefromstdin2024/8/2141get/copyToLocal用途将HDFS中的一个或多个文件导出到本地文件系统使用方法hadoopfs-get/copyToLocal[-ignorecrc][-crc]URI<localsrc>例子:hadoopfs-get/user/hadoop/hadoopfilelocalfilehadoopfs-gethdfs://host:port/user/hadoop/filelocalfile2024/8/2142ls/lsr用途列出文件夹目录信息lsr递归显示文件子目录使用方法hadoopfs-ls/lsrURI例子:[hadoop@master]$hadoopfs-ls/user/hadoopdrwxr-xr-x-hadoopsupergroup02012-05-1417:24/user/hadoop/a[hadoop@master]$hadoopfs-lsr/user/hadoopdrwxr-xr-x-hadoopsupergroup02012-05-1417:24/user/hadoop/a-rw-r--r--2hadoopsupergroup472012-05-1417:24/user/hadoop/a/oct.sh-rw-r--r--2hadoopsupergroup62012-05-1417:24/user/hadoop/a/x.sh2024/8/2143fsck用法hadoopfsck[GENERIC_OPTIONS]<path>[-move|-delete|-openforwrite][-files[-blocks[-locations|-racks]]]检查dfs的文件的健康状况只能运行在master上[hadoop@master]$hadoopfsck/user/hadoopFSCKstartedbyhadoopfrom/7forpath/user/hadoopatFriJun1517:11:50CST2012./user/hadoop/a/oct.sh:Underreplicatedblk_-3537883739360629007_1303.TargetReplicasis2butfound1replica(s)../user/hadoop/a/x.sh:Underreplicatedblk_8664072905926163771_1304.TargetReplicasis2butfound1replica(s).2024/8/2144fsckStatus:HEALTHYTotalsize:57697BTotaldirs:5Totalfiles:6Totalblocks(validated):5(avg.blocksize11539B)Minimallyreplicatedblocks:5(100.0%)Over-replicatedblocks:0(0.0%)Under-replicatedblocks:5(100.0%)Mis-replicatedblocks:0(0.0%)Defaultreplicationfactor:2Averageblockreplication:1.0Corruptblocks:0Missingreplicas:2(100.0%)Numberofdata-nodes:1Numberofracks:1FSCKendedatFriJun1517:11:50CST2012in3milliseconds2024/8/2145dfsadmin用法hadoopdfsadmin[command]hadoopdfsadmin-help可以列出所有的可用命令主要的有一下几个-safemode安全模式操作-report报告集群DFS的运行情况可以使用hadoopdfsadmin-help查看所有命令的用法2024/8/2146HDFS的SafeMode指文件系统所处的一种只读的安全模式HDFS启动时会在safemode状态相关命令:$hadoopdfsadmin-safemodeget#安全模式当前状态信息$hadoopdfsadmin-safemodeenter#进入安全模式$hadoopdfsadmin-safemodeleave#解除安全模式$hadoopdfsadmin-safemodewait#挂起,直到安全模式结束2024/8/2147HDFS服务启动NameNode$HADOOP_HOME_BASE/bin/hadoop-daemon.shstartnamenodeSecondaryNameNode$HADOOP_HOME_BASE/bin/hadoop-daemon.shstartsecondarynamenodeDataNode同时启动:$HADOOP_HOME_BASE/bin/hadoop-daemons.shstartdatanode单台启动:$HADOOP_HOME_BASE/bin/hadoop-daemon.shstartdatanodeNameNode、SecondaryNameNode、DataNode$HADOOP_HOME_BASE/bin/start-dfs.sh2024/8/2148HDFS服务关闭NameNode$HADOOP_HOME_BASE/bin/hadoop-daemon.shstopnamenodeSecondaryNameNode$HADOOP_HOME_BASE/bin/hadoop-daemon.shstopsecondarynamenodeDataNode同时关闭:$HADOOP_HOME_BASE/bin/hadoop-daemons.shstopdatanode单台关闭:$HADOOP_HOME_BASE/bin/hadoop-daemon.shstopdatanodeNameNode、SecondaryNameNode、DataNode$HADOOP_HOME_BASE/bin/stop-dfs.sh2024/8/2149如何查看HDFS日志NameNode位置:$HADOOP_HOME_BASE/logs/hadoop-$USER-namenode-$HOSTNAME.log命令:tail-fn100$HADOOP_HOME_BASE/logs/hadoop-$USER-namenode-$HOSTNAME.logDataNode位置:$HADOOP_HOME_BASE/logs/hadoop-$USER-datanode-$HOSTNAME.log命令:tail-fn100$HADOOP_HOME_BASE/logs/hadoop-$USER-datanode-$HOSTNAME.log设置Log文件

的大小和数量修改core-site.xml中的参数hadoop.logfile.sizehadoop.logfile.count2024/8/2150如何设置日志级别

查看不同组件的日志级别hadoopdaemonlog-getlevelhost:portpackageName设置组件的日志级别

hadoopdaemonlog–setlevlehost:portpackageNamelevel“level”DEBUG,INFO,ERROR,FATAL

端口为前台页面的端口,缺省为50070组件名称(packageName)node.NameNodeorg.apache.hadoop.hdfs.server.datanode.DataNodeorg.apache.hadoop.hdfsorg.apache.hadoop2024/8/2151如何查看HDFSWeb控制台访问:http://<NameNodehostname>:<port>2024/8/2152HDFShdfs-site.xml参数配置.dir NameNode元数据存放位置默认值:使用core-site.xml中的hadoop.tmp.dir/dfs/namedfs.block.size对于新文件切分的大小,单位byte。默认是64M,建议是128M。每一个节点都要指定,包括客户端。默认值:67108864dfs.data.dirDataNode在本地磁盘存放block的位置,可以是以逗号分隔的目录列表,DataNode循环向磁盘中写入数据,每个DataNode可单独指定与其它DataNode不一样默认值:${hadoop.tmp.dir}/dfs/data2024/8/2153HDFShdfs-site.xml参数配置node.handler.countNameNode用来处理来自DataNode的RPC请求的线程数量建议设置为DataNode数量的10%,一般在10~200个之间如设置太小,DataNode在传输数据的时候日志中会报告“connectonrefused"信息在NameNode上设定默认值:10dfs.datanode.handler.countDataNode用来连接NameNode的RPC请求的线程数量取决于系统的繁忙程度设置太小会导致性能下降甚至报错在DataNode上设定默认值:3dfs.datanode.max.xcieversDataNode可以同时处理的数据传输连接数默认值:256建议值:40962024/8/2154HDFShdfs-site.xml参数配置dfs.permissions

如果是true则检查权限,否则不检查(每一个人都可以存取文件)于NameNode上设定默认值:truedfs.datanode.du.reserved 在每个卷上面HDFS不能使用的空间大小在每个DataNode上面设定默认值:0建议为10737418240,即10G。需要结合MapReduce场景设置。dfs.datanode.failed.volumes.toleratedDataNode可以容忍损块的磁盘数量,超过这个数量DataNode将会离线,所有在这个节点上面的block将会被重新复制默认是0,但是在有多块磁盘的时候一般会增大这个值dfs.replication在文件被写入的时候,每一块将要被复制多少份默认是3份。建议3份在客户端上设定通常也需要在DataNode上设定2024/8/2155HDFS

core-site.xml参数配置文件系统的名字。通常是NameNode的hostname与port需要在每一个需要访问集群的机器上指定,包括集群中的节点例如:hdfs://<your_namenode>:9000/fs.checkpoint.dir以逗号分隔的文件夹列表,SecondNameNode用来存储checkpointimage文件如果多于一个文件夹,那么都会被写入数据需要在SecondNameNode上设定默认值:${hadoop.tmp.dir}/dfs/namesecondaryhadoop.tmp.dir HDFS与本地磁盘的临时文件默认是/tmp/hadoop-${}.需要在所有的节点中设定2024/8/2156HDFS

core-site.xml参数配置erval当一个文件被删掉后,它会被放到用户目录的.Trash目录下,而不是立即删掉经过此参数设置的分钟数之后,再删掉数据默认是0,禁用此功能,建议1440(一天)io.file.buffer.size设定在读写数据时的缓存大小,应该为硬件分页大小的2倍默认是4096,建议为65536(64K)2024/8/2157Eclipse开发环境介绍HDFS开发基本步骤HDFSJavaAPI详解ConfigurationPathFileSystemStream、IOUtilsHDFSJavaAPI使用场景示例FuseHDFSWebHDFSRESTfulAPIHDFS-javaapi使用582024/8/21

HDFS开发基本步骤实例化Configuration实例化FileSystem根据配置文件选择使用本地或分布式文件系统文件或目录操作Stream2024/8/2159Eclipse开发环境

菜单栏

按钮栏

包导航区代码编辑区

视图切换按钮相关关联显示区

代码联动显示区2024/8/2160Eclipse开发环境

2024/8/2161Eclipse开发环境填写项目名称2024/8/2162Eclipse开发环境2024/8/2163Eclipse开发环境建立第三方库依赖文件夹-lib2024/8/2164Eclipse开发环境

拷贝项目所依赖的第三方类库到lib文件夹2024/8/2165Eclipse开发环境把第三方类库加到项目中的CLASSPATH下2024/8/2166Eclipse开发环境

可以看到刚加到CLASSPATH下的把第三方类库2024/8/2167Eclipse开发环境

把src源代码目录删除,根据类别建立源代码及测试代码目录src/main/javajava源文件存放处src/main/resources配置文件存放处,如hadoop配置文件(core-site.xml)src/test/javajava测试代码存放处src/test/resources测试代码配置文件存放处

2024/8/2168Eclipse开发环境

新建Java类,可以使用HadoopAPI了2024/8/2169Eclipse开发环境在此编辑你的代码2024/8/2170Eclipse开发环境选择[File]=>Export,导出项目为一个jar包2024/8/2171Configuration包org.apache.hadoop.conf构造方法publicConfiguration()调用构造方法Configuration(true)publicConfiguration(booleanloadDefaults)true:先加载缺省配置文件,再加载用户指定文件(addResource)core-default.xml,core-site.xml以及通过addDefaultResource添加的文件名false:不加载缺省配置文件,需要通过addResource手动添加后加载的配置会覆盖先加载的配置除了被指定为final的publicConfiguration(Configurationother)复制other参数信息2024/8/2172Configuration加载配置文件方法staticvoidaddDefaultResource(Stringname)添加默认配置文件,配置文件加载的顺序是根据添加的顺序参数是文件名,文件是在classpath中voidaddResource(InputStreamin)voidaddResource(Pathfile)本地文件voidaddResource(Stringname)classpath中的文件voidaddResource(URLurl)2024/8/2173配置文件加载顺序先加载缺省配置文件,再加载用户定义的配置文件对于每一个文件只加载一次:第一个在classpath出现的classpath的目录顺序$HADOOP_CONF_DIR$JAVA_HOME/lib/tools.jar如果$HADOOP_HOME目录下有build目录,则添加build下各子目录$HADOOP_HOME/hadoop-core-*.jar$HADOOP_HOME/lib/*.jar用户在hadoop-env.sh中定义的$HADOOP_CLASS_PATH当前作为hadoopjar…参数提交的JAR包2024/8/2174Configuration设置/获取参数方法voidset(Stringname,Stringvalue)voidsetBoolean(Stringname,booleanvalue)voidsetInt(Stringname,Stringvalue)voidsetLong(Stringname,longvalue)voidsetFloat(Stringname,floatvalue)voidsetIfUnset(Stringname,Stringvalue)voidsetBooleanIfUnset(Stringname,booleanvalue)Stringget(Stringname)booleangetBoolean(Stringname,booleandefaultValue)2024/8/2175Path包org.apache.hadoop.fs构造方法publicPath(StringpathString)publicPath(URIaUri)publicPath(Pathparent,Pathchild)publicPath(Stringparent,Stringchild)参数parent指定父目录,参数child指定父目录下的文件或子目录publicPath(Stringscheme,Stringauthority,Stringpath)scheme:协议类型,譬如hdfs、file、s3authority:认证信息,譬如user:pwd@host:portpath:文件或目录名如参数不符合RFC2396,则抛出异常2024/8/2176Path常用方法intdepth()返回路径的深度StringgetName()返回路径上最后的资源名称PathgetParent()返回父目录,如果已是根目录则返回nullPathsuffix(Stringsuffix)参数suffix给Path增加后缀返回加完后缀的Path实例getFileSystem(Configurationconf)返回该Path所属的文件系统实例2024/8/2177FileSystem包org.apache.hadoop.fs构造方法protectedFileSystem()FileSystem是一个抽象类,不能通过new来创建通过静态get(Configurationconf)方法获得FileSystem子类的实例fs.$scheme.implorg.apache.hadoop.hdfs.DistributedFileSystem主要子类LocalFileSystem本地文件系统DistributedFileSystem分布式文件系统2024/8/2178创建文件booleancreateNewFile(Pathf)不会覆盖已有文件创建成功返回true,失败返回falseFSDataOutputStreamcreate(Pathf)覆盖已有文件创建文件并返回输出流FSDataOutputStreamcreate(Pathf,booleanoverwrite)创建文件并返回输出流FSDataOutputStreamcreate(Pathf,booleanoverwrite,intbuffer)FSDataOutputStreamcreate(Pathf,booleanoverwrite,int buffer,shortreplication,longblockSize)2024/8/2179打开文件FSDataInputStreamopen(Pathf)FSDataInputStreamopen(Pathf,intbufferSize)返回输入流如果文件不存在会抛出异常不指定bufferSize时,会从Configuration中读取io.file.buffer.size,默认为4096字节2024/8/2180文件追加FSDataOutputStreamappend(Pathf)FSDataOutputStreamappend(Pathf,intbufferSize)块不足64M时,会补足到64M块达到64M之前,该块不可见,ls看不到该块新增的大小,也无法读取不能同时多个writer追加同一个文件2024/8/2181从本地拷贝文件到HDFSvoidcopyFromLocalFile(Pathsrc,Pathdst)目标文件存在,直接覆盖voidcopyFromLocalFile(booleandelsrc,Pathsrc,Pathdst)根据参数delsrc,如果是true,拷贝完成之后直接删除源文件voidcopyFromLocalFile(booleandelsrc,booleanoverwrite, Pathsrc,Pathdst)voidcopyFromLocalFile(booleandelsrc,booleanoverwrite, Path[]srcs,Pathdst)参数srcs指定多个本地文件或文件夹参数dst指定HDFS文件夹voidmoveFromLocalFile(Pathsrc,Pathdst)voidmoveFromLocalFile(Path[]srcs,Pathdst)2024/8/2182从HDFS拷贝文件到本地voidcopyToLocalFile(Pathsrc,Pathdst)voidcopyToLocalFile(booleandelsrc,Pathsrc,Pathdst)voidmoveToLocalFile(Pathsrc,Pathdst)没有多文件拷贝函数会覆盖已存在的本地文件dst2024/8/2183

创建目录booleanmkdirs(Pathf)booleanmkdirs(Pathf,FsPermissionpermission)staticbooleanmkdirs(FileSystemfs,Pathdir,FsPermissionpermission)支持多级目录同时创建(类似mkdir-p)默认权限是755成功返回true目录权限的含义r+x:

获取文件列表w:创建(删除)文件/子目录

2024/8/2184删除及重命名booleandelete(Pathf,booleanrecursive)删除文件或目录如果f是目录,则参数recursive指定是否要递归删除recursive是false,并且f不为空,会抛出异常删除成功返回truef不存在时,会返回falsebooleandeleteOnExit(f)当关闭FileSystem时,才会删除如f是目录,则递归删除子目录和文件booleanrename(Pathsrc,Pathdst)2024/8/2185获取文件或目录信息FileStatus[]listStatus(Pathf)FileStatus[]listStatus(Path[]dirs)FileStatus[]listStatus(Pathf,PathFilterfilter)FileStatus[]listStatus(Path[]dir,PathFilterfilter)列出文件或目录的信息参数dir指定要查询的多个目录参数filter指定需要过滤规则PathFilter是一个接口,需要实现booleanaccept(Pathpath)方法,返回false,在返回结果中会过滤掉只返回列出指定目录下的文件或目录信息

FileStatus信息包括:绝对路径文件大小(单位:字节)文件访问时间块大小、复制份数文件所属用户、组、访问权限2024/8/2186设置文件或目录属性voidsetOwner(Pathp,Stringusername,Stringgroupname)设置文件或目录所属用户及组参数p指定文件或目录参数username,设置此文件或目录的所属用户只返回列出指定目录下的文件或目录信息voidsetPermission(Pathp,FsPermissionpermission)设置文件或目录权限参数p指定文件或目录参数permission,指定权限,权限同linux权限雷同voidsetReplication(Pathf,shortreplication)设置文件复制份数参数f指定文件参数replication指定复制份数2024/8/2187设置文件或目录属性voidsetTimes(Pathf,longmtime,longatime)设置文件的修改及访问时间参数f指定文件参数mtime,修改时间参数atime,访问时间2024/8/2188HDFS输入流包org.apache.hadoop.fs继承java.io.DataInputStream构造方法publicFSDataInputStream(InputStreamin)输入流对象实例化in参数,输入流的来源一般输入流对象,通过FileSystem.open方法获得2024/8/2189HDFS输出流包org.apache.hadoop.fs继承java.io.DataOutputStream构造方法publicFSDataOutputStream(OutputStreamout,FileSystem.Statisticsstats)publicFSDataOutputStream(OutputStreamout,FileSystem.Statisticsstats,longstartPosition)输出流对象实例化out参数,输出流stats参数是对输出流的相关的计数,如bytesread,byteswrittenstats是FileSystem.Statistics对象startPosition参数,开始写入位置一般输出流对象,通过FileSystem.create方法2024/8/2190

IOUtils构造方法包org.apache.hadoop.fs构造方法publicIOUtils()I/O帮助类,提供的都是静态方法,不需要实例化2024/8/2191IOUtils拷贝流方法publicstaticvoidcopyBytes(InputStreamin,outputStreamout,Configurationconf)publicstaticvoidcopyBytes(InputStreamin,outputStreamout,Configurationconf,booleanclose)从输入流拷贝到输出流参数in输入流实例参数out输出流实例参数conf,通过io.file.buffer.size获取缓存大小没有设置io.file.buffer.size,缓存默认为4096bytes参数close指定是否需要拷贝完成后,由此方法关闭输入输出流2024/8/2192IOUtils拷贝流方法publicstaticvoidcopyBytes(InputStreamin,outputStreamout,intbuffSize)publicstaticvoidcopyBytes(InputStreamin,outputStreamout,intbuffSize,booleanclose)publicstaticvoidcopyBytes(InputStreamin,outputStreamout,intlength,intbuffSize,booleanclose)从输入流拷贝制定字节大小到输出流参数in输入流实例参数out输出流实例参数length指定要拷贝的字节大小参数buffSize指定输入输出缓冲参数close指定是否需要拷贝完成后,由此方法关闭输入输出流2024/8/2193

HDFS依赖的jar包及JavaDoc位置HDFS依赖Jar包来源集群中已部署的Hadoop路径下$HADOOP_HOME_BASE/hadoop-core-1.0.0.jar$HADOOP_HOME_BASE/lib/*.jarJavaDoc位置集群中已部署Hadoop路径下$HADOOP_HOME_BASE/docs/api/index.html2024/8/2194创建HDFS文件(createNewFile)Configurationconfig=newConfiguration();FileSystemhdfs=FileSystem.get(config);Pathpath=newPath(fileName);booleanisCreated=hdfs.createNewFile(path);2024/8/2195从本地拷贝文件到HDFS(copyFromLocalFile)Configurationconfig=newConfiguration();FileSystemhdfs=FileSystem.get(config);PathsrcPath=newPath(srcFile);PathdstPath=newPath(dstFile);hdfs.copyFromLocalFile(srcPath,dstPath)2024/8/2196从HDFS读取文件(open)Configurationconfig=newConfiguration();FileSystemhdfs=FileSystem.get(config);Pathpath=newPath(dstFile);FSDataInputStreaminputStream=hdfs.open(path);Textline=newText()LineReaderliReader=newLineReader(inputStream);while(liReader.readLine(line)>0){System.out.println(line);}inputStream.close();2024/8/2197追加方式写入HDFS文件(append)Configurationconfig=newConfiguration();FileSystemhdfs=FileSystem.get(config);Pathpath=newPath(dstFile);FSDataOutputStreamout=hdfs.append(path);//在文件尾部,追加数据out.close();2024/8/2198列出目录下的所有文件(listStatus)Configurationconfig=newConfiguration();FileSystemhdfs=FileSystem.get(config);Pathdir=newPath(dirName);FileStatus[]fileStatus=hdfs.listStatus(newPath[]{dir});2024/8/2199FuseHDFS用户空间文件系统(FilesysteminUserspace,简称FUSE),是操作系统中的概念,指在用户态下实现的文件系统FuseHDFS是Hadoopcontrib的一个模块通过命令挂载在*nix系统上,可以把HDFS当成本地文件系统使用访问HDFS时,使用标准的*nix命令,如ls,cd,cp,mkdir,find,grep任何编程语言通过POSIX库与HDFS文件系统交互通过FuseHDFS创建的文件或文件夹的属主是nobody$mkdir/dfs

$cd$HADOOP_HOME/build/contrib/fuse-dfs

$./fuse_dfs_wrapper.shdfs://maste

温馨提示

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

评论

0/150

提交评论