Hadoop

1、问题一:Hadoop是什么?

              Hadoop是一个开源的框架,可编写和运行分布式应用,处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式

2、问题二: 为什么要使用hadoop?

              数据量大  海量的数据 TB级别  PB级别  数据利用传统的方式如何处理

             传统情况下 我们首先想到的可能是高并发 比如 1M的数据单节点处理,如果1000M的数据,单节点可能做不到 那么就会考虑集群的方式 分布式系统 但是分布式系统是很难开发的 很多问题点要考虑到   线程  进程  网络通信等  

再举个例子  简单的 count(),  order by  几百兆数据 mysql完全可以搞定 

                     但是几十TB 关系型数据就扛不住了。

因此 Hadoop框架就出现了 为了解决海量的数据处理问题而诞生

3、介绍hadoop生态圈

分布式存储系统 HDFS(Hadoop Distributed File System),提供了高可靠性、高扩展性和高吞吐率的数据存储服务;分布式计算框架 MapReduce,具有易于编程、高容错性和高扩展性等优点;

分布式资源管理框架 YARN(Yet Another Resource Management),负责集群资源的管理和调度。

解决问题

              海量数据的存储:hdfs

              海量的数据分析: MapReduce

              资源管理调度:YARN

Hdfs 架构的演变

1.x版本

多少数据量会使用spark 多大的数据量需要用到hadoop_数据

节点信息

NameNode(NN)

基于内存存储,不会和磁盘发生交换,只存在内存中,但也有持久化的功能,只是单方向的存储,防止断电丢失,不会发生内存和磁盘的交换,NameNode 的 metadate 信息在启动后会加载到内存,metadata 存储到磁盘文件名为”fsimage”,Block 的位置信息不会保存到 fsimage,由 DataNode 汇报,“edits”记录对 metadata 的操作日志。

NameNode 主要功能:

接受客户端的读写服务,收集 DataNode 汇报的 Block 列表信息,NameNode 保存

metadata 信息包括:文件 权限、文件大小、时间、Block 列表、Block 偏移量和位置信息(副本位置由 DataNode 汇报,实时改变,不会持久化)等。

DataNode(DN)

使用本地磁盘目录以文件形式存储数据(Block),同时存储 Block 的元数据信息文件(校验和,用于检测数据块是否损坏),启动 DN 时会向 NN 汇报 block 信息,通过向 NN 发送心跳保持与其联系(3 秒一次),如果 NN 10 分钟没有收到 DN 的心跳,则认为其已经 lost,并 copy 其上的 block 到其它 DN。

SecondaryNameNode(SNN)

它不是 NN 的备份(但可以做备份),它的主要工作是帮助 NN 合并fsimage与edits log,减少 NN 启动时间。SNN 执行合并时机:根据配置文件设置的时间间隔 fs.checkpoint.period,默认 3600 秒或者根据配置文件设置 edits log 大小 fs.checkpoint.size 规定 edits 文件的最大值,默认是 64MB。

SNN 在 hadoop2.0后就不再使用。

SNN 合并流程:

多少数据量会使用spark 多大的数据量需要用到hadoop_数据块_02

  1. 只有在NameNode重启时,edits logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照
  2. 首先,首次的时候secondaryNameNode会从NameNode拉去 edits logs 和fsimage 进行合并 生成新的 fsimage 推回给NameNode
  3. 拉取之后 Namenode会新增一个新的edits log  后面增量的记录是在这个新的edits log中
  4. 下次拉去的时候只会拉取这个增量的edits log 文件 与之前合并的fsimage 文件再次进行合并  也就是之后每次拉取的都只是增量的 edits log
  5. NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。

 

Hadoop2.x版本HA高可用

多少数据量会使用spark 多大的数据量需要用到hadoop_数据块_03

 

 

 

 

 

产生背景

Hadoop 1.0 中 HDFS 和 MapReduce 在高可用、扩展性等方面存在问题

HDFS 存在的问题:

NameNode 单点故障,难以应用于在线场景
NameNode 压力过大,且内存受限,影响系统扩展性

MapReduce 存在的问题: JobTracker 访问压力大,影响系统扩展性难以支持除 MapReduce 之外的计算框架,比如 Spark、Storm 等 

