HADOOP小问题总结与答案

Hadoop的checkpoint流程

在hdfs-site.xml文件指定Secondary NameNode部署在哪个机器上。

当记录条数超过100w条,或者时间超过3600s(1小时),

Secondary NameNode提醒NameNode做 Checkpoint。

步骤如下:

Secondary NameNode提醒NameNode开始做Checkpoint;

NameNode上的edit_inprogress文件滚动生成edit_sum文件;

edit_inprogress滚动生成edit文件,将滚动前的编辑日志edit和镜像文件fsimage拷贝到Secondary NameNode;

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

生成新的镜像文件fsimage.chkpoint,拷贝fsimage.chkpoint到NameNode,NameNode将 fsimage.chkpoint重新命名成fsimage。

Hadoop为什么要分块存储

减少磁盘寻道的时间。

Hadoop小文件处理问题

小文件导致的问题

小文件过多会占用namenode的内存与磁盘,如果同时大量访问小文件,会需要不断的从一个datanode跳到另一个datanode,严重影响性能。处理大量小文件速度远远小于处理同等大小的大文件的速度。每一个小文件要占用一个slot,而 task启动将耗费大量时间甚至大部分时间都耗费在启动task和释放task上。

解决方案
HAR归档

对某个目录/foo/zz下的所有小文件存档成/out/ zz.har:

hadoop archive -archiveName zz.har -p /foo/bar /out

使用HAR时需要两点

第一,对小文件进行存档后,原文件并不会自动被删除,需要用户自己删除;

第二,创建HAR文件的过程实际上是在运行一个mapreduce作业,因而需要有一个hadoop集群运行此命 令。

此外,HAR还有一些缺陷:

第一,一旦创建,Archives便不可改变。要增加或移除里面的文件,必须重新创建归档文件。

第二,要归档的文件名中不能有空格,否则会抛出异常,可以将空格用其他符号替换(使用Dhar.space.replacement.enable=true 和-Dhar.space.replacement参数)。

第三,存档文件不支持压缩。

CombineFileInputFormat
Sequence file

Hadoop的优缺点

优点:高可用(多副本) 高扩展(大数据量)  高性能(并行计算) 高容错(任务重新分配)

缺点:不适用于低延迟数据访问,不能高效存储大量小文件,不支持多用户写入并任意修改文件

HDFS文件写入和读取流程

文件写入

客户端通过 FileSystem模块向NameNode请求上传文件,

NameNode检查目标文件是否已 存在,父目录是否存在。

NameNode返回是否可以上传。

客户端请求第一个 block上传到哪几个datanode服务器上。

NameNode返回3个datanode节点,分别为dn1、dn2、dn3。

客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用 dn3,将这个通信管道建立完成。

dn1、dn2、dn3逐级应答客户端。

客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位, dn1收到一个packet就会传给dn2,dn2传给dn3;

dn1每传一个packet会放入一个应答队列等待应答。

当一个block传输完成之后,客户端再次请求NameNode上传第二个block的服务器。

(重复执行3-7 步)。

HDFS的文件结构?

HDFS metadata以树状结构存储整个HDFS上的文件和目录,以及相应的权限、配额和副本因子 

block设置

太小 文件,查找文件增加寻址时间

文件太大,增加网络传输时间

block大小与网络传输大小相近

HDFS跨节点进行数据迁移

DistCp 

本质是mr任务,map任务

可以设置并行度,设置带宽,-overwrite 参数,一致性检验参数(可跳过减少时间),设置权限参数

,文件增量同步 使用-append参数 新增数据追加

hadoop distcp hdfs://nn1:8020/data hdfs://nn2:8020/  

同版本集群拷贝(或者协议兼容版本之间的拷贝)

使用HDFS协议 1 2

hadoop distcp hdfs://node:3333/user/src/dir

hdfs://namenode:4444/user/dst/dir

不同版本集群拷贝(比如1.x到2.x)使用http协议或者webhdfs协议,

都是使用hdfs的HTTP端口 

hadoop distcp hftp://node:80/user/src/dir hftp://namenode:80/user/dst/dir

hadoop distcp webhdfs://node:80/user/src/dir webhdfs://namenode:80/user/dst/dir

HDFS的数据一致性靠什么保证?

1、hdfs的namenode机制

2、心跳机制

3、安全模式

4、回滚机制 (HDFS写入数据失败 进行回滚)、

