第四次作业

1.用图与自己的话,简要描述Hadoop起源与发展阶段。

一,Hadoop是一个对海量数据存储和海量数据分析计算的分布式系统。

Hadoop 1.x
海量数据存储 ----> HDFS
海量数据分析计算 ----> MapReduce
Hadoop 2.x 增加
资源调度系统 ----> Yarn

从hadoop最初的原型来看,hadoop已经远远超过了本身的批处理。从广义上来说,hadoop现在可以是指更广泛的一个hadoop生态了,而不仅仅是HDFS,MapReduce和Yarn。例如Hive,Hbase,Flume,Sqoop等等项目都属于这个生态。

二,Hadoop发展
Hadoop是道格·卡丁(Doug Cutting)创建的,Hadoop起源于开源网络搜索引擎Apache Nutch,后者本身也是Lucene项目的一部分。Nutch项目面世后,面对数据量巨大的网页显示出了架构的灵活性不够。当时正好借鉴了谷歌分布式文件系统,做出了自己的开源系统NDFS分布式文件系统。第二年谷歌又发表了论文介绍了MapReduce系统,Nutch开发人员也开发出了MapReduce系统。随后NDFS和MapReduce命名为Hadoop,成为了Apache顶级项目。

从Hadoop的发展历程来看,它的思想来自于google的三篇论文。

GFS:Google File System 分布式处理系统 ------》解决存储问题
Mapreduce:分布式计算模型 ------》对数据进行计算处理
BigTable:解决查询分布式存储文件慢的问题,把所有的数据存入一张表中,通过牺牲空间换取时间

三、Hadoop优势
高可靠性
因为hadoop假设计算元素和存储会出现故障,因为它维护多个数据结构和副本(默认3副本),在出现故障时可以对失败的节点重新分布处理

高扩展性
在集群间分配任务数据,可方便的扩展数以千计的节点

思考:动态扩容如何实现?
对于添加少量的机器,可以通过手动配置或通过CDH添加
如果需要动态扩容上百台呢,而且可以根据数据量增长和减少的趋势,可以auto scaling。

高效性
在MapReduce的思想下,Hadoop时并行工作的,以加快任务处理速度

高容错性
自动保存多副本数据,并且能够自动将失败的任务重新分配

 

四、传统数仓与大数据存储
传统数据仓库和大数据存储概念

传统数据仓库:传统方式 DW(Data Warehouse)基于传统的关系型数据库(Oracle,Mysql)是将所有的东西共享,放在一起存储分析。

大数据存储:分布式,东西不共享,分别在不同的机器上完成存储分析,最后整合到一起。

目前传统数仓和大数据存储的区别已经渐渐模糊了。传统的关系型数据库借鉴了hadoop思想,也实现了分布式的数据存储和处理,而大数据存储也增加了索引和事物的特性。但就其存储的数据结构还是不同的,大数据存储更擅长非结构化数据和半结构化数据,而关系型数据库更擅长结构化数据

OLTP和OLCP

OLTP:联机事务处理(On-Line transaction Processing)

OLAP:联机分析处理(On-Line Analytical Processing)

OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLTP系统强调数据库的内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作。

OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并支持提供直观易懂的查询结果,OLAP强调的数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等。

区别

 

 

 

OLTP,联机事务处理,表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主。OLTP出现瓶颈的地方在于CPU与磁盘子系统。OLTP系统也是一个数据块变化非常频繁,语句提交非常频繁的系统。

OLAP,联机分析处理,有时候也叫DSS决策支持系统,也就是我们所说的数据仓库,语句的执行量不是考核的标准,因为一条语句可能执行的时间会非常的长,读取的数据也会非常的多,所以,在这样的系统中,考核的标准往往是磁盘子系统的吞吐量(宽带),如能达到多少MB/s流量。

2.用图与自己的话,简要描述名称节点、数据节点的主要功能及相互关系。

HDFS:分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群

这些节点分为主从节点,主节点可叫作名称节点(NameNode),从节点可叫作数据节点(DataNode)

 

HDFS的存储模式:

HDFS通过块的模式存储数据,默认情况下一个块是64M,把大文件拆分成多个块,可以最小化寻址开销
这样的好处是:
1.支持大规模文件存储 : 文件以块为单位进行存储,一个大规模文件可以被分拆成若干个文件块,不同的文件块可以被分发到不同的节点上,因此,一个文件的大小不会受到单个节点的存储容量的限制,可以远远大于网络中任意节点的存储容量
2.简化系统设置 : 因为文件块大小是固定的,这样就可以很容易计算出一个节点可以存储多少文件块;其次,方便了元数据的管理,元数据不需要和文件块一起存储,可以由其他系统负责管理元数据
3.适合数据备份 : 每个文件块都可以冗余存储到多个节点上,大大提高了系统的容错性和可用性

 

名称节点最主要功能:名称节点记录了每个文件中各个块所在的数据节点的位置信息

名称节点(NameNode)与DataNode的功能:

 

 

 


在HDFS中,名称节点(NameNode)负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog
FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作

名称节点的启动:
1.在启动时,系统会将FsImage中的内容加载到内存中去,之后再执行EditLog中的操作,使得内存中的数据和实际同步,存在内存中的支持客户端的读。
2.一旦在内存中成功建立文件系统元数据的映射,则创建一个新的FsImage文件和一个空的EditLog文件
3.名称节点起来之后,HDFS中的更新操作会重新写到EditLog文件中,因为FsImage文件一般都很大(GB级别的很常见),
如果所有的更新操作都往FsImage文件中添加,这样会导致系统运行的十分缓慢,但是,如果往EditLog文件里面写就不会这样,
因为EditLog 要小很多。每次执行写操作之后,且在向客户端发送成功代码之前,edits文件都需要同步更新

 

 

但为了防止EditLog过大的问题:引入了第二名称节点(SecondaryNameNode)
第二名称节点:是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS 元数据信息的备份,并减少名称节点重启的时间。
SecondaryNameNode一般是单独运行在一台机器上

SecondaryNameNode让EditLog变小的工作流程:
(1)SecondaryNameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件edit.new上来,这个操作是瞬间完成,上层写日志的函数完全感觉不到差别;
(2)SecondaryNameNode通过HTTP GET方式从NameNode上获取到FsImage和EditLog文件,并下载到本地的相应目录下;
(3)SecondaryNameNode将下载下来的FsImage载入到内存,然后一条一条地执行EditLog文件中的各项更新操作,使得内存中的FsImage保持最新;这个过程就是EditLog和FsImage文件合并;
(4)SecondaryNameNode执行完(3)操作之后,会通过post方式将新的FsImage文件发送到NameNode节点上

 

(5)NameNode将从SecondaryNameNode接收到的新的FsImage替换旧的FsImage文件,同时将edit.new替换EditLog文件,通过这个过程EditLog就变小了

 

工作流程图:

 

 


DataNode:数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表

即HDFS需要实现的方面:
1.兼容廉价的硬件设备
2.流数据读写
3.大数据集
4.简单的文件模型
5.强大的跨平台兼容性
但这样面临的局限性:
1.不适合低延迟数据访问
2.无法高效存储大量小文件
3.不支持多用户写入及任意修改文件

 

3.分别从以下这些方面,梳理清楚HDFS的 结构与运行流程,以图的形式描述。

  • 客户端与HDFS
  • 客户端读
  • 客户端写
  • 数据结点与集群
  • 数据结点与名称结点
  • 名称结点与第二名称结点
  • 数据结点与数据结点
  • 数据冗余
  • 数据存取策略
  • 数据错误与恢复

 

HDFS架构设计

       如下图:

 

 

 

        一个HDFS集群包含了一个NameNode和多个Datanode的,是主从架构模式,Datanode受Namenode的支配。Secondary Namanode则定期同步元数据映像文件和修改日志,做备份工作,防止 NameNode 发生故障时,元数据丢失,当 NameNode 发生故障时,用来恢复文件系统。

        在运行过程中,DataNode需要定期向NameNode发送心跳消息,来汇报自己的状况:是否还处于Active状态,网络是否断开之类的。


三、HDFS读流程

 

 

 

 

1.初始化FileSystem,然后客户端用函数open()打开文件 。

2.FileSystem调用元数据节点,得到数据块信息,并对每一个数据块、元数据节点返回,保存数据块的数据节点地址。

3.客户端调用stream的read()函数开始读取数据。

4.FSDataInputStream连接保存此文件第一个数据块的最近的数据节点datanode,data从数据节点读到客户端。

5.当第一个数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

 6.当客户端读取完毕数据的时候,调用FSDataInputStream的close()函数,关闭连接。

注:在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点;失败的数据节点将被记录,以后不再连接。


四、HDFS写流程

 

 

 

1.初始化FileSystem,客户端调用create()来创建文件。

2.FileSystem调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点确定文件原来不存在后,给客户端创建文件的权限,然后创建新文件。

3.FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。

4.DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。

5.DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

6.当客户端结束写入数据,则调用stream的close()函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。

7.最后调用DFS方法,告诉NameNode流程完成。

注:如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

 

posted @ 2021-10-26 14:42  kkshui  阅读(28)  评论(0编辑  收藏  举报