大数据学习笔记02----Hadoop之HDFS

HDFS分布式文件系统


Hadoop=HDFS(分布式文件系统)+MapReduce(分布式计算框架)+Yarn(资源协调框架)+Common模块,本文章主要对HDFS的知识点进行梳理。

一、 HDFS 简介

HDFS (全称:Hadoop Distribute File System,Hadoop 分布式文件系统)是 Hadoop 核心组成,是分布式存储服务。
分布式文件系统横跨多台计算机,在大数据时代有着广泛的应用前景,它们为存储和处理超大规模
数据提供所需的扩展能力。
HDFS是分布式文件系统中的一种。

二、HDFS的重要概念

HDFS 通过统一的命名空间目录树来定位文件; 另外,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色(分布式本质是拆分,各司其职);

- 典型的 Master/Slave 架构

HDFS 的架构是典型的 Master/Slave 结构。
HDFS集群往往是一个NameNode(HA架构会有两个NameNode,联邦机制)+多个DataNode组
成;
NameNode是集群的主节点,DataNode是集群的从节点。

  • 分块存储(block机制)

HDFS 中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定;
Hadoop2.x版本中默认的block大小是128M;

  • 命名空间(NameSpace)

HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被
Namenode 记录下来。
HDFS提供给客户单一个抽象目录树,访问形式:hdfs://namenode的hostname:port/test/inputhdfs://linux121:9000/test/input

  • NameNode元数据管理

我们把目录结构及文件分块位置信息叫做元数据。NameNode的元数据记录每一个文件所对应的block信息(block的id,以及所在的DataNode节点的信息)

  • DataNode数据存储

文件的各个 block 的具体存储管理由 DataNode 节点承担。一个block会有多个DataNode来存储,DataNode会定时向NameNode来汇报自己持有的block信息。

扫描二维码关注公众号,回复: 12549869 查看本文章
  • 副本机制

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

  • 一次写入,多次读出

HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的随机修改。(支持追加写入,不只支持随机更新)
正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用(修改不方便,延迟大,网络开销大,成本太高)

三、HDFS 架构

在这里插入图片描述

NameNode(nn):Hdfs集群的管理者,Master

  • 维护管理Hdfs的名称空间(NameSpace)
  • 维护副本策略
  • 记录文件块(Block)的映射信息
  • 负责处理客户端读写请求

DataNode:NameNode下达命令,DataNode执行实际操作,Slave节点

  • 保存实际的数据块
  • 负责数据块的读写

Client:客户端

  • 上传文件到HDFS的时候,Client负责将文件切分成Block,然后进行上传
  • 请求NameNode交互,获取文件的位置信息
  • 读取或写入文件,与DataNode交互
  • Client可以使用一些命令来管理HDFS或者访问HDFS
    运行原理
    在脑海中要有这张图的印象,方可加深对HDFS运行原理的理解。

四、HDFS 客户端操作

  • Shell 命令行操作HDFS
    基本语法 :bin/hadoop fs 具体命令 OR bin/hdfs dfs 具体命令
    - 命令大全
    root@linux121 hadoop-2.9.2]# bin/hdfs dfs(通过此命令可开启命令手册)
    Usage: hadoop fs [generic options]
    [-appendToFile … ]
    [-cat [-ignoreCrc] …]
    [-checksum …]
    [-chgrp [-R] GROUP PATH…]
    [-chmod [-R] <MODE[,MODE]… | OCTALMODE> PATH…]
    [-chown [-R] [OWNER][:[GROUP]] PATH…]
    [-copyFromLocal [-f] [-p] [-l] [-d] … ]
    [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] … ]
    [-count [-q] [-h] [-v] [-t []] [-u] [-x] …]
    [-cp [-f] [-p | -p[topax]] [-d] … ]
    [-createSnapshot []]
    [-deleteSnapshot ]
    [-df [-h] [ …]]
    [-du [-s] [-h] [-x] …]
    [-expunge]
    [-find … …]
    [-get [-f] [-p] [-ignoreCrc] [-crc] … ]
    [-getfacl [-R] ]
    [-getfattr [-R] {-n name | -d} [-e en] ]
    [-getmerge [-nl] [-skip-empty-file] ]
    [-help [cmd …]]
    [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [ …]]
    [-mkdir [-p] …]
    [-moveFromLocal … ]
    [-moveToLocal ]
    [-mv … ]
    [-put [-f] [-p] [-l] [-d] … ]
    …略

  • HDFS命令演示
    一些常用HDFS命令展示

  1. 启动Hadoop集群(方便后续的测试)