Hadoop 1.0 和 2.0 架构比较

Hadoop 2.x 由 HDFS、MapReduce 和 YARN 三个分支构成。

HDFS:NN Federation(联邦)、HA(只支持 2 个节点,3.0 实现了一主多从)。

MapReduce:运行在 YARN 上的 MR;离线计算,基于磁盘 I/O 计算。 YARN:资源管理系统

 

Hdfs设计思想

多少数据量会使用spark 多大的数据量需要用到hadoop_数据_04

 

分布式存储系统 HDFS

      

       HDFS: 高可靠性、高扩展性、和高吞吐率的分布式存储数据

存储模型

1、文件线性切割成块(Block):大文件切分为小文件

2、偏移量 offset(byte):每一个块的起始位置相对于原始文件的字节索引

Block 分散存储在集群节点中,单一文件 Block 大小一致,文件与文件之间 Block 大小可以不一致,Block 可以设置副本数,副本分散在不同节点中,副本数不要超过节点数量,文件上传可以设置 Block 大小和副本数,已上传的文件 Block 副本数可以调整,大小不变

3、只支持一次写入多次读取(修改是泛洪操作,集群开销很大,所有不允许在块中增删改操作),同一时刻只有一个写入者

4、可以 append 追加数据(加块,单点操作)

Block 的副本放置策略

多少数据量会使用spark 多大的数据量需要用到hadoop_数据_05

      第一个副本:放置在上传文件的 DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU 不太忙的节点。

第二个副本:放置在于第一个副本不同的机架的节点上。

第三个副本:与第二个副本相同机架的节点。

更多副本:随机节点。

 

Hdfs写流程

block 的流程:

      

多少数据量会使用spark 多大的数据量需要用到hadoop_客户端_06

  1. 客户端创建 DistributedFileSystem 对象.
  2. DistributedFileSystem 对象调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件,并标识为“上传中”状态,即可以看见,但不能使用。
  3. DistributedFileSystem 返回 DFSOutputStream,客户端用于写数据。
  4. 客户端开始写入数据,DFSOutputStream 将数据分成块,写入 data queue(Data queue 由 Data Streamer 读取),并通知元数据节点分配数据节点,用来存储数据块(每块默认复制 3 块)。分配的数据节点放在一个 pipeline 里。Data Streamer 将数据块写入 pipeline 中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。注意:并不是第一个数据节点完全接收完 block 后再发送给后面的数据节点,而是接收到一部分
    就发送,所以三个节点几乎是同时接收到完整的 block 的。DFSOutputStream 为发出去的数据块保存了 ack queue,等待 pipeline 中的数据节点告知数据已经写入成功。如果 block 在某个节点的写入的过程中失败:关闭 pipeline,将 ack queue 放至 data queue 的开始。已经写入节点中的那些 block 部分会被元数据节点赋予新的标示,发生错误的节点重启后能够察觉其数据块是过时的,会被删除。失败的节点从 pipeline 中移除,block 的其他副本则写入 pipeline 中的另外两个数据节点。元数据节点则被通知此 block 的副本不足,将来会再创建第三份备份。
  5. ack queue 返回成功。
  6. 客户端结束写入数据,则调用 stream 的 close 函数,最后通知元数据节点写入完毕总结:       客户端切分文件 Block,按 Block 线性地和 NN 获取 DN 列表(副本数),验证 DN 列表
    后以更小的单位流式传输数据,各节点两两通信确定可用,Block 传输结束后,DN 向 NN
    汇报 Block 信息,DN 向 Client 汇报完成,Client 向 NN 汇报完成,获取下一个 Block 存放的
    DN 列表,最终 Client 汇报完成,NN 会在写流程更新文件状态

Hdfs读文件流程

多少数据量会使用spark 多大的数据量需要用到hadoop_数据_07

  1. 客户端(client)用 FileSystem 的 open()函数打开文件。
  2. DistributedFileSystem 调用元数据节点,得到文件的数据块信息。对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。
  3. DistributedFileSystem 返回 FSDataInputStream 给客户端,用来读取数据。
  4. 客户端调用 stream 的 read()函数开始读取数据(也会读取 block 的元数据)。
    DFSInputStream 连接保存此文件第一个数据块的最近的数据节点(优先读取同机架的 block)。
  5. Data 从数据节点读到客户端。当此数据块读取完毕时,DFSInputStream 关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
  6. 当客户端读取完毕数据的时候,调用 FSDataInputStream 的 close 函数。
  7. 在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。失败的数据节点将被记录,以后不再连接。
    总结:
    客户端和 NN 获取一部分 Block(获取部分 block 信息,而不是整个文件全部的 block 信息,读完这部分 block 后,再获取另一个部分 block 的信息)副本位置列表,线性地和 DN 获取 Block,最终合并为一个文件,在 Block 副本列表中按距离择优选取。

安全模式

namenode 启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映射,则创建一个新的 fsimage 文件(这个操作不需要 SecondaryNameNode)和一个空的编辑日志。此刻 namenode 运行在安全模式。即 namenode 的文件系统对于客服端来说是只读的(显示目录,显示文件内容等。写、删除、重命名都会失败)。在此阶段 Namenode 收集各个 datanode 的报告,当数据块达到最小副本数以上时,会被认为是“安全”的, 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束。当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由 namenode 维护的,而是以块列表形式存储在 datanode 中。

 

MapReduce

多少数据量会使用spark 多大的数据量需要用到hadoop_客户端_08

数据处理详细

一个文件对应多个splits切片(默认与block的数目和大小一致,),每个split对应一个mapTask;

一个切片中的一条数据(offset,line)调用一次map方法,变成一到多个(k,v,p)格式的结果输出到内存缓冲区,在溢写前数据在内存缓冲区经过快速排序(可以设置排序比较器),如果设置了combiner则会发生数据的合并,溢写出一个按照分区号(P)和key排序(局部排序)的若干小文件(唯一的一次从无序到有序,其余均为归并排序),如果设置了combiner,当最终的溢写小文件的数量达到设置的最小值(默认为3),则会在merge之前发生数据合并,压缩数据量;

一个maptask会执行多次map方法,最终生成一个merge后的磁盘文件(按照P分区,内部按照key有序);

Reducetask的数量(对应partition数目)是不确定的,默认为1,需要根据计算和集群情况进行设定 job. setNumReduceTasks(num);一个reduceTask会执行一到多次reduce方法,生成一个outputfile文件;但是相同key为一组,只会调用一次reduce方法,也就是说一个分区(reducetask)可能处理多组数据(重写分区器partitionner,防止数据倾斜)

 Yarn 资源调度

多少数据量会使用spark 多大的数据量需要用到hadoop_客户端_09

YARN:分布式资源管理框架 负责集群资源的管理和调度 解耦资源与计算

             

Client:客户端,负责计算切片,提交任务和资源,与Resourcemanager交互

Resourcemanager:yarn集群的主节点,负责资源调度,设计为HA模型

Nodemanager:与RM汇报资源、管理Container生命周期,与hdfs中datanode 1:1

Container: 计算框架中的角色都以Container表示,用来孵化applicationMaster和executor

ApplicationMaster: 负责应用程序相关的事务,比如任务调度、任务监控和容错等

 

      

mapreduce on yarn

任务流程

1)客户端(计算切片,提交资源)提交job给resourcemanager(资源管理)

2)resourcemanager根据nodemanager的资源空闲情况挑选一台nodemanager生成applicationMaster进程

3)ApplicationMaster 创建完成之后会告诉集群管理者(ResourceManager)自己已经创建完毕并注册,同时向resourcemanager申请资源(mapTask/reduceTask在哪执行)。

4)resourcemanager将资源分配给节点应用管理者  ApplicationMaster, ApplicationMaster告诉 NodeManager去相应的container进程运行Map任务(MapTask)和Reduce任务(ReduceTask)。

5)各个任务向ApplicationMaster汇报自己的状态和进度,以让ApplicaitonMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务; ApplicationMaster将执行的结果反馈给Resourcemanager

6)客户端(client)可以通过浏览器访问节点的应用管理者resourcemanager去监控Map任务(MapTask)和Reduce任务(ReduceTask)的执行情况