大数据计算系统
大数据计算框架的几个要素 :
• 计算场景: 适用于何种任务使用?
• 抽象:程序员看到的框架是什么样的?
• API:程序员如何使用框架?
• 系统架构:系统有哪些模块?
• 基本数据操作:如何操作数据?如何高效实现?
• 流程优化:如何将一个计算任务转化为基本数据操作执行过程?
• 流程调度:如何有效执行基本数据操作?
• 数据存储机制:如何存储数据?
• 事务处理:如何确保计算过程正确地进行?
分别对于几种计算系统
Hadoop是一个开源的、可靠的、可扩展的分布式并 行计算框架,主要包括:
– MapReduce 离线大数据分析计算引擎
– HDFS – 分布式文件系统
– YARN– 任务执行调度资源管理框架
– Hbase – NoSQL数据库
–Hive – 分布式数据仓库
计算场景: 批处理
抽象:Map-Reduce 函数模型
MapReduce并行处理的基本过程 :
1.有一个待处理的大数据,被划分为大 小相同的数据块(如 64MB),及与此相应 的用户作业程序
2.系统中有一个负责调度的主节点(Master), 以及数据Map和 Reduce工作节点 (Worker)
3.用户作业程序提交 给主节点
4.主节点为作业程序 寻找和配备可用的 Map节点,并将程 序传送给map节点
5.主节点也为作业程 序寻找和配备可用的 Reduce节点,并将 程序传送给Reduce 节点
6.主节点启动每个 Map节点执行程序, 每个map节点尽可 能读取本地或本机 架的数据进行计算
7.每个Map节点处理读取 的数据块,并做一些数据整 理工作(combining, sorting等)并将中间结果 存放在本地;同时通知主 节点计算任务完成并告知 中间结果数据存储位置
8.主节点等所有Map节 点计算完成后,开始 启动Reduce节点运行; Reduce节点从主节点 所掌握的中间结果数 据位置信息,远程读 取这些数据
9.Reduce节点计算结果 汇总输出到一个结果文 件即获得整个处理结果
API:重载MapReduce函数
系统架构
可以分为客户端节点,JobTasker节点,TaskTracker节点
如上图所示,一个 MapReduce程序指 定的一个完整计算过程在Hadoop里被称为一个作业(Job) ,而一个作业在执行过程中可以被拆分为若干 Map和Reduce任务完成 (最简单的wordcount中Map拆单词,Reduce按Map后的Key归并组装)
MapReduce框架中 进行并行计算的基本事务单元被称为任务(Task) ,分为Map 和Reduce 任务,一个作业(Job)通常 包含多个任务 (Task)
客户端节点是面向外部客户提供输入输出接口的节点,其中包含我们实现的MapReduce程序,和替程序与 MapReduce运行框 架交互的对象 ——JobClient
JobTracker 是MapReduce框架的总的管理者 ,它协调MapReduce作业,给下面工作节点分配任务和监控任务 ,同时由负责对接上面的客户端节点,类似于部门经理之类的活
TaskTracker 执行JobTracker分配的任务,是具体工作的执行者 ,类似公司里的程序员,按工作类型可以分为Map TaskTracker(前端程序员) 和Reduce TaskTracker (后端程序员)两类 ,下属具体的JVM和资源(类似公司的电脑)
运行流程
流程优化:无 (额外的DAG模型生成工具)
流程调度:基础任务调度、Map与Reduce函数的执行
初始化:
然后进行作业调度
作业调度大致有先进先出(FIFO)公平(Fair)调度,能力(Capacity)调度器 三种
下面进行的就是任务分配 ,差不多就是创建TaskTracker,然后JobTracker与这些TaskTracker进行通信,保活检测等
等待前三部完成后,后面进行的就是具体的Spilt-Map-Shuffle-Reduce-Output过程了
比较值得说的就属于Shuffle
Shuffle顾名思义,洗牌,做的就是Map后进行文件排序和部分的合并(合并Map产生的中间数据),如下图所示:
数据存储机制
HDFS
采用NameNode 和DataNode 的结构,NameNode 是整个文件系统的大脑,提供整个文件系统的目录信息,各个文件的分块信息,数据块的位置信息,并且 管理各个数据服务器。 DataNode 是数据服务器,分布式文件系统中的每一个文件,都被切分成若务器上
HDFS中每个文件都会被切分成若干个块(Block),默认64MB,每一 块都有连续的一段文件内容是存储的基本单位。客户端写文件的时候,不是一个字节一个字节写 入文件系统的,而是累计到一定数量后,往文件写入数个数据包(Packet )。 在每一个数据包中, 都会将数据切成更小的块 (Chunk )( 512 字节 )
HDFS读:
1、使用HDFS Client,向远程的Namenode发起RPC(远程过程调用)请求;
2、Namenode会视情况返回文件的部分或者全部block列表,对于每个block, Namenode都会返回有该block拷贝的datanode地址;
3-4、HDFS Client 选取离客户端最接近的datanode来读取block;
5、当读完列表的block后,如果文件读取还没有结束,客户端开发库会继续向Namenode 获取下一批的block列表。
6、读取完当前block的数据后,关闭与当前的datanode连接,并为读取下一个block寻找最佳的datanode
HDFS写:
1.HDFS Client 向远程的Namenode发起RPC请求;
2.Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行 操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
3.当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并 在内部以"data queue"的形式管理这些packets,并向Namenode申请新 的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根 据在Namenode中对replication的设置而定。
4. 开始以pipeline(管道)的形式将packet写入所有的replicas中。开发库把 packet以流的方式写入第一个datanode,该datanode把该packet存储之后, 再将其传递给在此pipeline中的下一个datanode,直到最后一个datanode,这 种写数据的方式呈流水线的形式。
5. 最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递 至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返 回的ack packet后会从"ack queue"移除相应的packet。
6. 如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关 闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下 的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的 datanode,保持replicas设定的数量。
HDFS优点:支持扩展
HDFS不擅长:
事务处理
就是讲Hadoop的容错机制
节点的容错:
主节点中会周期性地设置检查点(checkpoint),检查整个计算作业的执行情况,一旦某个任务失效,可以从最近有效 的检查点开始重新执行,避免从头开始计算的时间浪费。
工作节点失效是很普遍发生的,主节点会周期性地给工作节点发送检测命令,如果工作节点没有回应,这认为该工作节点失效,主节点将终止该工作节点的任务并把失效的任务 重新调度到其它工作节点上重新执行
TaskTracker的容错:
容错的恢复
补充内容:
仅供参考
MapReduce 1.0存在很多缺点 :
JobTracker 是 Map-reduce 的集中处理点,存在单点故障。
JobTracker 完成了太多的任务,造成了过多的资源消耗,当 map-reduce job 非常多的时候,会造成 很大的内存开销。
在 TaskTracker 端,以map/reducetask 的数目作 为资源的表示过于简单,没有考虑到 cpu/ 内存的占 用情况。
MapReduce 框架在有任何重要的或者不重要的变化 ( 例如 bug 修复,性能提升和特性化 ) 时,都会 强制进行系统级别的升级更新。强制让分布式集群系 统的每一个用户端同时更新。
因此升级到2.0,使用Yarn进行调度
Yarn里面主要可以分为三种模块:
ResourceManager : 调度、启动每一个 Job 所属的 ApplicationMaster、 另外监控 ApplicationMaster ,是Client和ApplicationMaster 之间交流的中间件
NodeManager :类似老版本的TaskTracker
ApplicationMaster :负责一个 Job 生命周期内的所有工作,类似老的框架 中 JobTracker
ResourceManager
– 存在单点故障;
– 基于ZooKeeper实现。
NodeManager
–失败后,ResourceManager 将失败任务告诉对应的ApplicationMaster;
–ApplicationMaster决定如何处理失败的任务。
ApplicationMaster
–失败后,由ResourceManager重启;
–ApplicationMaster需处理内部任务的容错问题;
–ApplicationMaster会保存已经运行完成的Task, 重启后无需重新运行已经完成的工作。
在谈Spark之前,我们看看什么是大数据的批处理:
批处理模式中使用的数据集通常符合下列特征:
批处理适合
批处理不适合
再看一下Spark与Hadoop的对比
不难看出,MapReduce框架把中间结果写入到稳定存储 (比如磁盘)中,带来了大量的数据复制、磁盘IO和序列化开销;而Spark在进行处理时,中间内容和计算结果是常驻内存的,这就是Spark中的RDD机制
因为要理解Spark必须先理解其中的RDD机制,spark中的很多特性都和他有关,所以先谈RDD(弹性分布式数据集)
一个RDD是一个分布式对象集合,本质上是一个只读的分区记录集合 ,提供了一个抽象的数据架构,不必担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换处理 。
一个RDD的不同分区可以被保存到集群中不同的节点上, 从而可以在集群中的不同节点上进行并行计算
不同RDD之间的转换操作形成依赖关系,可以实现数据流水处理,避免中间数据存储
RDD提供了一种高度受限的共享内存模型
RDD的执行过程:
从上面可以看出RDD的优点:惰性调用、管道化、避免同步等待、不需要保存中间结果、每次操作变得简单
计算的中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销
存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化
容错机制:
RDD本身维护着可以用来重建丢失分区的信息
RDD还有优秀的容错机制: