一、前言

实验环境

仅用于个人学习使用且电脑配置有限,因此搭建伪分布式模式,即在单节点上启动NameNode、DataNode、SecondaryNameNode等进程,但操作、原理与完全分布式模式一样仅学习还是够用的。HDFS作为Hadoop两大重要组成部分之一,主要解决海量数据存储问题,详细信息点击这里哟!
下面是我的实验环境(Hadoop大多运行在Linux系统下)

服务器:Centos 6
虚拟机:VMware Workstation Pro 13.0
SSH:MobaXterm
PC:Win10

二、HDFS运行原理

1.HDFS概念

  • HDFS,是 Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统。是 Hadoop 核心组件之一。
  • HDFS解决的问题就是大数据的存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。
  • HDFS起源于Google的GFS论文(GFS,Mapreduce,BigTable为google的旧的三驾马车)

2.HDFS优缺点

  • 优点

    • 高容错性
    • 适合大数据处理
    • 可搭建在廉价的机器上
  • 缺点

    • 不适合低延迟数据访问
    • 不适合大量小文件进行存储
    • 不支持文件并发写入和文件随机修改

3.HDFS组成架构(重点)

HDFS 采用 master/slave 架构。一般一个 HDFS 集群是有一个 Namenode 和一定数目的Datanode 组成。Namenode 是 HDFS 集群主节点,Datanode 是 HDFS 集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。

HDFS架构设计

  • Client:客户端

    • 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block
    • 与NameNode交互,获取文件的位置信息
    • 与DataNode交互,读取或者写入数据
    • 提供一些命令来管理HDFS
  • NameNode:名称节点。就是Master,它是一个主管、管理者、老大

    • 存储元数据(内存中)
    • 保存block与DataNode之间的映射关系
  • DataNode:数据节点。就是小弟。NameNode下达命令,DataNode执行实际的操作

    • 存储文件内容(磁盘)
    • 维护block ID到DataNode本地文件的映射关系
    • 存储到本地Linux系统中
  • SecondaryNameNode:第二名称节点。NameNode的冷备份

    • 主要解决EditLog不断增大的问题(下面会详细介绍)

3.1 Block大小

​ HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M。HDFS的块设计成,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。

3.2 副本机制

​ 为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目,副本系数可以在文件创建的时候指定,也可以在之后改变。

3.3 元数据

​ 数据的描述信息,比如这个文件的路径,这个文件的副本数,每个副本保存在哪个DataNode上,就相当于真真正正的一个人,他有一些信息:身高、体重、姓名、性别等,通过这些信息就可以描述这个人,那描述HDFS上真实数据的信息,就称为元数据。

4.HDFS运行原理(重点)

  • NameNode启动

    • 将FsImage文件内容加载到内存中
    • 执行EditLog文件的各项操作,使得内存的元数据和实际的同步
    • 得到新的FsImage并创建一个空的EditLog文件
    • 启动后所有的操作都记录在EditLog,并不会添加在FsImage中
  • DataNode启动

  • SecondaryNameNode启动

FsImage:维护文件系统树以及文件树中所有的文件和文件夹的元数据,但不维护块在哪个DataNode(通过NameNode与DataNode实时沟通生成文件目录并储存在内存中),主要记录文件复制等级、修改和访问时间、访问权限、块大小等

EditLog:操作日志文件,记录所有针对文件的增删改查等操作

通过FsImage和EditLog的结合就能完成所有文件的增删改查,但随着文件的修改EditLog会变得非常庞大,这时候就需要通过SecondaryNameNode来解决。

4.1 NameNode运行机制

  • 1.SecondaryNameNode会定期和NameNode通信,请求暂停使用EditLog文件,暂时将新的操作写在新的文件EditLog.new上且瞬间完成。
  • 2.SecondaryNameNode通过HTTP GET方式从NameNode上获取FsImage和EditLog并下载到本地。
  • 3.SecondaryNameNode将下载的FsImage载入内存并与EditLog进行合并
  • 4.SecondaryNameNode通过post方式将新的FsImage发送给NameNode
  • 5.NameNode将新的FsImage替换掉,同时将EditLog.new替换成EditLog

4.2 HDFS思维导图

凑合着看,别问为什么是个图片,问就是没钱^_^

三、HDFS实操

1.安装虚拟机

这里强烈推荐一个微信公众号管家课堂,为数不多的超良心公众号,各种常用软件安装教程。这是一个安装传送门,记得关注哟

2.安装Linux并安装Hadoop

我已经将配置好的Centos6打包好了网盘链接,提取码:cpj1

[当然爱折腾的可自行下载、配置、安装]。

解压下载好的安装包,打开VMware虚拟机,点击文件->打开(快捷键Ctrl + O),找到刚才解压的路径打开linux01虚拟机配置即可

出现该提示点击我已移动该虚拟机,无需其他操作等待加载完成即可

该虚拟机用户名如下,要使用root账户[权限高]

用户1:admin
密码:123456
用户2:root
密码:123456

如下即为Centos6的桌面

从PC机文件上传到虚拟机并不容易,因此我们使用SSH远程连接Linux,这里我使用MobaXterm。首先我们需要获取这个Linux的IP地址,右击桌面点击在终端打开输入

ifconfig

框选出来的就是本机IP,打开MobaXterm->Session->SSH输入刚才得到的IP即可,

第一次连接需要输入root用户的密码,注:Linux为保护用户安全,在你输入密码时屏幕并不会出现任何符号。

黑色背景区域即为Linux终端,一般使用Lin系统是不会选择启动图形化界面的。左边文件夹区域为Linux的文件系统,当需要将PC机文件上传到Linux时,只需拖拽即可。

这个Linux系统已经集成了Hadoop,不需要额外安装。

3.HDFS常见操作命令

首先需要修改一下配置,输入

vi /etc/hosts    

i,将最后一行的IP修改为自己的,按Esc退出修改模式并输入

:wq

保存并关闭,上述只是Linux系统的操作命令,在我另一篇文章会有详细介绍,并且Hadoop的一些命令和Linux及其一致。

启动HDFS

start-dfs.sh

启动完成可查看当前进程检查HDFS是否全部启动,输入如下代码

jps

当看到NameNode、DataNode、SecondaryNameNode即为启动成功

若有没有启动的可以结束HDFS并在此启动,代码如下

stop-dfs.sh
start-dfs.sh

查看当前HDFS文件

hdfs dfs -ls /

在HDFS新建文件夹

hdfs dfs -mkdir /Test    //在根目录下创建Test文件夹

删除HDFS指定文件(夹)

hdfs dfs -rm -f /Test    //删除指定文件夹
hdfs dfs -rm /name.txt    //删除指定文件

将Linux文件上传到HDFS上

hdfs dfs -put /MapReduce/test.txt /Data

第一个路径为Linux要上传文件的绝对路径,第二个为上传到HDFS的路径(上述代码不要直接复制,因为你的Linux和HDFS可能没有这个文件夹和文件)

将HDFS文件下载到Linux本地

hdfs dfs -get /Data/text /MapReduce

同理第一个路径为HDFS要下载文件的绝对路径,第二个为下载到Linux本地的文件路径(Linux本地不能有与要下载文件同名的文件,道理很显然)

最后,关机命令(虚拟机上的系统很脆弱,要小心呵护不要暴力关机!!!)

shutdown -h now

上述命令基本够用学习MapReduce了,期待下一遍博文将会详细介绍Hadoop另一个重要组件MapReduce

  • 需要MobaXterm及其他技术支持联系微信^_^ skr~

只喜欢学习