hadoop知识点整理

hadoop面试专题
一.HDFS
1.hdfs读流程

(1)客户端向namenode发送请求下载某个文件

(2)namenode收到后返回目标文件的元数据

(3)客户端解析元数据并向各个datanode发送请求读取对应的分块

(4)各个datanode向客户端传输数据

2.hdfs写流程

(1)客户端首先向namenode请求上传文件

(2)namenode检查目录树是否可以创建文件(检查权限以及目录是否存在),通过后响应可以上传文件

(3)客户端请求上传第一个Block(0-128m),请求返回存储所用的datanode

(4)namenode选择副本存储节点(优先级:1、本地节点;2、其他机架上的一个节点 3、2中其他机架上的另一个节点),返回dn1,dn2,dn3节点,表示采用这三个节点存储数据

(5)hdfs客户端通过fsdataoutputstream请求建立block传输通道

(6)dn1,dn2,dn3返回应答成功

(7)客户端传输数据packet

3.hdfs小文件处理

影响:

1、存储层面:一个文件块占用namenode150字节内存,一亿个小文件就是1亿*150字节

2、计算层面:每个小文件都会起到一个maptask,占用大量计算资源

怎么解决?

1、采用har归档方式,将小文件归档

2、采用combineTextInputFormat,将多个小文件组合成一个输入分片,减少namenode的负载和开销。

3、有小文件场景开启jvm重用,使得jvm实例在同一个job中重新使用N次,N的值可以在hadoop的mapred-site.xml文件中配置。

4.hdfs的namenode内存:

hadoop3.x系列,namenode内存是动态分配的。namenode内存最小值1G,每增加100万个block,增加1G内存

二、MapReduce
1.mapreduce过程

(1)分片、格式化数据源:

分片:将源文件划分为大小相等的小数据块(一般是128MB),hadoop会为每一个分片构建一个map任务,并由该任务运行自定义的map()函数,处理分片里的每一条记录,产生一系列新的kv对。

格式化操作:将划分好的分片格式化为<k,v>形式的数据,其中key代表偏移量,value代表每一行的内容

(2)执行maptask:

每个map任务都有一个内存缓冲区,缓冲区大小100mb,输入的分片数据经过map任务处理后的中间结果都会写入内存缓冲区中。如果写入的数据达到内存缓冲的阈值(80mb),会启动一个线程将内存中的溢出数据写入磁盘,同时不影响map中间结果继续写入缓冲区。

在溢写过程中,mapreduce框架会对key进行排序(归并或者快排),如果中间结果比较大,会形成多个溢写文件,最后的缓冲区数据也会全部溢写入磁盘形成一个溢写文件,如果是多个溢写文件,则最后合并所有的溢写文件为一个文件。

(3)shuffle过程

mr工作过程中,map阶段处理的数据如何传递给reduce,这个过程叫shuffle。

shuffle会将map task输出的处理结果数据分发给reducetask,并在分发的过程中,对数据按key进行分区和排序(归并排序)。

(4)执行reducetask:

输入reducetask中的数据流是<key,value list>形式,用户可以自定义reduce()方法进行逻辑处理,最终以<k,v>的形式输出。

(5)写入文件:

mr框架会自动把reduce task生成的<k,v>传入outputformat的write方法,实现文件的写入操作,写入到hdfs上。

2、mr优化/shuffle优化

map阶段:

1)增大环形缓冲区大小,由100m扩大到200m

2)增大环形缓冲区溢写的比例,由80%到90%

3)减少对溢写文件的merge次数(一次性merge多个文件)

4)不影响业务的前提下,采用combiner提前合并,减少io

reduce阶段:

1)合理设置map和reduce数

2)设置map和reduce共存

3)尽量规避使用reduce

4)增加每个reduce去map中拿数据的并行数

5)集群性能可以的情况下,增大Reduce端存储数据内存的大小

io传输

采用数据压缩的方式,减少网络IO的时间,安装snappy和lzop压缩编码器

压缩:

1)map输入端主要考虑数据量大小和切片,bzip2、lzo支持切片