5、安全校验

6、回收站

DATENODE工作机制与数据存储

负责 数据存储

机制

1.数据文件有两种,一种文件本身,另一种元数据的文件信息,数据长度,块数据校验值,时间戳

2.心跳机制,每三秒向namenode发送信息,如果10分钟之内,namenode没有收到信息,n那么namenode 就会认为当前datenode已挂,还有会周期性向namenode,报告本机器所有块信息

3.可扩展,自由伸缩

4.校验数据完整性,如果checknum与初创是数据不一致,说明损坏

HDFS写流程中如果DataNode突然宕机了怎么办?

向namenode 报告,将宕机的datenode,做下线处理,获取数据正常进行,namenode

发送宕机节点数据副本节点再次传输

Map、Reduce任务执行过程

map
每个输入分片一个hdfs块会让一个map任务来处理map处理结束, 传输进环形缓冲区,环形缓冲区100m(大小可调整),数据进入会进行排序,数据达到环形缓冲区阈值80%(可调整),会溢出文件到本地磁盘,在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,使用hash进行分区排序,如果程序有Combiner操作,将排序好的结果在进行操作。最后可能产生小文件,将进行合并排序最后合并成了一个已分区且已排序的文件,结束后可以设置mapout文件是否压缩以减少数据传输时间。
ruduce
Reduce任务拖取某个Map对应的数据,如果在内存中能放得下这次数据的话就直接把数据写到内存中。 Reduce要向每个Map去拖取数据,在内存中每个Map对应一块数据,当内存中存储的Map数据占用空间 达到一定程度的时候,开始启动内存中merge,把内存中的数据merge输出到磁盘上一个文件中。

环形缓冲区 写的时候顺序写,读的时候顺序读,高效运用内存

MapReduce计算模型一般包括两个重要的阶段:
Map是映射,负责数据的过滤分发;
Reduce是规约,负责数据的计算归并。

Reduce的数据来源于Map,Map的输出即是Reduce的输入,
Reduce需要通过Shuffle 来获取数据。
从Map输出到Reduce输入的整个过程可以广义地称为Shuffle
Shuffle 横跨Map端和Reduce端,
在Map端 包括Spill过程,
在Reduce端包括copy和sort过程。

MapReduce的Shuffle 过程及其优化

Shuffle 混洗 ,有一定规则的数据打乱混洗,MR的shfuffle,相当于反推洗牌,无规则的洗成有一定规则的数据
在Map端 包括Spill过程,在Reduce端包括copy和sort过程
Spill  
Spill过程包括输出、排序、溢写、合并等步骤

 sort过程 先把Kvbuffer中的数据按照partition值和key两个关键字升序排序,移动的只是索引数据,排序结果是 Kvmeta中数据按照partition为单位聚集在一起,同一partition内的按照key有序。
(它会将处理的结果暂时放在环形缓冲区中,当环形缓冲区使用率达到一定阈值后,再对 缓冲区中的数据进行一次快速排序)
并将这些有序数据溢写到磁盘上,而当数据处理完毕后,它会对磁 盘上所有文件进行归并排序。
Reduce
1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一 定阈值,则写到磁盘上,否则直接放到内存中。
2)Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合 并,以防止内存使用过多或磁盘上文件过多。
3)Sort阶段:按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了 将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理 结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。
4)Reduce阶段:reduce()函数将计算结果写到HDFS上。 在ReduceTask的Shuffle 阶段,会获取到比较器,将从Map获取到的数据中key相同的分为同一组

对于ReduceTask,它从每个MapTask上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写 磁盘上,否则存储在内存中,如果磁盘上文件数目达到一定阈值,则进行一次归并排序以生成一个更大 文件;如果内存中文件大小或者数目超过一定阈值,则进行一次合并后将数据溢写到磁盘上。当所有数 据拷贝完毕后,ReduceTask统一对内存和磁盘上的所有数据进行一次归并排序。

Reduce拖取拉取Map数据。

1、任务切分:2、输入对象:3、map()方法:4、map()的输出:5、KV分区:6、区内排序:7、溢出:8、归并、区内排序9、局部聚合: 1 0、写入本地磁盘,拉取数据, 归并排序 ,分组,聚合,输出。

默认的分区机制 默认分区是根据key的hashCode对ReduceTask个数取模得到的。用户没法控制哪个  key存储到哪个分区。

