疯狂Hadoop之HDFS常用Shell命令(三)
HDFS入门
HDFS基本概念
HDFS介绍
HDFS是Hadoop Distribute File System的简称,意为:Hadoop分布式文件系统,是Hadoop核心组件之一,作为最底层的分布式存储服务面存在。
分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的拓展能力
HDFS设计目标
硬件故障是常态,HDFS将由成百上千台服务器组成,每一个组成部分都有可能出现故障,因此故障的检测和自动快速恢复是HDFS的核心架构目标
HDFS上的应用与一般的应用不同,它们主要是以流式读取数据。HDFS被设计成适合批量处理,而不是用户交互式的,相较于数据访问的反应时间,更注重数据访问的高吞吐量
典型的HDFS文件大小是GB到TB的级别,所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件
大部分HDFS应用对文件要求的是writer-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能
移动计算的代价比之移动数据的代价低。一个应用请求的计算,离他操作的数据越近效率越高,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好
HDFS重要性
首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件
其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色
master/slave架构
HDFS采用master/slave架构。一般一个HDFS集群是一个Namenode和一定数目的Datanode组成,Namenode是HDFS集群主节点,Datanode是HDFS集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
分块存储
HDFS中的文件在物理上是分块存储的,块的大小可以通过配置参数来规定,默认大小在Hadoop3.x版本中是128M
名字空间(NameSpace)
HDFS支持传统的层次型文件组织结构,用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有文建的文件系统类似,用户可以创建、删除、移动或者重命名文件
Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。
HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件
Namenode元数据管理
我们把目录机构及文件分块位置信息叫做元数据。Namenode负责维护整个HDFS文件系统的目录结构,以及每一个文件所对应的block块信息(block的id及所在的服务器)
Datanode数据存储
文件的各个block的具体存储管理由Datanode节点承担。每一个block都可以在多个Datanode上,Datanode需要定时向Namenode汇报自己持有的block信息
存储多个副本(副本数量也可以通过参数设置dfs.replication,默认是3)
副本机制
为了容错,文件的所有block都会有副本,每个文件的block大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。
一次写入,多次读出
HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。正因为如此,HDFS适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用。因为修改不方便,延迟大,网络开销大,成本太高。
Shell命令行客户端
Hadoop提供了文件系统的shell命令行客户端,使用方法如下
hadoop fs <args>
文件系统shell包括Hadoop分布式文件系统(HDFS)以及Hadoop支持的其他文件系统,直接交互的各种类似shell的命令。所有FS shell命令都将路径URI作为参数。
对于HDFS,命令示例如下
hadoop fs -ls hdfs://namenode:host/parent/child
如:查看HDFS根目录下文件信息
命令:hadoop fs -ls hdfs://node01:8020/
也可以通过hadoop fs -ls /parent/child (因为在fs.defaultFS中有配置)
如:hadoop fs -ls /
对于本地文件系统
如需要查看root目录下的文件信息
命令:hadoop fs -ls file:///root/
此种方式能将目录中存在的文件信息都展示出来(包含隐藏文件信息)
Shell常用命令介绍
-ls
使用方法:hadoop fs -ls [-h] [-R] <args>
参数解释:[-R]:表示递归,能将文件夹下的文件也展示出来
[-h]:表示能够显示文件信息的具体大小
功能:显示文件、目录信息
示例:hadoop fs -ls /
查询出来的文件install.log文件大小为8815,不知道具体的单位,此时可以在查询的时候加上[-h]参数
-mkdir
使用方法:hadoop fs -mkdir [-p] <paths>
功能:在hdfs上创建目录,-p表示会创建路径中的各级父目录
命令:hadoop fs -mkdir /nihao
命令:hadoop fs -mkdir -p /hi/hello
-put
使用方法:hadoop fs -put [-f] [-p] [-|<localsrc1>..] <dst>
功能:将单个src或多个srcs从本地文件系统复制到目标文件系统
-p:保留访问和修改时间、所有权和权限
-f:覆盖目的地(如果已经存在)
示例:将本地文件install.log.syslog上传到HDFS根路径下
命令:hadoop fs -put /root/install.log.syslog /
-get
使用方法:hadoop fs -get [-ignorecrc] [-crc] [-p] [-f]<src><localdst>
-ignorecrc:跳过对下载文件的CRC检查
-crc:为下载的文件写CRC校验和
功能:将文件复制到本地文件系统
示例:将HDFS上hello文件夹下的wordcount文件下载到虚拟机根目录下
命令:hadoop fs -get /hello/wordcount /root/
-cat
使用方法:hadoop fs -cat [-ignoreCrc] URI [URI...]
功能:显示文件内容
示例:显示hello文件夹下bb.txt中文件内容
命令:hadoop fs -cat /hello/bb.txt
-appendToFile
使用方法:hadoop fs -appendToFile <localsrc>...<dst>
功能:追加一个本地文件到已经存在的HDFS文件末尾
示例:将本地文件bb.txt中的内容追加到HDFS中aa.txt文件末尾
命令:hadoop fs -appendToFile bb.txt /hello/aa.txt
-rm
功能:删除指定的文件。只删除非空目录和文件。
-r:递归删除
示例:删除hello文件夹下的install.log文件
命令: hadoop fs -rm /hello/install.log
示例:删除hi文件夹
命令:hadoop fs -rm -r /hi
-setrep
功能:改变一个文件的副本系数。
-R选项用于递归改变目录下所有文件的副本系数
示例:将hello文件夹下的aa.txt副本数量改成3
命令:hadoop fs -setrep -w 3 /hello/aa.txt
-du
功能:显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小
示例:查看hello文件夹下所有文件的大小
命令: hadoop fs -du /hello
-df
功能:统计文件系统可用空间信息
命令:hadoop fs -df -h /