Hadoop之HDFS(一)HDFS入门及基本Shell命令操作
1 . HDFS 基本概念
1.1 HDFS 介绍
HDFS 是 Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统。是 Hadoop 核心组件之一,作为最底层的分布式存储服务而存在。
分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。
1.2 HDFS 设计目标
- 1) 硬件故障是常态, HDFS 将有成百上千的服务器组成,每一个组成部分都有可能出现故障。因此故障的检测和自动快速恢复是 HDFS 的核心架构目标。
- 2) HDFS 上的应用与一般的应用不同,它们主要是以流式读取数据。HDFS 被设计成适合批量处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。
- 3) 典型的 HDFS 文件大小是 GB 到 TB 的级别。所以,HDFS 被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
- 4) 大部分 HDFS 应用对文件要求的是 write-one-read-many 访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
- 5) 移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好。
- 6) 在异构的硬件和软件平台上的可移植性。这将推动需要大数据集的应用更广泛地采用 HDFS 作为平台。
2 . HDFS 重要 特性
首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件;
其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
2.1 master/slave 架构
HDFS 采用 master/slave 架构。一般一个 HDFS 集群是有一个 Namenode 和一定数目的 Datanode 组成。Namenode 是 HDFS 集群主节点,Datanode 是 HDFS 集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
2.2 分块存储
HDFS 中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,默认大小在 hadoop2.x 版本中是 128M。
2.3 名字空间(NameSpace )
HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。
HDFS 会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
2.4 Namenode 元数据管理
我们把目录结构及文件分块位置信息叫做元数据。Namenode 负责维护整个hdfs 文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的id,及所在的 datanode 服务器)。
2.5 Datanode 数据存储
文件的各个 block 的具体存储管理由 datanode 节点承担。每一个 block 都可以在多个 datanode 上。Datanode 需要定时向 Namenode 汇报自己持有的 block信息。
存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3)。
2.6 副本机制
为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。
2.7 一次写入,多次读出
HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改。正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做.网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。
3 . HDFS 基本操作
3.1 Shell 命令行客户端
Hadoop 提供了文件系统的 shell 命令行客户端,使用方法如下:hadoop fs <args>
文件系统 shell 包括与 Hadoop 分布式文件系统(HDFS)以及 Hadoop 支持的其他文件系统(如本地 FS,HFTP FS,S3 FS 等)直接交互的各种类似 shell的命令。所有 FS shell 命令都将路径 URI 作为参数。
URI 格式为 scheme://authority/path。对于 HDFS,该 scheme 是 hdfs,对于本地 FS,该 scheme 是 file。scheme 和 authority 是可选的。如果未指定,则使用配置中指定的默认方案。
对于 HDFS,命令示例如下:
hadoop fs -ls hdfs://namenode:host/parent/child
hadoop fs -ls /parent/child #fs.defaultFS 中有配置 就不用再写hdfs://namenode:host了
对于本地文件系统,命令示例如下:
hadoop fs -ls file:///root/
如果使用的文件系统是 HDFS,则使用 hdfs dfs 也是可以的,此时
hadoop fs <args> = hdfs dfs <args>
3.2 Shell 命令选项
选项名称 | 使用格式 | 含义 |
-ls | -ls <路径> | 查看指定路径的当前目录结构 |
-lsr | -lsr <路径> | 递归查看指定路径的目录结构 |
-du | -du <路径> | 统计目录下个文件大小 |
-dus | -dus <路径> | 汇总统计目录下文件(夹)大小 |
-count | -count [-q] <路径> | 统计文件(夹)数量 |
-mv | -mv <源路径> <目的路径> | 移动 |
-cp | -cp <源路径> <目的路径> | 复制 |
-rm | -rm [-skipTrash] <路径> | 删除文件/空白文件夹 |
-rmr | -rmr [-skipTrash] <路径> | 递归删除 |
-put | -put <多个 linux 上的文件> <hdfs 路径> | 上传文件 |
-copyFromLocal | -copyFromLocal <多个 linux 上的文件> <hdfs 路径> | 从本地复制 |
-moveFromLoca | -moveFromLocal <多个 linux 上的文件> <hdfs 路径> | 从本地移动 |
-getmerge | -getmerge <源路径> <linux 路径> | 合并到本地 |
-cat | -cat <hdfs 路径> | 查看文件内容 |
-text | -text <hdfs 路径> | 查看文件内容 |
-copyToLocal | -copyToLocal [-ignoreCrc] [-crc] [hdfs源路径] [linux 目的路径] | 从本地复制 |
-moveToLocal | -moveToLocal [-crc] <hdfs 源路径> <linux 目的路径> | 从本地移动 |
-mkdir | -mkdir <hdfs 路径> | 创建空白文件夹 |
-setrep | -setrep [-R] [-w] <副本数> <路径> | 修改副本数量 |
-touchz | -touchz <文件路径> | 创建空白文件 |
-stat | -stat [format] <路径> | 显示文件统计信息 |
-tail | -tail [-f] <文件> | 查看文件尾部信息 |
-chmod | -chmod [-R] <权限模式> [路径] | 修改权限 |
-chown | -chown [-R] [属主][:[属组]] 路径 | 修改属主 |
-chgrp | -chgrp [-R] 属组名称 路径 | 修改属组 |
-help | -help [命令选项] | 帮助 |
3.3 Shell 常用命令介绍
-ls 使用方法:hadoop fs -ls [-h] [-R] <args> 功能:显示文件、目录信息。 示例:hadoop fs -ls /user/hadoop/file1 -mkdir 使用方法:hadoop fs -mkdir [-p] <paths> 功能:在 hdfs 上创建目录,-p 表示会创建路径中的各级父目录。 示例:hadoop fs -mkdir –p /user/hadoop/dir1 -put 使用方法:hadoop fs -put [-f] [-p] [ -|<localsrc1> .. ]. <dst> 功能:将单个 src 或多个 srcs 从本地文件系统复制到目标文件系统。 -p:保留访问和修改时间,所有权和权限。 -f:覆盖目的地(如果已经存在) 示例:hadoop fs -put -f localfile1 localfile2 /user/hadoop/hadoopdir -get 使用方法:hadoop fs -get [-ignorecrc] [-crc] [-p] [-f] <src> <localdst> -ignorecrc:跳过对下载文件的 CRC 检查。 -crc:为下载的文件写 CRC 校验和。 功能:将文件复制到本地文件系统。 示例:hadoop fs -get hdfs://host:port/user/hadoop/file localfile -appendToFile 使用方法:hadoop fs -appendToFile <localsrc> ... <dst> 功能:追加一个文件到已经存在的文件末尾 示例:hadoop fs -appendToFile localfile /hadoop/hadoopfile -cat 使用方法:hadoop fs -cat [-ignoreCrc] URI [URI ...] 功能:显示文件内容到 stdout 示例:hadoop fs -cat /hadoop/hadoopfile -tail 使用方法:hadoop fs -tail [-f] URI 功能:将文件的最后一千字节内容显示到 stdout。 -f 选项将在文件增长时输出附加数据。 示例:hadoop fs -tail /hadoop/hadoopfile -chgrp 使用方法:hadoop fs -chgrp [-R] GROUP URI [URI ...] 功能:更改文件组的关联。用户必须是文件的所有者,否则是超级用户。 -R 将使改变在目录结构下递归进行。 示例:hadoop fs -chgrp othergroup /hadoop/hadoopfile -chmod 功能:改变文件的权限。使用-R 将使改变在目录结构下递归进行。 示例:hadoop fs -chmod 666 /hadoop/hadoopfile -chown 功能:改变文件的拥有者。使用-R 将使改变在目录结构下递归进行。 示例:hadoop fs -chown someuser:somegrp /hadoop/hadoopfile -copyFromLocal 使用方法:hadoop fs -copyFromLocal <localsrc> URI 功能:从本地文件系统中拷贝文件到 hdfs 路径去 示例:hadoop fs -copyFromLocal /root/1.txt / -copyToLocal 功能:从 hdfs 拷贝到本地 示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz -cp 功能:从 hdfs 的一个路径拷贝 hdfs 的另一个路径 示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2 -mv 功能:在 hdfs 目录中移动文件 示例: hadoop fs -mv /aaa/jdk.tar.gz / -getmerge 功能:合并下载多个文件 示例:比如 hdfs 的目录 /aaa/下有多个文件:log.1, log.2,log.3,... hadoop fs -getmerge /aaa/log.* ./log.sum -rm 功能:删除指定的文件。只删除非空目录和文件。-r 递归删除。 示例:hadoop fs -rm -r /aaa/bbb/ -df 功能:统计文件系统的可用空间信息 示例:hadoop fs -df -h / -du 功能:显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小。 示例:hadoop fs -du /user/hadoop/dir1 -setrep 功能:改变一个文件的副本系数。-R 选项用于递归改变目录下所有文件的副本 系数。 示例:hadoop fs -setrep -w 3 -R /user/hadoop/dir1