结合wordcount述说MapReduce,具体各个流程,map怎么做,reduce怎 么做

 具体各个阶段做了什么
spliting :Documents会根据切割规则被切成若干块,
map阶段:然后进行Map过程,Map会并行读取文本,对读取的单词进行单词分割,并且每个词以键值 对形式生成。 1 2 3 例如:读取到”Hello World Hello Java“,分割单词形成Map
combine阶段:接下来Combine(该阶段是可以选择的,Combine其实也是一种reduce)会对每个片相同 的词进行统计。
Shuffle 阶段:将Map输出作为reduce的输入的过程就是shuꢀ le,次阶段是最耗时间,也是重点需要优化的阶 段。Shuffle 阶段会对数据进行拉取,对最后得到单词进行统计,每个单词的位置会根据Hash来确定所在 的位置,
reduce阶段:对数据做最后的汇总,最后结果是存储在hdfs上。

Hadoop数据倾斜问题怎么解决
 

原因
1.某一些,或者一部分数据的key的分化严重不均  countdistinct、group by、join等操作,触发了Shuffle动作
2.业务数据自带的特性;
3.HQL 语句写的有误

针对业务数据方面解决办法
1.找到异常数据。清洗
2.对分布不均匀的数据,进行单独计算,首先对key做一层hash,把数据打散,让它的并行度变 大,之后进行汇集

针对hadoop平台的优化解决办法
1. map join   ,可以将小表放在前面,这样能够触发reduce段减少操作次数,从而减少运行时间
2.优化小表,可以将小表缓存到内存,
开启map-side join的设置属性:set hive.auto.convert.join=true(默认是false)
还可以对使用这个优化的小表的大小进行设置:set hive.mapjoin.smalltable.filesize=25000000(默认值25M)
3.可以设定每个reduce,能够处理的数据量set hive.exec.reducers.bytes.per.reducer = 1000000000 默认1G
4.skewjoin  (INNER JOIN 生效) 添加一个Map Join用于处理Skew Key  ,大表关联大表可以设置,(先找清楚数据倾斜的key在那个大表中,将倾斜的大表放在前面方可生效),可以设置多大的key 才生效hive.skewjoin.mapjoin.map.tasks
5. group by 造成的数据倾斜

hive.map.aggr=true (默认true) 这个配置项代表是否在map端进行聚合,相当于Combiner hive.groupby.skewindata
6.去重使用group by

YARN

作为一个资源管理、任务调度的框架,主要包含ResourceManager、NodeManager、 ApplicationMaster和Container模块。

任务执行流程
)MapReduce程序提交到客户端所在的节点。
)YarnRunner向ResourceManager申请一个Application。
)RM 将该应用程序的资源路径以及application_id返回给YarnRunner。
)该程序将运行所需资源提交到 HDFS 上。
)程序资源提交完毕后,申请运行 mrAppMaster。
)RM 将用户的请求初始化成一个 Task。
)其中一个NodeManager 领取到 Task 任务。
)该 NodeManager 创建容器 Container,并产生 MRAppmaster。
)Container 从HDFS 上拷贝资源到本地。 
)MRAppmaster 向RM 申请运行 MapTask 资源。
)RM 将运行 MapTask 任务分配给另外两个 NodeManager,另两个 NodeManager 分别领取任务并创建 容器。
)MR 向两个接收到任务的NodeManager 发送程序启动脚本,这两个 NodeManager分别启动 MapTask,MapTask 对数据分区排序。
)MrAppMaster 等待所有 MapTask 运行完毕后,向 RM 申请容器,运行 ReduceTask。
)ReduceTask 向 MapTask 获取相应分区的数据。
)程序运行完毕后,MR 会向 RM 申请注销自己。

YARN容错机制  
资源不足会任务挂起,可设置
重试次数可设置

容量调度器 与 公平调度器 异同


与容量调度器相同点 多队列:支持多队列多作业 容量保证:管理员可为每个队列设置资源最低保证和资源使用上线 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新 的应用程序中提交,则其它队列借调的资源会归还给该队列 多用户:支持多用户共享集群和多应用程序同事运行;为了防止同一用户的作业独占队列总的资 源,该调度器会对同一用户提交的作业所占资源进行限定 与容量调度器不同点 核心调度策略不同 容量调度器:优先选择资源利用率低的队列 公平调度器:有限选择对资源的缺额比例大的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值