Hadoop学习笔记(1)——HDFS概述

学习于Hadoop入门教程

一.HDFS概述

1.介绍

需要跨机器存储,统一管理分布在集群上的文件系统统称为分布式文件系统
Hodoop使用HDFS(Hadoop Distributed File System)作文存储系统。HDFS使用多台计算机存储文件,对外提供统一操作文件的接口
在这里插入图片描述

2.应用场景

适合的场景

a.存储非常大的文件并对延时没有要求
b.彩球流式的数据访问方式,即一次写入,多次读取。数据集经常从数据源生成或者拷贝,然后做很多分析工作。
c.对硬件要求不高
d.高容错
e.可拓展

不适合的场景

a.对延时有要求。
b.大量小文件。每个文件都需要对应一条元数据,元数据存储在NameNode的内存中
c.多方读写。不支持文件任意offset的修改。不支持多个写入器

3.HDFS的架构

HDFS是一个主/从体系结构。
HDFS由四部分组成,HDFS ClientNameNodeDataNodeSecondary NameNode在这里插入图片描述

Client:客户端
a.文件切分。文件上传HDFS的时候,将文件切分承一个一个的数据块(Block)进行存储
b.与NameNode交互,获取文件的位置
c.与DataNode交互,读取或写入数据
NameNode: HDFS系统中的master,是主管
a.管理HDFS的名称空间
b.管理数据块(block)的映射信息
c.管理副本策略
d.处理客户端请求
DataNode: 就是Slave
a.存储实际的数据块
b.执行数据库的读/写操作
Secondary NameNode: 并非NameNode的热备,不能代替Namenode
a.辅助NameNode,分担其工作
b.当NameNode挂掉时,辅助它复活

4.NameNode和DataNode
4.1.NameNode作用

NameNode在内存中保存着整个文件系统的名称空间和文件数据块的地址映射。
整个HDFS可存储的文件数量受限于NameNode的内存大小。
1.NameNode元数据信息:文件名,文件目录结构,文件属性以及每个文件的块列表。以及例表中的块与块所在的DataNode的之间的地址映射关系。这些数据会定时持久化到磁盘中
在这里插入图片描述
2.NameNode文件操作:NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写,数据流不经过NameNode

3.NameNode副本:文件数据块到底存放到哪里DataNode上,是由NameNode依据全局情况做出放置副本的决定

4.NameNode心跳机制: NameNode会周期性的来自DataNode的状态信息报告。如果10分钟内接受不到DN的心跳,NN则会认位它宕机

4.2 DataNode的作用

1.DN以数据块的形式存储文件
2.DN响应Client的读写请求
3.DN周期性的向NN发送心跳信息
4.DN周期性的向NN汇报数据块信息/缓存数据块信息

5.HDFS的副本机制和机架感知
5.1 HDFS文件副本机制

所以的文件都是以block块的方式存放在HDFS文件系统中,作用如下
1.一个文件可能大于整个磁盘容量,引入块机制可以很好的解决这个问题
2.使用块作为文件存储的逻辑单位可以简化存储子系统
3.易于备份挺高容灾能力
在hadoop2中,block的默认大小为128M,可以在hdfs-site.xml配置文件中修改。每个block的默认副本数为3,也可以在这个配置文件中改

<! -- 每个Block的副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<! -- 每个Block的最大容量 -->
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>

5.2 机架感知

机架可以理解为存放一组主机的柜子
机架感知是HDFS的系统中有一个副本存放的策略
在这里插入图片描述
每一个Block在同一个机架的机器内存放一个副本,在另一个机架内的一个机器存放第二个副本
相同机架内的机器传输速率很快,第二个机架是为了提高的容灾能力

6 HDFS基础命令
1.ls

在这里插入图片描述
演示列出更目录下文件列表
在这里插入图片描述

2.lsr:整个目录下递归运行ls。(已经过时,使用-ls -R代替这个命令)

在这里插入图片描述
在这里插入图片描述

3. mkdir

在这里插入图片描述
在这里插入图片描述
可以用50070端口查看系统的文件

4.put :将本地文件/文件夹拷贝到HDFS内

在这里插入图片描述
在这里插入图片描述
将a.txt上传到根目录下
在这里插入图片描述

5.moveFromLocal:将本地文件/文件夹剪切到HDFS上
6. get :将HDFS中的文件拷贝到本地

在这里插入图片描述
将HDFS中根目录下a.txt文件拷贝到本地当前目录
在这里插入图片描述

7 mv:将HDFS的文件移动到目标路径(HDFS内部的文件移动)

在这里插入图片描述
在这里插入图片描述

8.rm:删除文件或目录

在这里插入图片描述

9. cp:将文件拷贝到目标路径

在这里插入图片描述

10. cat :显示文件内容

在这里插入图片描述
在这里插入图片描述

11 chmod:改变文件权限

在这里插入图片描述

12 chown :改变文件所属用户和用户组

在这里插入图片描述

13 appendToFile :合并本地文件拷贝至HDFS

在这里插入图片描述

7. HDFS高级命令
1.HDFS文件限额配置

HDFS文件限额配置可以限制一个目录的文件数量,空间大小