2)map输出端主要考虑速度:snappy\lzo

3)reduce输出端主要看具体需求,作为下一个mr输入需要考虑切片;永久保存考虑压缩率比较大的gzip

三、Yarn

yarn主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成

1、工作机制:

1.客户端向RM提交一个job,同时指定提交到哪个队列和需要多少资源。用户可以通过每个计算引擎的对应参数设置,如果没用特别指定,则使用默认设置。

2.RM在收到任务提交的请求后,先根据资源和队列是否满足要求选择一个nodemanager,通知它启动一个特殊的container,称为MRApplicationMaster,后续流程由它发起。

3.MRApplicationMaster向ResourceManager注册后根据自己任务的需要,向ResourceManager申请container,包括数量、所需资源量、所在位置等因素。

4.如果队列有足够资源,RM会将container分配给有足够剩余资源的NM,由AM通知NM启动container。

5.container启动后执行具体的任务,处理分给自己的数据。nodemanager除了负责启动container,还负责监控它的资源使用状况以及是否失败退出等工作,如果container实际使用的内存超过申请时指定的内存,会将其杀死,保证其他container能正常运行。

6.各个container向AM汇报自己的进度,都完成后,AM向RM注销任务并退出,RM通知NM杀死对应的container,任务结束。

工作机制(详细版)

(0)Mr程序提交到客户端所在的节点。

(1)Yarnrunner向Resourcemanager申请一个Application。

(2)rm将该应用程序的资源路径返回给yarnrunner。

(3)该程序将运行所需资源提交到HDFS上。

(4)程序资源提交完毕后,申请运行mrAppMaster。

(5)RM将用户的请求初始化成一个task。

(6)其中一个NodeManager领取到task任务。

(7)该NodeManager创建容器Container,并产生MRAppmaster。

(8)Container从HDFS上拷贝资源到本地。

(9)MRAppmaster向RM 申请运行maptask资源。

(10)RM将运行maptask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建container。

(11)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动maptask,maptask对数据分区排序。

(12)MrAppMaster等待所有maptask运行完毕后,向RM申请container,运行reduce task。

(13)reduce task向maptask获取相应分区的数据。

(14)程序运行完毕后,MR会向RM申请注销自己。

2、yarn调度器

FIFO调度器:支持单队列、先进先出,生产环境不会用。

容量调度器:支持多队列。

​ 队列资源分配,优先选择资源占用率最低的队列分配资源;

​ 作业资源分配:按照作业的优先级和提交时间顺序分配资源;

​ 容器资源分配:本地原则(同一节点/同一机架/不同节点不同机架)

公平调度器:支持多队列,保证每个任务公平享有队列资源。资源不够时可以按照缺额分配。

(性能OK,选择公平调度器。资源不充裕,选择容量调度器。)

四、hadoop宕机

1)如果MR造成系统宕机,此时要控制yarn同时运行的任务数,和每个任务的最大内存。

2)如果写入文件过块造成Namenode宕机,调高kafka存储大小,控制从kafka到hdfs的写入速度。

五、Hadoop解决数据倾斜方法
1)提前在map进行combine,减少数据传输量

相当于提前reduce,把一个Mapper中相同的key进行聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。(如果导致数据倾斜的key大量分布在不同的mapper的时候,这种方法就不是很有效了)

2)导致数据倾斜的key大量分布在不同的mapper

(1)两次mr,局部聚合加全局聚合

第一次在map阶段对那些导致了数据倾斜的key加上1到n的随机前缀,这样本来相同的key也会被分到多个reducer中进行局部聚合,数量就会大大降低。

第二次mapreduce,去掉key的随机前缀,进行全局聚合。

思想:二次mr,第一次将key随机散列到不同reducer进行处理达到负载均衡目的。第 二次再根据去掉key的随机前缀,按原key进行reduce处理。

(2)增加reducer,提升并行度

(3)实现自定义分区

根据数据分布情况,自定义散列函数,将key均匀分配到不同reducer。

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值