Hadoop总结

一 、大数据的公认6V
1.数据体量大
2.数据种类样式多
3.数据的增长速度越来越快
4.数据的价值密度低
5.数据的真实性
6.数据的连通性
7.数据的动态性,可视化以及合法性
二 、hadoop的概述
Hadoop是Apache提供的一套开源的、可靠的、可扩展(伸缩)的分布式存储和计算的框架
2.Hadoop的模块
1)Hadoop Common:基本模块,用于支持其他模块
2)Hadoop Distributed Filesytem:分布式存储框架
3)Hadoop Yarn:任务调度和集群资源管理
4)Hadoop MapReduce:分布式计算
5)Hadoop Ozone:对象存储
6)Hadoop submarine:机器学习引擎
三 、 HDFS
HDFS是Hadoop中用于进行数据分布式存储的模块
1.HDFS中,存储数据的时候会对数据进行切块,每一个块称之为Block。
2.HDFS中,主要包含2个进程:NameNode和DataNode
1)NameNode用于管理节点和记录元数据
2)DataNode用于存储数据
3.HDFS自动对数据进行备份,称为副本(replication),不指定,副本数量默认为3(原始一份,复制两次)
4.HDFS仿照Linux设计了一套文件存储系统
四、Block
1.在HDFS中,数据都是以Block为单位进行存储的
2.默认情况下,Block的大小是128M,通过dfs.blocksize来调节大小.
3.一个文件不足Block大小,将其作为一个整体存储,Block和文件大小一致
4.每一个Block都会有一个编号,称之为BlockID.
5.同一个Block的不同副本一定是在不同节点上,但是不同的Block副本可能在一个节点上
6.Block的意义:
1)为了能够存储超大文件
2)为了进行快速备份

NameNode

1.NameNode是HDFS的核心节点,用于管理DataNode以及存储元数据
2.元数据主要包含:
a:文件的存储路径
b:文件权限
c:文件的大小以及块的大小
d:BlockID
e:Block的存储节点
f:副本数量
3.NameNode会将元数据存储在内存以及磁盘中
a:存储在内存中的目的是为了快速查询
b:存储在磁盘中的目的是为了崩溃恢复
4.元数据的存储路径由Hadooptmp.dir来决定。
5.元数据的存储文件:
a:edits:记录写操作的文件
b:fsimage:映像文件。记录元数据,但是这个文件中的元数据和内存中的元数据并不是同步的,fsimage中的元数据往往是落后于内存中的元数据的
6.NameNode在接收到写操作的时候,先将这个操作记录到edits—inprogress文件中,如果记录成功。更改内存中的元数据,内存重点额元数据更改成功之后会给客户端返回成功信号。设计的目的是为了保证操作的可靠性。记录成功,就一定执行。

从edits中获取操作记录,和更改后的元数据比较。如果没执行,则重新执行
7.当fsimage进行更新的时候,从edits取出记录重新到fsimage中执行。此时edits—inprogress文件会滚动edits文件,同时生成一个新的edits—inprogress用于记录新的操作
8.fsimage更新/edits滚动的触发条件:
a:空间:当edits文件达到指定大小(默认64M。可以通过fs.checkpoint.size—core-site.xml来调节),会触发edits文件的滚动
b:时间:当距上一次滚动间隔指定时间(默认3600s,可以通过fs.checkpoint.period来调节),会触发edits文件的滚动
c:重启:当NameNode重启的时候,会触发edits的滚动
d:强制:通过hadoop dfsadmin -rollEdits命令来强制edits文件的滚动.
9.DataNode会通过心跳机制来向NameNode注册管理-DataNode会定时发送心跳信息给NameNode
10.DataNode会每隔3s给NameNode发送一次心跳,心跳是通过RPC机制发送的
11.心跳信息
a:当前DataNode中的Block信息
b:当前DataNode的状态(预服役、服役、预退役)
12.NameNode如果在10min没有收到DataNode的心跳,则认为这个DataNode已经lost,会将这个节点的数据备份到其他节点上保证整个集群中的副本数量
13.NameNode重新启动后,进行fsimage文件的更新和edits文件的滚动,将fsimage文件中的内容加载到内存中,等待DataNode的心跳,指定时间内没等到心跳,认为该DataNode已经丢失需要对应的处理;等到心跳,NameNode对DataNode的数据进行校验,校验DataNode中的数据和元数据的记录是否一致,校验失败,试图恢复这个数据,该过程称之为安全模式(safe mode)。恢复之后,再次校验。成功,会退出安全模式并对外提供服务。失败,再次重新恢复,重新校验。
14.在安全模式中,HDFS集群对外只提供读服务
15.也正因为有安全模式的校验问题,所以要求副本数量不能多于节点数量
16.如果在合理的时间内,集群没有自动退出安全模式,那么久可能产生了数据丢失并且这个数据不可恢复。
17.强制退出安全模式:hadoop dfsadmin -safemode leave

