hadoop
google三篇论文
GFS
MapReduce数据计算
BigTable
什么是hadoop?
:Hadoop是一个适合海量数据的分布式存储和分布式计算的平台。
**Hadoop Common**:基础型功能
**Hadoop Distributed File System (HDFS™)**:一种分布式文件系统,可提供对应用程序数据的高吞吐量访问。负责存放数据
**Hadoop YARN**:作业调度和集群资源管理的框架。负责资源的调配
**Hadoop MapReduce**:基于 YARN 的系统,用于并行处理大型数据集。大数据的计算框架
分而治之的思想

将数据分为内存大小都为128MB的block块,每一个block块都有一个map任务,待所有的map任务都完成,将他们整合成一个reduce任务,进行统计
对block块的理解

文件为什么可以切分?
所有的数据在计算机中都是以而二进制字节数组的角度看待,我们可以根据字节的大小切分成若干个小部分
怎么切分?
可以随意切分,但是并不好,原因有二:
1.若切分的大小不一致,会导致将来处理的逻辑不能统一,没法确定部分与部分的顺序关系
2.若切分的过大,则可能没有适合的机器进行存储
解决方案:
在hadoop 中的hdfs里面,我们的文件会以128MB形成一个block块来进行存储在hdfs中,并且每一个block块都有自己的编号(0,1 ..)
怎么存储?
每个计算机存储一部分
NameNode 和 DataNode 的关系

NameNode的工作内容:
1.存储子节点的元数据信息
启动之前存储元数据信息:
* 文件的归属
* 文件的权限
* 文件的大小,以及时间
启动后:分发任务给子节点来存储block信息
2.每三秒要和与子节点发送心跳机制,若子节点十分钟之内没有给予回应,则说明该子节点挂了
且namenode 是用户访问hdfs的唯一入口,用户的上传和下载等处理请求都是由namenode 去处理的,为了提高效率,namenode 的处理请求都是在内存中进行
datanode的工作内容是:
1.以block块的形式存放文件的数据信息,以及验证文件的完整型的校验信息(.meta)
2.启动的过程中,会向主节点汇报信息
3.运行过程中与主节点namenode保持心跳机制,
dadoop 命名空间

在hdfs中所有的block块的都在block池中,由从节点datanode进行储存、
传统的内存持久化
点击
1)日志机制
a. 做任何操作之前先记录日志
b.在数据改变之前先记录对应的日志,当NN停止的时候
c. 当我下次启动的时候,只需要重新按照以前的日志“重
做一遍”即可
缺点:
a. log日志文件的大小不可控,随着时间的发展,集群
启动的时间会越来越长
b.有可能日志中存在大量的无效日志
优点:
a. 绝对不会丢失数据
2)拍摄快照
a. 我们可以将内存中的数据写出到硬盘上(序列化)
b.启动时还可以将硬盘上的数据写回到内存中(反序列
化)
缺点:
a. 关机时间过长
b.如果是异常关机,数据还在内存中,没法写入到硬
盘
c. 如果写出的频率过高,导致内存使用效率低
优点:
启动时间较短
SNN的工作机制
因为namenode 的处理请求都是在内存中进行,为了防止数据的丢失,要对其做持久化