[root@linux121 hadoop-2.9.2]$ sbin/start-dfs.sh
[root@linux122 hadoop-2.9.2]$ sbin/start-yarn.sh

2.-help:输出这个命令参数

[root@linux121 hadoop-2.9.2]$ hadoop fs -help rm
  1. -ls: 显示目录信息
[root@linux121 hadoop-2.9.2]$ hadoop fs -ls /
  1. -mkdir:在HDFS上创建目录
[root@linux121 hadoop-2.9.2]$ hadoop fs -mkdir -p /test/bigdata
  1. -moveFromLocal:从本地剪切粘贴到HDFS
[root@linux121 hadoop-2.9.2]$ touch hadoop.txt
[root@linux121 hadoop-2.9.2]$ hadoop fs  -moveFromLocal ./hadoop.txt  /test/bigdata
  1. -cat:显示文件内容
[root@linux121 hadoop-2.9.2]$ hadoop fs -cat /test/bigdata/hadoop.txt
  1. -chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
[root@linux121 hadoop-2.9.2]$ hadoop fs  -chmod  777 /test/bigdata/hadoop.txt
[root@linux121 hadoop-2.9.2]$ hadoop fs  -chown root:root /test/bigdata/hadoop.txt
  1. -copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
[root@linux121 hadoop-2.9.2]$ hadoop fs -copyFromLocal README.txt /
  1. -copyToLocal:从HDFS拷贝到本地
 [root@linux121 hadoop-2.9.2]$ hadoop fs -copyToLocal /test/bigdata/hadoop.txt
 ./
  1. -get:等同于copyToLocal,就是从HDFS下载文件到本地
[root@linux121 hadoop-2.9.2]$ hadoop fs -get /test/bigdata/hadoop.txt ./
  1. -put:等同于copyFromLocal
[root@linux121 hadoop-2.9.2]$ hadoop fs -mkdir -p /user/root/test/
#本地文件系统创建yarn.txt
[root@linux121 hadoop-2.9.2]$ vim yarn.txt
resourcemanager nodemanager
[root@linux121 hadoop-2.9.2]$ hadoop fs -put ./yarn.txt /user/root/test
  1. -setrep:设置HDFS中文件的副本数量
[root@linux121 hadoop-2.9.2]$ hadoop fs -setrep 10 /lagou/bigdata/hadoop.txt

这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。
在这里插入图片描述

五 HDFS读写解析

5.1 HDFS读数据流程
在这里插入图片描述

  1. 客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
  2. 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
  3. DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
  4. 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

5.2 HDFS写数据流程
在这里插入图片描述

  1. 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
  2. NameNode返回是否可以上传。
  3. 客户端请求第一个 Block上传到哪几个DataNode服务器上。
  4. NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
  5. 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。(保证数据安全)
  6. dn1、dn2、dn3逐级应答客户端。
  7. 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单
    位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个确认队列等待确认。
  8. 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行
    第7步)。

六 NN与2NN

6.1 HDFS元数据管理机制(至关重要)

问题1:NameNode如何管理和存储元数据?
计算机中存储数据两种方法:内存或者是磁盘
如果元数据存储在磁盘中:存储磁盘无法面对客户端对元数据信息的任意的快速低延迟的响应,但是安全性高
如果元数据存储在内存中:元数据存放内存,可以高效的查询以及快速响应客户端的查询请求,数据保存在内存,如果断点,内存中的数据全部丢失。
解决方案内存+磁盘;NameNode内存+FsImage的文件(磁盘)
新问题:磁盘和内存中元数据如何划分?
两个数据一模一样,还是两个数据合并到一起才是一份完整的数据呢?
如果两份数据一模一样:client如果对元数据进行增删改操作,需要保证两个数据的一致性。FsImage文件操作起来效率也不高。
解决方案:
两个合并=完整数据:NameNode引入了一个edits文件(日志文件:只能追加写入)edits文件记录的
是client的增删改操作,不再选择让NameNode把数据dump出来形成FsImage文件(这种操作是比较消耗资源)。

在这里插入图片描述

第一阶段:NameNode启动

  • 第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
  • 客户端对元数据进行增删改的请求。
  • NameNode记录操作日志,更新滚动日志。
  • NameNode在内存中对数据进行增删改。

第二阶段:Secondary NameNode工作

  • Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否执 行检查点操作结果。

  • Secondary NameNode请求执行CheckPoint。

  • NameNode滚动正在写的Edits日志。

  • 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。

  • Secondary NameNode加载编辑日志和镜像文件到内存,并合并。

  • 生成新的镜像文件fsimage.chkpoint。

  • 拷贝fsimage.chkpoint到NameNode。

  • NameNode将fsimage.chkpoint重新命名成fsimage。