DataNode

1.存储Block
2.DataNode会给NameNode发送心跳
3.存储Block的路径也是由hadoop.tmp.dir属性来决定的

HDFS流程

一、读取流程(下载)
1.客户端发起RPC请求到NameNode
2.NameNode收到请求后会校验这个文件是否存在
3.如果文件存在,NameNode给客户端一个信号
4.客户端就会向NameNode要第一个Block的地址
5.NameNode在收到请求后读取元数据,然后将第一个Block的地址放入队列中返回给客户端
6.客户端收到队列之后从中选择一个较(拓扑结构)的节点来读取第一个Block,读取完成后,会对这个Block进行checksum的验证;如果校验失败,客户端会给NameNode一个信号然后重新选取地址,重新读取;校验成功,客户端会向NameNode要第二个Block的地址,重复4,5,6的过程
7.客户端读取完成所有的Block之后,会给NameNode一个结束信号.NameNode在接收到信号之后会关闭文件.

二、写入流程(上传)
1.客户端发起RPC请求到NameNode
2.NameNode在接收到请求后会进行校验
a:校验指定路径是否存在
b:校验写入路径是否有权限
c:校验指定路径中是否有同名文件
3.如果校验失败,则抛出异常;校验成功,记录元数据,NameNode会给客户端一个信号。
4.客户端再收到信号后会向NameNode要第一个Block的存储位置
5.NameNode在收到请求后,会等待DataNode的心跳,选取DataNode的地址放入队列中返回给客户端。默认情况下,NameNode会选取3个地址
6.客户端收到队列中取出3个地址,从这些地地址中选择一个较近(拓扑距离短)的节点写入第一个Block的第一个副本。
7.第一个副本所在的节点会通过pipeline(管道,实际上就是NIO中的Channel)将第二个副本写到其他节点上,第二个副本所在的节点再写第三个副本
8.写完之后,第三个副本所在的节点会给第二个副本所在的节点返回ack,第二个副本所在的节点收到ack之后会给第一个副本所在的节点返回ack,第一个副本所在的节点再给客户端返回ack。
9.写完第一个Block之后,客户端会给NameNode要第二个Block的存储位置,然后重复5,6,7,8过程
10.当写完所有的Block之后,客户端会给NameNode一个结束信号,NameNode就会关闭文件/关流,文件关闭之后,这个文件就不可修改.

三、删除流程
1.客户端发起RPC请求到NameNode
2.NameNode在收到请求之后,会将这个请求记录到edits文件中,然后更新内存中的元数据,内存更新成功之后会给客户端返回一个ack信号,此时这个文件对应的Block依然存储在DataNode中。
3.在NameNode收到DataNode的心跳的时候,NameNode就会检查Block信息,会给DataNode进行心跳响应,要求删除对应的Block.DataNode在收到心跳响应之后才会真正删除Block.

MapReduce

MapReduce是Hadoop提供的一套用于进行分布式计算的框架.将计算过程拆分为2个阶段:Map(映射)阶段和Reduce(规约)阶段.

一、数据本地化的策略
1.当JobTracker收到MR程序的时候,会访问NameNode获取文件信息。文件信息包含文件大小以及块信息
2.JobTracker对这个文件进行切片处理。注意:切片是逻辑切分不是物理切分。切片的数量决定了MapTask的数量。默认情况下,Split和Block是等大的。
3.JobTracker会将划分出来的MapTask分配到TaskTracker上执行
4.因为MapTask在执行过程中需要读取数据,而数据在DataNode上,所以将DataNode和TaskTracker部署在相同的节点上以减少跨集群的网络传输.
5.为了减少网络资源的消耗,在分配任务的时候会考虑Block的位置.哪个节点上有要处理的数据,将任务分配给哪个节点,这个过程称之为数据本地化.
6.切片产生过程:
a:如果文件为空,则将整个文件作为一个切片处理
b:在MapReduce中,文件要区分可切或者不可切,例如,绝大部分压缩文件就是不可切的.
c:如果文件不可切,则将整个文件作为一个切片处理
d:如果需要减小splitsize,需要调小maxsize;如果需要调大splitsize,需要调大minsize
e:在计算切片的时候,需要考虑切片的阈值 - SPLIT_SLOP=1.1

