第4章HDFS文件系统CompanyLogo目录互联网时代对存储系统的新要求1HDFS系统的特点2HDFS中小文件存储问题7HDFSShell命令4API访问HDFS5HDFS的高可用性6HDFS文件系统34.1互联网时代对存储系统的新要求1存储系统要廉价且稳定23支持超大的文件满足大并发量的访问请求4.2HDFS系统的特点廉价且稳定的存储解决方案高吞吐量的文件系统超大文件的支持简单一致性的文件系统流式的数据访问方式HDFS不适合使用HDFS的场景低时间延迟的数据访问大量的小文件多用户写入,任意修改文件4.3.1HDFS系统组成NameNode:是HDFS系统中的管理节点,它管理文件系统的命名空间、记录每个文件数据块在DataNode上的位置和副本信息、协调客户端对文件的访问、记录命名空间内的改动和空间本身属性的改动。NameNode使用事务日志(EditsLog)记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等。DataNode节点是HDFS系统中保存数据的节点,负责所在物理节点的存储管理,一次写入,多次读取。文件由数据块组成,默认的块大小是64MB,数据块以冗余备份的形式分布在不同机架的不同机器上,DataNode定期向NameNode提供其保存的数据块的列表,以便于客户端在获取文件元数据后直接在DataNode上进行读写。SecondaryNameNode在Hadoop中只有一个NameNode,所以存在着单点问题,即当NameNode节点宕机时,整个系统就瘫痪了。为了解决这个问题,在Hadoop中增加了一个SecondaryNameNode节点,它一般运行在单独的计算机上,定期从NameNode节点获取数据,形成NameNode的备份,一旦NameNode出现问题,SecondaryNameNode便可以顶替NameNode。Hadoop1.X中没有真正解决单点问题,到2.X后解决了系统的单点问题,提高了系统的可用性客户端客户端是Hadoop集群的使用者,他通过HDFS的Shell和API对系统中的文件进行操作。机架(Rack)是容纳组成集群的普通商用计算机(节点)的架子,各节点被分到不同的机架内,这样做的目的是为了管理和施工的需要,也是为了防灾容错的需要数据块在HDFS中也有数据块的概念,不过要大得多,默认是64MB,与磁盘数据块类似,数据块(Chunk)是Hadoop处理数据的最小单位,一个Hadoop文件被分成若干数据块,根据Hadoop数据管理的策略,数据块被放置在不同的数据节点(DataNode)中,当数据块的副本数小于规定的份数时,Hadoop系统的错误检测与自动恢复技术就会自动把数据块的副本数恢复到正常水平。4.3.2HDFS文件数据的存储组织1.NameNode目录结构NameNode使用Linux操作系统的文件系统来存储数据,保存数据的文件夹位置由{dfs.name.dir}来决定,如果配置文件中未设置该项,则文件夹放在Hadoop安装目录下的/tmp/dfs/name,使用下列命令可列出目录结构:hadoop@master:~/hadoop/tmp/dfs/name$tree-L2NameNode目录结构.├──current│├──edits│├──fsimage│├──fstime│└──VERSION├──image│└──fsimage├──in_use.lock└──previous.checkpoint├──edits├──fsimage├──fstime└──VERSION4.3.2HDFS文件数据的存储组织2.DataNode目录结构DataNode使用Linux操作系统的文件系统来存储数据,保存数据的文件夹位置由{dfs.data.dir}来决定,如果配置文件中未设置该项,则文件夹放在Hadoop安装目录下的/tmp/dfs/data,其具体结构如下:hadoop@master:~/hadoop/tmp/dfs/data$tree-L2DataNode目录结构.├──blocksBeingWritten├──current│├──blk_1140165932077243741│├──blk_1140165932077243741_1451.meta│├──blk_1246585558857976182│├──blk_1246585558857976182_1449.meta│├──dncp_block_verification.log.curr│├──dncp_block_verification.log.prev│├──subdir0│├──subdir1│└──VERSION├──detach├──in_use.lock├──storage└──tmp4.3.3元数据及其备份机制Hadoop是典型的主/从架构,集群中有一个NameNode和多个DataNode,数据以数据块的形式保存在DataNode中,在NameNode中则管理着文件系统的命名空间。NameNode也保存着每个数据块的所在节点的信息。这些文件块的映射和文件系统的配置信息都保存在一个叫fsimage的映像文件中,事务日志文件(EditsLog)则记录着对文件系统的元数据的改变。Hadoop采取了两种机制来保护NameNode的安全:元数据的持久化增加一个辅助的SecondaryNameNodeSecondaryNameNode工作原理4.3.4数据块备份HDFS能够存储管理超大文件是因为它把大文件存储为一系列数据块(Block),数据块默认大小为64MB,为了容错,数据块被复制多份分布到集群的不同节点上,当DataNode启动时,它会在内存中形成一个数据块与文件的对应关系列表,DataNode周期性地把这个列表发送给NameNode,这就是我们所说的心跳机制,NameNode根据心跳信息知道集群中哪个DataNode存活着,哪个DataNode已经宕掉,当下一次进行文件读写时,不再给宕掉的DataNode节点分配任何新的I/O请求。这样,存储在宕掉的节点中的数据块因宕机而变得不可用,某些数据块的副本数因此而下降到指定值以下,NameNode会不断进行错误检测,检查这些需要复制的数据块,在需要的时候启动自动恢复机制自动地把数据块的副本数恢复到正常水平。数据块备份规则数据块的备份过程4.3.5数据的读取过程4.3.6数据的写入过程4.4HDFSShell命令1.cat命令用法:hadoopfs-catURI[URI…]将路径指定文件的内容输出到stdout。示例:hadoopfs-cat/user/input.txt2.chgrp命令用法:hadoopfs-chgrp[-R]GROUPURI[URI…]改变文件所属的组。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。示例:hadoopfs-chgrpgroup1/hadoop/hadoopfile3.chmod命令用法:hadoopfs-chmod[-R]MODE[,MODE]...|OCTALMODEURI[URI…]改变文件的权限。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。示例:hadoopfs-chmod764/hadoop/hadoopfile4.chown命令用法:hadoopfs-chown[-R][OWNER][:[GROUP]]URI[URI]改变文件的拥有者。使用-R将使改变在目录结构下递归进行。命令的使用者必须是超级用户。示例:hadoopfs-chownuser1/hadoop/hadoopfile5.copyFromLocal命令用法:hadoopfs-copyFromLocallocalsrcURI从本地文件复制到HDFS文件系统中。示例:hadoopfs-copyFromLocal/home/hadoop/stdrj49.flv/user6.copyToLocal用法:hadoopfs-copyToLocal[-ignorecrc][-crc]URIlocaldst从HDFS复制文件到本地,-ignorecrc选项可忽略文件校验,-crc选项进行校验并复制校验文件。示例:hadoopfs-copyToLocal/user/hadoop/stdrj.flv/home/hadoop/7.cp命令用法:hadoopfs-cpURI[URI…]dest将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。示例:hadoopfs-cp/user/hadoop/file1/user/hadoop/file2hadoopfs-cp/user/hadoop/file1/user/hadoop/file2/user/hadoop/dir8.du命令用法:hadoopfs-duURI[URI…]显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。示例:hadoopfs-du/user/hadoop/9.dus命令用法:hadoopfs-dusargs显示文件的大小,与du类似,区别在于对目录操作时显示的是目录下所有文件大小之和示例:hadoopfs-dus/user10.expunge命令用法:hadoopfs-expunge清空回收站。11.get命令用法:hadoopfs-get[-ignorecrc][-crc]srclocaldst复制文件到本地文件系统。可用-ignorecrc选项复制CRC校验失败的文件。使用-crc选项复制文件以及CRC信息。示例:hadoopfs-get/user/input.txt/home/hadoop12.getmerge命令用法:hadoopfs-getmergesrclocaldst[addnl]接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl是可选的,用于指定在每个文件结尾添加一个换行符。示例:hadoopfs-getmerge/user/home/hadoop/test.txt将HDFS中/user目录下的文件合并,输出到本地文件系统,保存为/home/hadoop/test.txt13.ls命令用法:hadoopfs-lsargs如果是文件,则按照如下格式返回文件信息:文件名副本数文件大小修改日期修改时间权限用户ID组ID如果是目录,则返回它直接子文件的一个列表,就像在Unix中一样。目录返回列表的信息如下:目录名dir修改日期修改时间权限用户ID组ID示例:hadoopfs-ls/user/input.txt显示/user/input.txt文件信息hadoopfs-ls/user/hadoop/显示/user/hadoop/目录下的文件14.lsr命令用法:hadoopfs-lsrargsls命令的递归版本。类似于Unix中的ls-R。示例:hadoopfs-lsr/15.mkdir命令用法:hadoopfs-mkdirpaths接受路径指定的URI作为参数,创建这些目录。其行为类似于Unix的mkdir-p,它会创建路径中的各级父目录。示例:hadoopfs-mkdir/user/hadoop/dir1/user/hadoop/dir216.movefromLocal命令用法:hadoopfs-moveFromLocalsrcdst将文件或目录从本地文件系统移动到HDFS。示例:hadoop@master:~$hadoopfs-moveFromLocaltest.txt/user/hadoophadoopfs-moveFromLocal/home/hadoop/aa