栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

04-Hadoop之HDFS分布式文件系统详解

04-Hadoop之HDFS分布式文件系统详解

HDFS详解 一、 HDFS 概述 1.1 HDFS定义

​ HDFS( Hadoop Distribution File System), 它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

​ HDFS的使用场景:适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

1.2 HDFS优缺点 (1)优点 a. 高容错性
  • 数据自动保存多个副本。它通过增加副本的形式,提高容错性
  • 某一个副本丢失以后,它可以自动恢复
b. 适合处理大数据
  • 数据规模: HDFS 是 Hadoop 项目的一个子项目。是 Hadoop 的核心组件之一, Hadoop 非常适 于存储大型数据 (比如 TB 和 PB)(需要多台节点),
  • 文件规模: HDFS 使用多台计算机存储文件,能够处理百万规模以上的文件数量。
c. 可构建在廉价机器上,通过多副本机制,提高可靠性 (2) 缺点 a. 不适合低延时数据访问

对于毫秒级的存储数据,是做不到的

b. 无法高效的对大量小文件进行存储
  • 存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。
  • 小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标
c. 不支持并发写入、文件随机修改
  • 一个文件只能有一个写,不允许多个线程同时写
  • 仅支持数据append (追加), 不支持文件的随机修改
1.3 HDFS架构 (理解清楚)
思考:HDFS系统中的文件或者数据存储在哪里?
NameNode:用于管理元数据(对真实数据的描述信息)
	--存储在Linux系统/opt/module/hadoop-3.1.3/name下								格式化之后,才会产生name目录
作用:	
	用于管理HDFS名称空间
	用于配置副本策略
	用于处理客户端读写请求
	管理数据(Block)块映射信息
	下达指令给DN
	
DataNode:用于存储真实块数据信息	
	--存储在Linux系统/opt/module/hadoop-3.1.3/data下
	格式化之后,才会产生data目录
执行数据块的读写操作

SecondaryNameNode : 为NameNode分担压力, 关键时刻,辅助恢复NameNode
1.4 HDFS文件块大小(面试重点)
HDFS中文件的存储在物理上是分块存储(块为单位),块的大小可以通过dfs.blocksize设置,默认在hadoop3.x版本中是128M,hadoop2.x也是128M,hadoop1.x是64M.本地(windows系统)模式下默认的块大小是32M
	注意:128M只是衡量一个文件是否要进行切块的标准,实际文件是多大,存储到Hdfs上就是多大。
	例如: 块大小为128M
       上传一个100M的文件, 最后在HDFS会生成一个块。实际占用空间还是100M
       上传一个200M的文件, 最后在HDFS会生成两个块, 第一个块占用空间128M, 第二个块占用空间72M
       
块大小设置路径:在hdfs-default.xml中	

  dfs.blocksize
  134217728
  
      The default block size for new files, in bytes.
      You can use the following suffix (case insensitive):
      k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.),
      Or provide complete size in bytes (such as 134217728 for 128 MB).
  

(1) 将文件切分为block块的好处
  • 一个文件的大小可能大于集群中任意一个磁盘
    • 块可以将大文件切分多个块进行存储
  • 使用块进行存储可以简化存储系统
  • 块非常适用于数据备份进而提供数据容错能力和可用性
(2) 块缓存

通常 DataNode 从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在 DataNode 的内存中,以堆外块缓存的形式存在。默认情况下,一个块仅缓存在一个DataNode的内存中,当然可以针对每个文件配置DataNode的数量。作业调度器通过在缓存块的DataNode上运行任务,可以利用块缓存的优势提高读操作的性能。

上述总结:DataNode从磁盘中读取块内容是从内存读取再写到磁盘的。(只需要清楚)

例如:
连接(join)操作中使用的一个小的查询表就是块缓存的一个很好的候选。用户或应用通过在缓存池中增加一个cache directive来告诉namenode需要缓存哪些文件及存多久。缓存池(cache pool)是一个拥有管理缓存权限和资源使用的管理性分组。

例如:

一个文件 130M,会被切分成2个block块,保存在两个block块里面,实际占用磁盘130M空间,而不是占用256M的磁盘空间