1.1 文件数量限制

我们新建一个目录,使用hdfs dfs -count -q -h查看这个目录的原始限额信息
在这里插入图片描述
在这里插入图片描述
当设置目录上限为n个文件时,实际上只能存储n-1个文件,因为目录也算一个

1.2 空间大小限额

在这里插入图片描述
给目录空间限额有一个原则,即限额必须大于Block容量3
文件上传到被限额的目录时,目录空间限额量必须大于 文件大小/block容量
3,否则会上传失败。

2.HDFS的安全模式

安全模式是hadoop的一种保护机制,用于保护数据块的安全性。当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性,即检查副本率(实际副本数/默认副本数)如果副本率小于0.999,hadoop会增加副本,如果副本数大于默认副本的个数,则会删除多余的副本。
默认配置下如果没有问题,30秒之后会退出安全模式
在安全模式下,文件系统只能读取,不能删改
在这里插入图片描述
在50070端口可以更直观地看到系统是否正在处于安全模式
在这里插入图片描述

8.HDFS基准测试

在hadoop集群搭建完成后,第一件事情就是执行压力测试

1.测试写入速度

在这里插入图片描述
执行hadoop安装包 share/hadoop/mapreduce下hadoop-mapreduce-client-jobclient-2.9.2.jar这个jar包
在这里插入图片描述
写入速度测试结果

2.测试读取速度

在这里插入图片描述
这个测试命令和上一个只是换了一个参数read
查看测试结果
在这里插入图片描述

3.清除测试数据

在这里插入图片描述

9.HDFS文件写入过程

1.client请求上传文件
2.NameNode检测上传权限
3.可以上传,NameNode回复Client
4.Client切分文件,请求上传第一个block
5.NameNode根据集群信息和机架感知,选出可以上传的三个DataNode
6.NameNode将选出的DataNode列表回复给Client
7.Client与DataNode建立piepeline,DataNode与DataNode之间也建立piepeline
8.Client依靠piepeline转递数据(传递的数据单位是packet(64k))
9.当第一个DataNode接受到数据,它会进行缓存,通过piepeline再传递到下一个DataNode,下一个DataNode也会缓存,依次传递
10.第N个DataNode发送应道到N-1个DataNode,依次发送,直到发到第一个DataNode,然后第一个DataNode回复客户端,发送完毕。
11.从4步开始,Client开始上传第二个block
HDFS上传文件流程图

10. HDFS文件读取过程

1.client发送下载请求
2.NameNode进行权限检查和block列表检查
3.返回block主机列表给client
4.client与DataNode建立piepeline
5.开始读取数据,读取的数据单位也是packet,读操作是并行进行的
6.将block进行合并
在这里插入图片描述

11.HDFS的元数据管理
1. FsImage 和 Edits文件

1.fsImage:由于NameNode将文件的元数据保存在内存中,如果重启就会消失。fsImage就是元数据的持久化文件。但fsImage并不一定是完整的元数据文件,它只是一段时间内的元数据,需要根据Eidts文件进行补全
2.Eidts:保存最近的对元数据操作的日志文件
fsimage,Eidts的位置配置在了hdfs-site.xml中

<!-- fsimage-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/hadoop-2.9.2/hadoopData</value>
</property>
<!--edits-->
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///opt/hadoop-2.9.2/hadoopData</value>
</property>

查看fsimage和edits的命令
在这里插入图片描述
-i 表示哪一个文件,-p表示解析的方式,-o表示保存在哪个文件

2.SecondaryNameNode 如何辅助管理 fsimage 与 edits 文件

当服务器运行时间不断增加,edits的文件大小就会不断增大,这时就需要SecondaryNameNode定期合并 fsimage 和 edits, 把edits控制在一个范围内
SecondaryNameNode合并fsimage和edits,有两个触发条件,我们可以通过修改hdfs-site.xml来配置

<!-- 多久记录一次 HDFS 镜像, 默认 1小时 -->
<property>
  <name>fs.checkpoint.period</name>
  <value>3600<alue>
</property>
<!-- 一次记录多大, 默认 64M -->
<property>
  <name>fs.checkpoint.size</name>
  <value>67108864<alue>
</property>

补充:HDFS的高可用机制

NameNode作为HDFS的核心,肯定不能只有一个。在一个高可用的HDFS中,有一个NameNode作为active状态,多个NameNode作为StandBy。
HDFS使用JournalNode来管理元数据信息,同时备份多个JouranlNode组成元数据的共享存储系统。
active状态的NameNode将Edits日志写入共享存储系统,StandBy从共享存储系统中读取Edits日志。保证所有NameNode内的元数据是同步的
HDFS使用ZKFC组件(基于zookeeper实现)监控NameNode状况和即使切换Active的NameNode,具体机制如下图
在这里插入图片描述

补充:HDFS的联邦机制(Federation)

随着业务量的增多,我们内存中元数据会越来越多,甚至达到上百G。NameNode成为了性能的瓶颈。因而提出了namenode水平扩展方案-- Federation。
简单来说,就是再给HDFS中增加多个NameNode集群,不同的集群管理系统中不同的文件,互不干涉
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值