MapReduce执行流程
1.准备阶段
a:检查输入和输出路径
b:计算切片数量
c:如果有必要,设置缓存存根
d:将jar包和配置上传到HDFS上
e:将任务提交给JobTracker,并且可以选择是否监控这个任务
2.执行阶段
a:JobTracker接收到Job任务之后,会将这个任务进行拆分,拆分为MapTask和ReduceTask。MapTask的数量由切片数量决定;ReduceTask的数量由分区数量决定
b:JobTracker在拆分完任务之后,会等待TaskTracker的心跳,然后给TaskTracker分配任务。分配任务的时候,MapTask尽量满足数据本地化的策略,ReduceTask无法满足数据本地化,所以ReduceTask在分配的时候是考虑节点的空闲。
c:TaskTracker通过心跳领取任务,领取到任务之后,回去对应的节点上下载jar包,这一步体现的思想是逻辑移动数据固定
d:TaskTracker会在本节点上开启JVM子进程执行MapTask或者ReduceTask。注意:每一个MapTask或者ReduceTask的执行都会开启一次JVM子进程。

Shuffle

一、Map端的shuffle
1.map方法在处理完成数据之后会将结果写出到MapTask自带的缓冲区中-每一个MapTask自带一个缓冲区-MapOutputCollector
2.数据在缓冲区中进行分区、排序,如果指定了Combiner,那么数据在缓冲区中还会进行combine。注意:在缓冲区中的排序是将无序的数据整理成有序数据,采取的失快速排序。
3.缓冲区是维系在内存中的,默认是100M
4.当缓冲区的使用达到一定限度(溢写阈值:0.8)的时候,会将缓冲区的数据溢写(spill)到磁盘上,map方法后续产生的结果会继续写到缓冲区中
5.每一次溢写都会产生一个新的溢写文件-单个溢写文件中的数据是分区切有序的,所有的溢写文件之间是局部有序的
6.在map方法完成之后,将所有的溢写文件进行合并(merge),将所有的溢写文件合并成一个结果文件(final out),在merge过程中,数据会再次进行分区排序-final out是整体分区且有序的。merge过程中的排序是将局部有序变成整体有序,所以采用的是归并排序。
7.如果map方法执行完成之后,缓冲区中依然有数据,则会直接合并到最后的final out中
8.在merge过程中,如果spill文件个数>=3并且指定了Combiner,则在merge的时候回再次进行一次combine
9.注意问题:
a:spill过程不一定产生
b:默认情况下,溢写文件的大小不一定是80M,考虑序列化因素
c:缓冲区本质上是一个环形的字节数组,设置为环形的目的是为了避免寻址,能够重复利用缓冲区
d:阈值的作用是为了减少写入的阻塞

二、Reduce端的shuffle
1.ReduceTask启动多个fetch线程去MapTask处抓取对应分区的数据
2.ReduceTask将从每一个MapTask上抓取过来的数据存储在一个本地文件中
3.将抓取来数据进行一个merge,合并成一个大文件,在merge过程中,会再次进行排序,采用的是归并排序
4.merge完成之后,ReduceTask会再将相同的键对应的值放到一个迭代器中,这个过程称之为分组(group)
5.分组完成之后,每一个键对应一个迭代器,每一个键调用一次reduce方法
6.注意问题
a:ReduceTask的启动阈值:0.05-当5%的MapTask结束,就会启动ReduceTask区抓取数据
b:fetch线程通过HTTP请求获取数据
c:fetch线程的数量默认为5
d:merge因子:10 -每10个小文件合并成一个大文件.

三、shuffle的调优
1.减少溢写次数:
a:增大缓冲区,实际过程中缓冲区的大小一般是在250~400M之间
b:增大缓冲区阈值,同时增加了写入阻塞的风险 -不建议
c:增加Combine(合并)的过程
2.可以考虑将Map的结果文件进行压缩,这个方案是在网络资源和CPU资源之间的额取舍
3.增加fetch线程的数量
4.增大merge因子,会增加底层计算的复杂度 -不建议
5.减小ReduceTask的启动阈值,增加了ReduceTask的阻塞风险 -不建议

MapReduce中小文件的危害
1.存储:大量小文件会产生大量的元数据,就导致内存被大量占用
2.计算:大量小文件就产生大量的切片,以为着有大量的MapTask。会导致服务器的执行效率变低甚至会导致服务器崩溃
处理手段:合并和压缩
Hadoop提供了一种原生的合并手段:Hadoop Archive,将多个小文件打成一个har包

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值