本小节我们来学习Hadoop的HDFS系统,我们先来体验一下HDFS然后再来了解他的原理。
HDFS初体验
HDFS(分布式文件管理系统),顾名思义,它就是我们用来管理海量文件的一个系统。现在是一个数据量爆炸的时代,普通的操作系统管辖不了这么多文件,那么就需要分配到更多文件系统的磁盘中,但是这样又不利于管理和维护,所以我们迫切的需要一个系统来管理多台机器上的文件,分布式文件管理系统就应运而生。
分布式文件系统是一种允许文件通过网络在多台主机上分享的文件系统,可以让可让多机器上的多用户分享文件和存储空间。
分布式文件系统有很多,HDFS是最常见也是使用人数最多的系统之一,适用于一次写入多次查询的情况,不支持并发写的情况,小文件不合适放在HDFS系统中。
刚开始学习,你可以简单的将HDFS理解为Windows文件系统。
好了,说了这么多我们开始用一用吧。
首先我们启动HDFS:
start-dfs.sh
接着我们来查看HDFS的根目录:
hadoop fs -ls /
现在输入该命令应该是空空如也的,因为我们HDFS系统中还没有任何文件和文件夹,好既然没有那咱们就来创建一个文件夹。
创建文件夹之后输入之前的命令就可以看到根目录下有一个test
文件夹。
接下来我们在本地创建一个文件编写一些内容,然后上传到HDFS系统中。
将hello.txt
上传到HDFS的 /text
文件夹中。
接下来我们来查看刚刚上传的文件。
使用-cat
命令即可查看HDFS中的文件。
我们也可以通过Hadoop自带的Web页面来查看集群中的文件,http://localhost:9870/ 如果要在windows系统中访问该页面,localhost修改成虚拟机ip。
下面这个表格是HDFS的一些常用操作,我们不用专门背下来,记住几个常用的,其他的以后用到了查一查就可以了。
选项名称 | 使用格式 | 含义 |
---|---|---|
-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 路径> | 从本地复制 |
-moveFromLocal | -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 <文件路径> | 创建空白文件 |
HDFS体系结构与基本概念
初步体验了HDFS系统之后,接下来就要学习原理了,一般原理都是比较枯燥的,但却非常重要,是本小节的重点。
HDFS文件系统结构
HDFS以流式数据访问模式来存储超大文件,运用于商用硬件集群上。(超大文件一般指几百G甚至几百TB或PB级大小的文件)。
HDFS的文件系统是一个主从结构,即master/slave
结构,只有一个主节点namenode
,有多个子节点datanode
,namenode
负责管理文件系统和命名空间,并且负责客户端(client)对文件系统的访问,datanode
负责存储数据。
HDFS中的文件是以数据块(blok)的形式存储在datanode
中的。每一个数据块是64M或者128M、256M,文件拆分成若干个block
,这些block存放在DataNode节点上。NameNode
操作名字空间比如:打开,关闭,重命名文件目录。DataNode
负责为文件系统的客户提供读/写操作服务。DataNode
同时还为NameNode
提供block创建,删除,备份机制,NameNode
只负责元数据信息,没有数据流。NameNode
维护名字空间,任何对文件系统名字空间的改动都记录在NameNode
。系统的文件组织结构和linux非常类似。你可以创建,删除,移动,重命名文件或者目录。
namenode 和datanode
HDFS集群有两类节点,并以管理者-工作者模式运行,即一个namenode(管理者)和多个datanode(工作者)。namenode管理文件系统的命名空间,它维护着文件系统树及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。namenode也记录着每个文件中各个块(block)所在的数据节点信息,但它并不永久保存块的位置信息,因为这些信息会在系统启动时有数据节点重建。
客户端(client)代表用户通过与namenode和datanode交互来访问整个文件系统,客户端提供一个类似于POSIX(可移植操作系统界面)的文件系统接口,因此用户在编程时无需知道namenode和datanode也可以实现功能。
datanode是文件系统的工作节点,他们根据需要存储并检索数据块(受客户端或namenode调度),并且定期向namenode发送他们所存储的块的列表。
所以没有namenode,文件系统就会无法使用,如果运行namenode服务的机器毁坏,文件系统上所有的文件将会丢失,因为我们不知道如何根据datanode的块来重建文件,因此,对namenode实现容错非常重要,Hadoop为此提供了各种机制。
第一种机制是备份那些组成文件系统元数据持久状态的文件。Hadoop可以通过配置使namenode在多个文件系统上保存元数据的持久状态,这些写操作是实时同步的,是原子操作,一般的配置使,将持久状态写入本地磁盘的同时,写入一个远程挂在的网络文件系统(NFS)。
另一个方法是运行一个辅助namenode,但它不能被用作namenode,这个复制namenode的重要作用是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大,这个辅助namenode一般在另一台单独的物理计算机上运行,因为他需要占用大量CPU时间与namenode相同容量的内存来执行合并操作,他会保存合并后的命名空间镜像的副本,并在namenode发生故障时启用,但是,辅助namenode保存的状态总是滞后于主节点,所以在主节点全部失效时,难免会丢失部分数据。在这种情况下,一般把存储在NFS上的namenode元数据复制到辅助namenode并作为新的主namenode运行。