Hadoop简介

Hadoop是Apache的顶级项目是一个可靠的、可扩展的、支持分布式计算的开源项目。

历史

创始人是:Doug Cutting 和Mike
Hadoop中的HDFS源于2003年Google发表的论文:《Google File System》
Hadoop中的MapReduce源于2003年Google发表的另一篇论文:《Google mapReduce》

Hadoop的模块

1.Hadoop Common:基本模块
2.Hadoop Distributed File System:HDFS–数据的分布式存储
3.Hadoop YARN:进行任务调度和节点资源管理
4.Hadoop MapReduce:基于Yarn对海量数据进行并行处理
5.Hadoop Ozone:基于HDFS进行对象的存储

HDFS

内容要点:

HDFS存储较大文件的时候会对文件进行切块
1.存储数据的节点–DataNode,管理数据的节点–namenode
2.HDFS存储数据的时候会将文件进行切块,并且给每一个文件块分配一个递增的编号
3.HDFS存储数据的时候会对数据进行备份,每一个备份称之为是一个复本。在伪分布式下,复本是指为1,在全分布式下,复本默认为3个
4.3个复本是放到不同的DataNode中,复本的放置策略是机架感知策略:
a.第一个复本:客户端连接的是哪个DataNode,复本就放到哪个DataNode上
b.第二个复本:要放到另一个机架的DataNode上
c.第三个复本:放到和第二个复本同机架的另一个DataNode上
d.如果有更多的复本数量,其他的复本随机放到其他的DataNode上
5.如果某一个DataNode宕机,那么这个时候namenode机会将这个DataNode上所存放的复本进行复制,保证整个HDFS中有指定的复本数量
6.namenode需要管理DataNode,namenode中存储管理信息即元数据-metadata
a.记录文件存储位置
b.记录文件切的块数
c.文件存储的DataNode地址
7.DataNode主动向namenode发送心跳,保持namenode对DataNode的管理。心跳信息包含:a.节点状态 b.节点存储的数据
8.如果超过10min中,namenode没有收到DataNode的心跳,那么就认为这个DataNode已经lost,那么namenode就会将这个lost的DataNode中的数据进行备份

HDFS的优点

1.支持超大文件:将文件进行切块分别放到不同的节点上
2.检测和快速应对硬件故障:心跳机制
3.流式数据访问
4.简化的一致性模型:只要一个文件块写好,那么这个文件块就不允许在进行改动,只能读取
5.高容错性:读复本
6.可构建在廉价机器上:HDFS具有较好的扩展性

HDFS的缺点

1.高延迟数据访问:不适合于交互式,也就意味着hadoop不适合做实时分析,而是做离线分析
2.大量的小文件:文件的存储要经过namenode,namenode中要记录元数据,元数据是存储在内存中,大量的小文件会产生大量的元数据,导致内存被大量占用,降低namenode的处理效率
3.多用户写入文件、修改文件:在hadoop2.0版本中 ,不支持修改,但是支持追加
4.不支持超强的事务

HDFS中的细节

Block

HDFS在存储数据的时候是将数据进行切块,分别存储到不同的节点上,在hadoop1.0版本中,每个block默认大小时64M,在hadoop2.0版本中,每一个block默认大小时128M

NameNode

负责DataNode的管理以及元数据的存储。元数据存在内存(快速查询)和磁盘(奔溃恢复)中
HDFS的结构中,namenode存在单点问题

hadoop的作者 hadoop的创始人是谁_hadoop


fsimage:存储元数据。但是fsimage中的元数据和内存中并不一致,也就意味着fsimage中的数据并不是实时数据

edits:存储HDFS的操作

fstime:记录上一次的更新时间

触发数据更新的条件:

1、文件大小–根据配置文件设置的edits log大小 fs.checkpoint.size 默认64M

2.定时更新–根据配置文件设置的时间间隔:fs.checkpoint.period默认3600秒

3.重启HDFS的时候也会触发更新–在合并过程中,HDFS不对外提供些服务,只对外提供读服务–重启hdfs的时候进行的更新阶段称之为安全模式

安全模式

1.只能读不能写

2.检查复本数量以及总量

3.如果重启HDFS,处于安全模式,等待一会儿,检查完数据都没有问题之后便自动退出安全模式

如果重启HDFS之后长期处于安全模式,则说明数据有损坏:

强制退出安全模式可能会对数据造成一定的损坏,强烈不建议这样做:

1.强制退出安全模式 hadoop dfsadmin -safemode leave

2.关闭HDFS

3.删除dfs、nm-local-dir、logs

4.重新格式化hadoop namenode -format

SecondaryNameNode

hadoop的作者 hadoop的创始人是谁_hadoop的作者_02

合并过程:
1.将edits和fsimage文件通过网络拷贝到Secondarynamenode上
2.在namenode产生一个edits.new记录合并期间的操作
3.拷贝完成之后,fsimage就会将其中的数据存到secondarynamenode的内存中
4.将edits的操作更新到secondarynamenode的内存中
5.更新完成之后,将内存中的数据写到fsimage.ckpt文件中
7.将fsimage.ckpt重命名为fsimage,并且将edits.new重名名为edits
注:SecondarNameNode只负责进行数据的合并,不是Namenode的热备,但是在一定程度是哪个也起到了备份作用,会产生数据的丢失

Datanode

DataNode的作用是存储数据并且是以数据块的形式来存储数据。
在DataNode中存储了对应的namenode的clusterId来确定当前的DataNode归哪个namenode管理,DataNode每隔一段时间3s会主动向namenode发送心跳信息(节点状态、节点数据),如果namenode超过10min没有收到DataNode的心跳信息,则认为这个DataNode产生lost,那么namenode就会将这个DataNode上的数据copy到其他节点

HDFS的操作流程

读取数据:
1.客户端发起RPC请求访问Namenode
2.Namenode会查询元数据,找到这个文件的存储位置对应的数据块的信息
3.Namenode将文件对应的数据块的节点地址的全部或者部分放入一个队列中返回
4.client收到这个数据块对应的节点地址
5.client会从队列中取出第一个数据块对应的节点地址,会从这些节点地址中选择一个最近的节点进行读取
6.将block读取之后,对Block进行checksum的验证,如果验证失败,说明数据块产生损坏,那么client会向NameNode发送信息说明该节点上的数据块损坏,然后从其他节点中再次读取这个数据块
7.验证成功,则从队列中取出下一个Block的地址继续读取
8.当把这一次的文件块全部读取完之后,client会向Namenode要下一批block的地址
9.当把文件全部读取完成之后,client会向Namenode发送一个读取完毕的信号,NameNode就会关闭对应的文件

hadoop的作者 hadoop的创始人是谁_数据_03


写流程

1.client发送RPC请求给Namenode

2.Namenode接收到请求之后,对请求进行验证,例如:验证这个请求中的文件是否存在、权限验证等

3.如果验证通过,Namenode确定文件的大小以及分块的数量,确定对应的节点(会去找磁盘空间相对空闲的节点来使用),将节点地址放入队列中返回

4.client收到地址之后,从队列中一次取出节点地址,然后数据块依次放入对应的节点地址上

5.client在写完之后就会想Namenode发送数据已写完的信号,Namenode会给client返回一个关闭文件的信号

6.DataNode之间将会通过管道进行自动的备份以保证复本数量

hadoop的作者 hadoop的创始人是谁_hadoop_04


删除流程:

1.client发起RPC请求到Namenode

2.Namenode收到请求之后,会将这个操作记录到edits中,然后将数据从内存中删除,给客户端返回一个删除成功的信号

3.客户端收到信号之后认为数据已经删除,实际是哪个数据依然存在DataNode上

4.当DataNode向namenode发送心跳消息的时候,namenode就会检查这个DataNode中的节点数据,发送DataNode中的节点数据在namenode中的元数据中没有记录,namenode就会做出相应,就会命令对应的DataNode删除指定的数据

HDFS的操作命令

hadoop fs -put a.txt /a.txt -上传文件
hadoop fs -mkdir /hadoop01 -创建目录
hadoop fs -rm /hadoop.tar.gz - 删除文件
hadoop fs -rmdir /hadoop01 -删除目录
hadoop fs -rmr /a -递归删除
hadoop fs -get /a.txt /home -下载
hadoop fs -ls / -查看
hadoop fs -lsr / - 递归查看
hadoop fs -cat /a.txt - 查看文件
hadoop fs -tail /a.txt -查看文件的最后1000个字节
hadoop fs -mv – 移动或者重命名
hadoop fs -touchz /demo.txt -创建空文件
hadoop fs -getmerge /a demo.txt – 合并下载

MapReduce

Map任务

1.读取输入文件内容,解析成key、value对。对输入文件的每一行解析成key、value对。每一个键值对调用一次map函数
2.写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
3.对输出的key-value进行分区
4.对相同分区的数据,按照key进行排序(默认按照字典顺序进行排序)、分组。相同key的value放到一个集合中
5.将分组后的数据进行归约
注:在MapReduce中,Mapper可以单独存在,但是Reducer不能单独存在

Reducer任务

1.对多个map任务的输出,按照不同的分区,通过网络copy到不同的Reduce节点,这个过程并不是map将数据发送给Reduce,而是Reduce主动获取数据
2.对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key-value处理,转换成新的key-value输出
3.把reduce的输出保存到文件中

MapReduce的执行流程

1.run job:客户端提交一个mr的jar包给jobClient:

a.做job环境信息的收集,比如各个组件类,输入输出的kv类型等,检测是否合法

b.检测输入输出的路径是否合法

2.jobclient通过RPC和ResourceManager进行通信,返回一个存放jar包的地址(HDFS)和jobid,jobid是全局唯一的,用于表示该job

3.client将jar包写入到HDFS当中(path=HDFS上的地址+jobId)

4.开始提交任务(任务的描述信息。不是jar,包括jobid,jar存放的位置,配置信息等)

5.jobTracker进行任务初始化

6. 读取HDFS上要处理的文件,开始计算输入切片,每一个切片对应一个MapperTask。注意:切片是一个对象,存储的是这个切片的数据描述信息;切块是文件块,里面存储的是真正的文件数据

7. TaskTracker通过心跳机制领取任务(任务的描述信息)。切片一般和切块是一样的,即在实际开发中,切块和切片认为是相同的。在领取到任务后,要满足数据本地化策略

8. 下载所需的jar,配置文件等。体现的思想是:移动的是运算/逻辑,而不是数据

9. TaskTracker启动一个java child子进程来执行具体的任务(MapperTask或ReducerTast)

10. 将结果写入到HDFS中

hadoop的作者 hadoop的创始人是谁_hadoop的作者_05


hadoop的作者 hadoop的创始人是谁_数据_06


注:

1.一般而言,切片的描述的大小和切块的大小是一致的

2.习惯上,会将namenode也作为jobtracker,将DataNode做为TaskTracker

shuffle过程

MapTask

1.获取到切片信息

2.每一个切片对应一个mapTask

3.读取具体的数据块

4.按行读取数据

5.每一行数据会调用一次map方法,进行处理

6.map方法在执行完成之后会产生k-v结构,这个数据会存在缓冲区中

7.在缓冲区中会进行分区、排序、合并

8.缓冲区默认大小时100M,缓冲区中还会有一个阈值–80%–就意味着如果缓冲区使用达到了80%的时候就认为环形缓冲区满了

9.如果环形缓冲区满了,就会将缓冲区中的数据写到磁盘的文件中,这个过程称为Spill(溢写),写出的文件称为溢写文件

10.每一个溢写文件中的数据时分好区且拍好序的

11.每一次Spill过程都会产生一个新的溢写文件,所以所有的溢写文件从整体上不是分区且排序的

12.在交给ReduceTask之前,会对所有的溢写文件进行一次合并–merge

13.合并之后的文件是对所有数据进行了整体的分区且排查

hadoop的作者 hadoop的创始人是谁_数据_07


注意:

1.Spill过程不一定发生

2.如果产生了Spill过程,且最后一次的数据不足阈值,将最后一次的缓冲区中的数据flush到最后一个溢写文件中

3.切片的大小和溢写文件的个数不是对等的

4.达到缓冲区的80%的时候会Spill到溢写文件中,理论上Spill文件应该是80M,实际上不一定。a:要烤炉最后一次的flush过程;b:要考虑序列化的因素

5.如果溢写文件的个数>=3个,在merge的时候会再进行一次combine过程

6.每一个MapTask对应一个缓冲区

7.缓冲区本质上是一个字节数组

8.缓冲区是一个环形缓冲区,为了重复利用缓冲区

9.阈值的作用:①防止数据覆盖②防止写入过程的阻塞

ReduceTask

1.ReduceTask通过http请求来访问对应的MapTask获取到分区的数据–fetch–fetch线程数量默认为5

2.获取到不同的MapTask的数据之后,会对数据进行merge,将数据合并(将相同的键所对应的值放入一个迭代器中)且排序(根据键进行排序)

3.每一个键调用一次reduce方法来进行处理

4.件处理之后的数据写到HDFS中

hadoop的作者 hadoop的创始人是谁_hadoop的作者_08


注意:

1.merge因子:确定每次将几个文件合并一次。默认是10,如果文件个数<merge因子,直接合并

2.ReduceTask的阈值:ReduceTask不是等所有的MapTask都结束之后才启动执行,而是在一定数量的MapTask结束之后就开始启动抓取数据—当5%的数量的MapTask结束之后,ReduceTask就开始启动抓取数据

调优:

1.可以适当调大缓冲区,一般建议是250M~400M之间

2.可以适当的增加combine过程

3.在map过程中会产生一个最后merge好的文件,即通过网络发送给ReduceTask–可将文件进行压缩之后再发送–如果网络带宽比较稀缺,这个时候可以考虑压缩

Yarn

Yarn是hadoop提供的一个用于进行资源调度和任务管理的框架。

hadoop的作者 hadoop的创始人是谁_数据_09


hadoop的作者 hadoop的创始人是谁_hadoop的作者_10


注意:

1.如果有多个Task,那么会scheduler中形成资源队列,队列中存储的是Container

2.如果资源队列已满,这个时候来的新任务会被阻塞

3.如果多个任务同时申请资源,一般默认MapTask会优先申请

4.一个节点中会有一个Nodemanager,意味着一个NodeManager将会执行不只一个Task