HDFS分布式存储文件系统

1.1、HDFS架构

在这里插入图片描述
HDFS 采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。

  • 一个HDFS集群是由一个NameNode和一定数目的DataNode组成的。
  • NameNode是一个中心服务器,负责管理文件系统的名字空间 (Namespace )及客户端对文件的访问。
  • 集群中的DataNode一般是一个节点运行一个DataNode进程,负责管理它所在节点上的存储。

1.2、写数据流程

在这里插入图片描述

①客户端向namenode说:我要上传文件,namenode检查文件是否已存在,目录是否已存在,之后向客户端回复:是否可以上传
②客户端向namenode请求说:我要上传第一个bolck,到哪几台datanode上呢?
③namenode向客户端返回3个datanode节点说:你可以传到这三个节点上
④客户端向datanode1请求上传,dn1收到请求确认可以上传,同时调用dn2,dn2调用dn3,通信管道建立。
⑤客户端以packet为单位上传block1(先从磁盘读取到本地内存缓存中),dn1收到第一个packet就会传给dn2,dn2传给dn3
***第二个block重复以上步骤

1.3、读数据流程

  • 读取场景:客户端从hdfs上下载一个大小为200M的资源
    在这里插入图片描述
①客户端向namenode请求:我要下载文件;
②namenode查询元数据找到文件块所在datanode地址;
③挑选一台datanode(就近原则,然后随机),请求数据;
③分别读取datanode1的block1和datanode2的block2的文件到客户端

1.4、Hadoop优化包含哪些方面,如何优化?

(1)优化方式

压缩、小文件、集群优化

(2)压缩优化

一般压缩方式为Snappy,特点是速度快,缺点是无法切分
可以回答在链式MR中,reduce1端输出使用bzip2压缩,方便以后的map任务对数据进行split

(3)小文件优化

  • 小文件产生原因
1、动态分区插入数据,产生大量的小文件,从而导致map数量剧增;
2、reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的);
3、数据源本身就包含大量的小文件。
  • 小文件弊端
影响NameNode的寿命,因为文件元数据存储在NameNode的内存中;
影响计算引擎的任务数量,因为每个小文件都会生成一个Map任务;
  • 小文件解决方式
1、采用har归档方式,将小文件归档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wDf5oqQ4-1627810201589)(C:/Users/%E6%9D%8E%E6%B5%B7%E4%BC%9F/AppData/Local/YNote/data/lhw18434365386@163.com/f2852aa7e9a441d88b7f49ac12ac8f04/clipboard.png)]

2、在Map执行前合并小文件,减少Map数
	:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。
3、合并输出小文件
SET hive.merge.mapfiles = true; -- 默认true,在map-only任务结束时合并小文件
SET hive.merge.mapredfiles = true; -- 默认false,在map-reduce任务结束时合并小文件
SET hive.merge.size.per.task = 268435456; -- 默认256M
SET hive.merge.smallfiles.avgsize = 16777216; -- 当输出文件的平均大小小于16m该值时,启动一个独立的map-reduce任务进行文件merge
4、开启JVM重用:大量小文件的job,开启JVM重用会减少运行时间。
***JVM重用理解:一个map运行一个JVM,重用的含义 JVM重用可以使得JVM实例在同一个job中重新使用N次。
***功能的缺点是,开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡的”job中有某几个reduce task执行的时间要比其他Reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。

(4)集群优化

整体	
	1、增加maptask的内存,默认为1G,可增加至4G;
	2、增加Reduce的内存,默认为1G,可增加至4G;
	3、增加maptask/reducetask的CPU的核数;
	4、增加每个container的CPU核数和内存大小;
	5、调整每个Map task和Reducetask的最大重试次数;

map阶段
	1、增大环形缓冲区大小。由100M扩大到200M
	2、增大环形缓冲区已溢写的比例。由80%扩大到90%
	3、减少对一些文件的merge次数。
	4、不影响实际业务的前提下,采用combiner提起合并,减少IO
Reduce阶段
	1、合理设计Map和Reduce数:两个都不能设置太少,也不能设置太多。
		:太少会导致Task等待,延长处理时间;
		:太多会导致Map和Reduce之间进行竞争资源,造成处理时间超时;
	
	2、设置map,reduce共存:调整slowstart.compelementmaps参数
		:使map运行到一定程度后,reduce也开始运行,减少reduce的等待时间;
		
	3、增加每个reduce去Map中拿数据的并行数;
	
	4、规避使用Reduce,因为reduce会产生大量的IO传输;
IO传输
	1、采用数据压缩方式(snappy和LZOP压缩器),减少IO的时间
	2、使用SequenceFile二进制文件;

切片机制
	1、简单地按照文件的内容长度进行切片;
	2、切片大小默认等于Block大小;
	3、切片时不考虑数据整体,而是诸葛针对每一个文件进行单独切片;

1.5、LZO压缩的理解

  • LZO压缩:致力于解压速度的一种数据压缩算法;
    • lzo压缩文件会比gzip压缩文件稍大,但是压缩速度是gzip的5倍,解压速度相当于gzip的两倍;
1、压缩需要64kb内存,解压不需要内存;
2、算法是线程安全,无损的;
3、允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低;
4、Hadoop默认不支持LZO压缩,如需支持LZO压缩,需要添加jar包,并进行相关配置

1.6、secondary namenode工作机制

(1)帮助namenode合并编辑日志,减少namenode启动时间;
(2)保存了一份和namenode一致的镜像文件和编辑日志;
(3)在主namenode发生故障时,可以从secondarynode恢复。

1.7、HDFS基础面试题

(1)block默认保存**(3)**份;

(2)HDFS默认block是**(128M)**;

(3)客户端上传文件正确的是:

①client端将文件切分为Block,依次上传;

②client只上传数据到一台datanode,然后由namenode负责block复制工作。

(4)负责存储HDFS数据的**(datanode);**

1.8、RPC协议

RPC协议是什么?
	:RPC协议是HDFS中节点之间的通信协议,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

RPC协议如何实现?
	:通过java的序列化和反序列化来实现的,因为不同节点的信息主要保存在java对象里面,序列化就是将java文件转化成字节的形式通过保存下来,然后通过网络发送到另一台机器上

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随缘清风殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值