思考: 为什么块的大小不能设置太小, 也不能设置太大?`

  • HDFS的块设置太小, 会增加寻址时间,程序一直在找块的开始位置;

  • 如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢

总结: HDFS 块的大小设置主要取决于磁盘传输速率。

1.5 HDFS的特性总结
  • 1. master/slave 架构(主从架构)

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

  • 2. 分块存储

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

  • 3. 名字空间(NameSpace)

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

  • 4. NameNode 元数据管理

我们把目录结构及文件分块位置信息叫做元数据。NameNode 负责维护整个 HDFS 文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的 id,及所在的 DataNode 服务器)。

  • 5. DataNode 数据存储

文件的各个 block 的具体存储管理由 DataNode 节点承担。每一个 block 都可以在多个 DataNode 上。DataNode 需要定时向 NameNode 汇报自己持有的 block 信息。存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3)

  • 6. 副本机制

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

  • 7. 一次写入,多次读出

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

二、 HDFS 的shell命令

2.1 基本语法

​ bin/hadoop fs 具体命令 OR bin/hdfs dfs 具体命令

注意:两个(hadoop、dfs)在操作dfs上的操作是完全相同的。

2.2 命令大全

-启动Hadoop集群
	start-dfs.sh    start-yarn.sh
-help:输出这个命令参数
	hdfs dfs -help rm
-ls: 显示目录信息
	hadoop fs -ls /
-mkdir:在HDFS上创建目录
	hadoop fs -mkdir -p /user/swk
-moveFromLocal:从本地剪切粘贴到HDFS
	hdfs dfs -moveFromLocal ./input/test.txt /user/swk/input
-appendToFile:追加一个文件到已经存在的文件末尾
	hdfs dfs -appendToFile ./input/test.txt /user/swk/input/wc.input.txt
-cat:显示文件内容
	hadoop fs -cat /user/swk/input/wc.input
-chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
	hdfs dfs -chmod 777 /user/swk/input/input/wc.input
	hadoop fs -chown swk:swk /user/swk/input/input/wc.input
-copyFromLocal:从本地文件系统中拷贝文件到HDFS
	hadoop fs -copyFromLocal README.txt /
-copyToLocal:从HDFS拷贝到本地
	hdfs dfs -copyToLocal /user/swk/input/wc.input ./
-cp :从HDFS的一个路径拷贝到HDFS的另一个路径
	hdfs dfs -cp /user/swk/input/wc.input /user/swk/
-mv:在HDFS目录中移动文件
	hadoop fs -mv /user/swk/input  /user/
-get:等同于copyToLocal,就是从HDFS下载文件到本地
	hadoop fs -get /user/swk/input/wc.input ./
-getmerge:合并下载多个文件
	hdfs dfs -getmerge /user/swk/input
具体操作演示:
	1、杀掉NameNode进程
		jps 查看NN运行的进程号
		kill -9 NN进程号
	2、删除name下所有内容
		rm -rf /opt/module/hadoop-3.1.3/data/name/ *
	3、拷贝2NN服务器节点name下的所有内容到NN中的name目录下
		scp -r atguigu@swk5:/opt/module/hadoop-3.1.3/data/namesecondary/* ./name/


方式二

使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中.
具体操作演示:
	1、修改hdfs-site.xml
		
          dfs.namenode.checkpoint.period
          120
        
        
          dfs.namenode.name.dir
          /opt/module/hadoop-3.1.3/data/name
        
	2、kill -9 NameNode进程
	3、删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/name)
	4、如果2NN不和NN在一个主机节点上,需要将2NN存储数据的目录拷贝到NN存储数据的平级目录,并删除in_use.lock文件
		scp -r atguigu@swk5:/opt/module/hadoop-3.1.3/data/namesecondary ./
		rm -rf in_use.lock
		pwd   --->   /opt/module/hadoop-3.1.3/data
	5、导入检查点数据(等待一会ctrl+c结束掉)
		bin/hdfs namenode -importCheckpoint
	6、启动NameNode
		hdfs --daemon start namenode
4.5 集群安全模式 4.5.1 安全模式概述 1、 NameNode 启动

NameNode启动时,首先将镜像文件(Fsimage)载入内存,并执行编辑日志(Edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和空的编辑日志(实际上没有创建新的文件,这里指的是将checkpoint的数据放入进行同步导致文件变化)。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode一直运行在安全模式,即NameNode的文件系统对客户端来说只是只读的。

2、 DataNode启动

系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。

3、 安全模式退出判断

如果满足 “最小副本条件” ,NameNode会在30秒钟之后就会退出安全模式。所谓的最小副本条件指的是在整个文件系统中 99.9%的块满足最小副本级别(默认值 : dfs.replication.min = 1 最小副本数为1)。在启动一个刚刚格式化的 HDFS 集群时,因为系统中还没有任何块,所以 NameNode 不会进入安全模式。

最小副本条件解释:如果有1000个块,只需要知道1000个块中的999块其中的一个块的副本,即可退出安全模式。

4.5.2 安全模式生命周期
1、init
	当NN刚启动~加载fsimage+edites日志文件~内存中元数据构建成功~NN开始监听DN请求,此过程中,NN处于安全模式下,NN的文件系统对于client是只读的
2、run
	当DN启动~DN向NN发起内部通信,告知NN自己节点上DN真实块数据列表信息(安全模式下),NN收到各DN的块位置信息之后,开始运行文件系统
	--NN中的真实数据存放位置不是由NN维护的,而是以块的形式存储在各DN节点上
3、safe quit:(HDFS集群系统启动完成后,自动退出安全模式)
	满足‘最小副本条件’ 安全模式退出	
4.5.3 安全模式操作语法
(1) bin/hdfs dfsadmin -safemode get		(功能描述:查看安全模式状态)
(2) bin/hdfs dfsadmin -safemode enter  	(功能描述:进入安全模式状态)
(3) bin/hdfs dfsadmin -safemode leave	(功能描述:离开安全模式状态)
(4) bin/hdfs dfsadmin -safemode wait	(功能描述:等待安全模式状态)
4.5.4 案例
案例演示:
1、在/opt/module/hadoop-3.1.3/ 路径下创建脚本safemode.sh
	touch safemode.sh
2、编辑safemode.sh
 a. 打开脚本
	sudo vim safemode.sh    
 b. 编写内容是:当处于安全模式会进入等待状态(不然会直接不执行命令导致上传失败),并上传一个文件到HDFS系统
    #!/bin/bash
    hdfs dfsadmin -safemode wait
    hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /
3、给与safemode.sh执行权限
	chmod 777 safemode.sh
4、运行safemode.sh脚本
	./safemode.sh
5、重新打开一个xshell控制台,执行离开等待状态
	bin/hdfs dfsadmin -safemode leave
6、观察原窗口,查看原窗口hdfs的安全模式状态
	bin/hdfs dfsadmin -safemode get
	Safe mode is OFF
	safemode.sh中的上传代码执行,hdfs集群已有上传的数据
五、 DN工作机制(面试开发重点) 5.1 DataNode工作机制

DataNode的工作机制:
(1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
(2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
(3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器。
DataNode的作用:以块的形式,来存储真实数据,128M为切块单位
	切块之后的数据分为2部分:
		-- 数据本身(即文件中真实的数据)
		-- 元数据(对数据块的长度、校验和、时间戳等描述信息)
		
DataNode的存储位置: /opt/module/hadoop-3.1.3/data/data/current/BP-1901013597-192.168.202.103-1600767106029/current/finalized/subdir0/subdir0
	查看后可以发现:
		每个块分成两个前面同名但后缀名不同的文件
		不带后缀名的文件 就是 真实存储的数据
		带 .meta 后缀名的文件 就是 存储元数据的文件
5.2 数据完整性

思考:如果电脑磁盘里面存储的数据是控制高铁信号灯的红灯信号(1)和绿灯信号(0),但是存储该数据的磁盘坏了,一直显示是绿灯,是否很危险?同理DataNode节点上的数据损坏了,却没有发现,是否也很危险,那么如何解决呢?

如下是DataNode节点保证数据完整性的方法。
(1)当DataNode读取Block的时候,它会计算CheckSum。
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
(3)Client读取其他DataNode上的Block。
(4)DataNode在其文件创建后周期验证CheckSum。

校验码算法: crc (32位)、md5(128位) 、SHA1(160)、SHA256

5.3 掉线时限参数设置

心跳:DataNode会每隔3秒向NameNode响应一下,向NameNode证明还存活着。

如果DataNode发生故障造成DataNode无法与NameNode通信,此时,NameNode不会立刻把该节点判定为死亡,超过 “ 超市时长” (默认是10分钟 + 30秒)时,才会判定该节点已死亡。

超时时长的计算公式为:

超时时长 = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval

配置文件: hdfs-site.xml
添加内容如下  第一个是毫秒单,值为5分钟,第二个单位是秒,值为3秒
    
        dfs.namenode.heartbeat.recheck-interval
        300000
    
    
        dfs.heartbeat.interval
        3
    
5.4 服役新数据节点

注意:启动新节点,不需要去停止集群,也不要配置workers文件,当需要将新增节点也可群起群停时,要去将新增节点添加到workers文件中,并分发

添加新节点

1、在hadoop104主机上再克隆一台hadoop105主机
2、修改IP地址和主机名称
	vim /etc/sysconfig/network-scripts/ifcfg-ens33
		将 IPADDR=192.168.1.104 改成 192.168.1.105
	vim /etc/hostname
		将 hadoop104 改成 hadoop105
   补充:如果 /etc/hosts 文件下没有添加有192.168.1.105则还需要添加进去
3、删除hadoop105服务节点下hadoop的data和logs,并且删除/tmp的所有临时文件
	rm -rf /opt/module/hadoop-3.1.3/data  /opt/module/hadoop-3.1.3/logs
	sudo rm -rf /tmp/*
4、source配置文件
	source /etc/profile
5、在hadoop105上启动DataNode节点,直接关联到集群
	hdfs --daemon start datanode    --web端可以看到新增节点直接加入集群
6、	yarn --daemon start nodemanager
7、如果数据不均衡,可以用命令实现集群的再平衡
	sbin/start-balancer.sh

workers的作用:在启动整个模块时会根据workers中的地址去各节点的服务。

注意:workers不是决定谁是集群中的节点。

只要配置了免密登录,并且在配置文件里配置了NameNode地址,即可加入。

5.5 退役旧数据节点 5.5.1 添加白名单

白名单:在白名单的主机节点才能被允许访问NameNode。

配置白名单步骤:

a. 在NameNode(hadoop102)的/opt/module/hadoop-3.1.3/etc/hadoop目录下创建whitelist文件

vim /opt/module/hadoop-3.1.3/etc/hadoop/whitelist
添加以下内容(不添加hadoop105) -- 注意:不能有空格和空行
    hadoop102
    hadoop103
    hadoop104

b. 在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性(并重启NameNode)

    
        dfs.hosts
        /opt/module/hadoop-3.1.3/etc/hadoop/whitelist
    

c. 配置文件分发 — 有需求可分发

xsync hdfs-site.xml

注意:虽然修改集群上某一个节点的配置后其他节点也需要同步,但是白名单只要在NameNode所在的节点上即可生效,可以不用分发

d. 刷新 NameNode

hdfs dfsadmin -refreshNodes

e. 在 web 浏览器上查看

在hadoop102:9870上的DataNode上可以查看

5.5.2 黑名单退役

黑名单作用: 在黑名单上的主机都会被强制退出

配置黑名单步骤:

a. 在NameNode(hadoop102)的/opt/module/hadoop-3.1.3/etc/hadoop目录下创建blacklist文件

vim /opt/module/hadoop-3.1.3/etc/hadoop/blacklist
添加以下内容(不添加hadoop105) -- 注意:不能有空格和空行
    hadoop102
    hadoop103
    hadoop104

b. 在NameNode的hdfs-site.xml配置文件中增加dfs.hosts.exclude属性(并重启NameNode)

    
        dfs.hosts.exclude
        /opt/module/hadoop-3.1.3/etc/hadoop/blacklist
    

c. 配置文件分发 — 有需求可分发

xsync hdfs-site.xml

d. 刷新 NameNode

hdfs dfsadmin -refreshNodes

e. 在 web 浏览器上查看

在hadoop102:9870上的DataNode上可以查看

5.6 Datanode多目录配置 — 可略

1)DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本

2)具体配置如下

​ 打开配置文件 hdfs-site.xml

​ 配置内容如下


        dfs.datanode.data.dir
		file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/279977.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号