6.2 Fsimage与Edits文件解析

NameNode在执行格式化之后,会在/opt/lagou/servers/hadoop-2.9.2/data/tmp/dfs/name/current目录下产生如下文件
在这里插入图片描述

  • Fsimage文件:是namenode中关于元数据的镜像,一般称为检查点,这里包含了HDFS文件系统所有目录以及文件相关信息(Block数量,副本数量,权限等信息)
  • Edits文件 :存储了客户端对HDFS文件系统所有的更新操作记录,Client对HDFS文件系统所有的更新操作都会被记录到Edits文件中(不包括查询操作)
  • seen_txid:该文件是保存了一个数字,数字对应着最后一个Edits文件名的数字
  • VERSION:该文件记录namenode的一些版本号信息,比如:CusterId,namespaceID等

在这里插入图片描述
在这里插入图片描述
问题:NameNode启动时如何确定加载哪些Edits文件呢?
NN启动时需要加载fsimage文件以及那些没有被2nn进行合并的edits文件,NN如何判断哪些edits已经被合并了呢?
答:可以通过fsimage文件自身的编号来确定哪些已经被合并。
在这里插入图片描述

七 Hadoop的限额与归档以及集群安全模式

HDFS文件限额配置
HDFS文件的限额配置允许我们以文件大小或者文件个数来限制我们在某个目录下上传的文件数量
或者文件内容总量,以便达到我们类似百度网盘网盘等限制每个用户允许上传的最大的文件的量
1. 数量限额

hdfs dfs -mkdir -p /user/root/test     #创建hdfs文件夹
hdfs dfsadmin -setQuota 2 /user/root/test       # 给该文件夹下面设置最多上传两个文件,上传文件,发现只能上传一个文件
hdfs dfsadmin -clrQuota /user/root/test   # 清除文件数量限制

2. 空间大小限额

hdfs dfsadmin -setSpaceQuota 4k /user/root/test  # 限制空间大小4KB
#上传超过4Kb的文件大小上去提示文件超过限额
hdfs dfs -put /export/softwares/xxx.tar.gz /user/root/test
hdfs dfsadmin -clrSpaceQuota /user/root/test  #清除空间限额
#查看hdfs文件限额数量
hdfs dfs -count -q -h /user/root/test

HDFS的安全模式
安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在NameNode主节点启动时,HDFS首先进入安全模式,DataNode在启动的时候会向NameNode汇报可用的block等状态,当整个系统达到安全标准时,HDFS自动离开安全模式。如果HDFS出于安全模式下,则文件block不能进行任何的副本复制操作,因此达到最小的副本数量要求是基于DataNode启动时的状态来判定的,启动时不会再做任何复制(从而达到最小副本数量要求),HDFS集群刚启动的时候,默认30S钟的时间是出于安全期的,只有过了30S之后,集群脱离了安全期,然后才可以对集群进行操作。

hdfs dfsadmin  -safemode

Hadoop归档技术
主要解决HDFS集群存在大量小文件的问题!!
由于大量小文件会占用NameNode的内存,因此对于HDFS来说存储大量小文件造成NameNode内存资源的浪费!
Hadoop存档文件HAR文件,是一个更高效的文件存档工具,HAR文件是由一组文件通过archive工具创建而来,在减少了NameNode的内存使用的同时,可以对文件进行透明的访问,通俗来说就是HAR文件对NameNode来说是一个文件减少了内存的浪费,对于实际操作处理文件依然是一个一个独立的文件。
在这里插入图片描述
案例

  1. 启动YARN集群
[root@linux121 hadoop-2.9.2]$ start-yarn.sh
  1. 归档文件
    把/user/lagou/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件
    存储到/user/lagou/output路径下。
[root@linux121 hadoop-2.9.2]$ bin/hadoop archive -archiveName input.har –p
/user/root/input /user/root/output
  1. 查看归档
[root@linux121 hadoop-2.9.2]$ hadoop fs -lsr /user/root/output/input.har
[root@linux121 hadoop-2.9.2]$ hadoop fs -lsr
har:///user/root/output/input.har
  1. 解归档文件
[root@linux121 hadoop-2.9.2]$ hadoop fs -cp har:/// user/root/output/input.har/*
/user/root

总结

主要掌握HDFS的读、写流程和HDFS元数据管理机制。

猜你喜欢

转载自blog.csdn.net/weixin_43900780/article/details/114047833