疯狂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 /

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

对于本地文件系统

如需要查看root目录下的文件信息

命令:hadoop fs -ls file:///root/

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

此种方式能将目录中存在的文件信息都展示出来(包含隐藏文件信息)

 

Shell常用命令介绍

-ls

使用方法:hadoop fs -ls [-h] [-R] <args>

参数解释:[-R]:表示递归,能将文件夹下的文件也展示出来

[-h]:表示能够显示文件信息的具体大小

功能:显示文件、目录信息

示例:hadoop fs -ls /

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

查询出来的文件install.log文件大小为8815,不知道具体的单位,此时可以在查询的时候加上[-h]参数

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

-mkdir

使用方法:hadoop fs -mkdir [-p] <paths>

功能:在hdfs上创建目录,-p表示会创建路径中的各级父目录

命令:hadoop fs -mkdir /nihao

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

命令:hadoop fs -mkdir -p /hi/hello

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

-put

使用方法:hadoop fs -put [-f] [-p] [-|<localsrc1>..] <dst>

功能:将单个src或多个srcs从本地文件系统复制到目标文件系统

-p:保留访问和修改时间、所有权和权限

-f:覆盖目的地(如果已经存在)

示例:将本地文件install.log.syslog上传到HDFS根路径下

命令:hadoop fs -put /root/install.log.syslog /

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

-get

使用方法:hadoop fs -get [-ignorecrc] [-crc] [-p] [-f]<src><localdst>

-ignorecrc:跳过对下载文件的CRC检查

-crc:为下载的文件写CRC校验和

功能:将文件复制到本地文件系统

示例:将HDFS上hello文件夹下的wordcount文件下载到虚拟机根目录下

命令:hadoop fs -get /hello/wordcount /root/

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

-cat

使用方法:hadoop fs -cat [-ignoreCrc] URI [URI...]

功能:显示文件内容

示例:显示hello文件夹下bb.txt中文件内容

命令:hadoop fs -cat /hello/bb.txt

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

-appendToFile

使用方法:hadoop fs -appendToFile <localsrc>...<dst>

功能:追加一个本地文件到已经存在的HDFS文件末尾

示例:将本地文件bb.txt中的内容追加到HDFS中aa.txt文件末尾

命令:hadoop fs -appendToFile bb.txt /hello/aa.txt

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

-rm

功能:删除指定的文件。只删除非空目录和文件。

-r:递归删除

示例:删除hello文件夹下的install.log文件

命令: hadoop fs -rm /hello/install.log

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

示例:删除hi文件夹

命令:hadoop fs -rm -r /hi

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

-setrep

功能:改变一个文件的副本系数。

-R选项用于递归改变目录下所有文件的副本系数

示例:将hello文件夹下的aa.txt副本数量改成3

命令:hadoop fs -setrep -w 3 /hello/aa.txt

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

-du

功能:显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小

示例:查看hello文件夹下所有文件的大小

命令: hadoop fs -du /hello

 

疯狂Hadoop之HDFS常用Shell命令(三)

 

 

-df

功能:统计文件系统可用空间信息

命令:hadoop fs -df -h /

 

疯狂Hadoop之HDFS常用Shell命令(三)