我们新的操作命令都会保存在日志追加文件中,随着我们的操作越来越大,日志追加文件就会越来越大,
,
首先在开始之前,SNN会同步一份namenode快照文件的镜像,在namenode 中当我们的日志文件大到64M,或者是达到1h时,会打包成一个新的日志文件,SNN将其拉去过来,日志文件与快照文件进行合并,形成了一个新的快照文件,
新的快照文件会同步一份到namenode 中
namenode中旧的日志文件会产生一个新的impresswen文件继续接收用户的处理请求,当我们的日志文件大到64M,或者是达到1h时,会打包成一个新的日志文件,然后SNN将他拉取过去,与最新的快照文件进行合并,又形成了一个新的快照文件,SNN会将快照文件同步一份到namenode 中,快照文件只会保存最新的两个,但是我们的日志文件都保存了
SNN主要是从namenode中拉取达到阈值的日志文件,与在SNN内部快照文件进行结合产生最新的快照文件同步给namenode,保证namenode 每次启动的数据时不会丢失的
机架感知(数据的获取以及先后顺序)
机架感知是为了保证副本在集群中的安全性
一个机架中有的主节点和子节点,子节点存储一个个block块信息
* 如果在当前节点既可以充当主节点也可以充当子节点,且我们要查询的block块信息就在该节点内,并且,在其他节点也有,我们优先选择该节点
* 如果主节点和子节点是分开的,我们优先的在同一机架上寻找子节点上有我们需要的备份block信息进行获取
如果当前机架上没有我们需要的block块信息,考虑跨机架,优先考虑最近的机架
主节点管理子节点
写文件的宏观流程

分布式文件系统通过rpc调用namenode去创建一个没有block关联的新文件
创建之前namenode 会对其进行校验,,文件是否存在,是否有权限
客户端会调用分布式文件系统这个类中的create方法来创建新文件,通过rpc调用namenode去创建一个没有block关联的新文件
namenode 校验成功的话会返回一个FSDataOutPutStream对象,给客户端写数据,通过该对象将数据输出到子节点上,校验成功namenode会产生文件,会对客户端的请求提供服务
客户端在写数据之前,向namenode询问存放数据的子节点有哪些,namenode将适合存储的节点信息给客户端(比如说namenode 的三个子节点副本信息)
子节点和主节点无时无刻都是在建立联系(心跳机制)
客户端会将我们的数据切分成一个个小packet块(64kb)根据机架感知获取最近的子节点建立连接通道, 客户端通过namenode创建FSDataOutPutStream将我们的packet发送到第一个子节点上
第一个子节点会通过一个pipline通道复制一份给第二个,当到达最后一个,最后一个字节会反向前子节点发送一个ack值(告知收到),一直将我们的ack值给客户端,说明第一个packet所有节点
上都有了,客户端再继续发packet,直至所有的packet发送完成,所有的packet进行整合在一起形成一个个block快,当最后一个的block块的packet发完了,pipline管道断开,说明文件已经发送完毕
发送完毕后客户端会关闭FSDataOutputStream
1.packet在传输过程中若因为异常导致中断,有可能导致数据丢失
先将我们的一个block块第一个packet放入数据队列中(先进先出)将数据队列中的packet数据拷贝一份给确认队列
最后一个节点接收到packet会向前一个节点发送一个ack确认值,知道ack确认中发送回客户端时,当我们的确认队列收到了ack值时我们将packet移除
当我们的packet在传输过程中突然失败了,把已经复制上去的删掉,从确认队列中拷贝一份到数据队列中,重新发送packet数据
2。客户端是怎么知道当前ack确认值是最后一个packet?
last packetin block 这个packet在block块是否是最后一个
客户端会将文件划分为一个个block块,一个block块会划分一个个packet
packe header里有一个标识,记录第几个block块的第几个packet
last packetin block 这个packet在block块是否是最后一个
datalen 记录了数据的多长
头信息对packet整体进行描述,packetdata 一个chunksum(校验文件,检验是否完整) 对应一个chunkdata
hdfs读数据流程

分布式文件系统通过rpc(远程过程调用协议()是一个交互的工程,发送和等待答复的过程)向namenode发送读数据请求
创建之前namenode 会对其进行校验,,文件是否存在,是否有权限,返回FSDataInPutFile对象给客户端,将文件与block块的映射关系给客户端
客户端通过机架感知获取最近的datanode子节点建立联系,调用FSDataInPutFile对象中的read方法将datanode上的block块读取过来。全部读完合并成一个文件
客户端还原成一个新的文件。关闭FSDataInPutFile,以及各个节点的管道pipline

浙公网安备 33010602011771号