[大数据计算基础] 大数据计算系统

大数据计算系统
大数据计算框架的几个要素 :
• 计算场景: 适用于何种任务使用?
• 抽象:程序员看到的框架是什么样的?
• API:程序员如何使用框架?
• 系统架构:系统有哪些模块?
• 基本数据操作:如何操作数据?如何高效实现?
• 流程优化:如何将一个计算任务转化为基本数据操作执行过程?
• 流程调度:如何有效执行基本数据操作?
• 数据存储机制:如何存储数据?
• 事务处理:如何确保计算过程正确地进行?

分别对于几种计算系统

  1. 大数据批处理计算框架 :
  2. 大数据实时计算框架
  3. 大图计算框架

    目录

    • 一. 大数据批处理计算框架
      • 1.Hadoop
      • 2.Spark

    进行总结

一. 大数据批处理计算框架

1.Hadoop

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函数

  • 以wordcount为案例
  • [大数据计算基础] 大数据计算系统_第1张图片
  • 很简单,就是重载一下map函数和reduce函数,给出具体的实现即可

系统架构
可以分为客户端节点,JobTasker节点,TaskTracker节点
[大数据计算基础] 大数据计算系统_第2张图片
如上图所示,一个 MapReduce程序指 定的一个完整计算过程在Hadoop里被称为一个作业(Job) ,而一个作业在执行过程中可以被拆分为若干 Map和Reduce任务完成 (最简单的wordcount中Map拆单词,Reduce按Map后的Key归并组装)

MapReduce框架中 进行并行计算的基本事务单元被称为任务(Task) ,分为Map 和Reduce 任务,一个作业(Job)通常 包含多个任务 (Task)
[大数据计算基础] 大数据计算系统_第3张图片
客户端节点是面向外部客户提供输入输出接口的节点,其中包含我们实现的MapReduce程序,和替程序与 MapReduce运行框 架交互的对象 ——JobClient

[大数据计算基础] 大数据计算系统_第4张图片
JobTracker 是MapReduce框架的总的管理者 ,它协调MapReduce作业,给下面工作节点分配任务和监控任务 ,同时由负责对接上面的客户端节点,类似于部门经理之类的活
[大数据计算基础] 大数据计算系统_第5张图片
TaskTracker 执行JobTracker分配的任务,是具体工作的执行者 ,类似公司里的程序员,按工作类型可以分为Map TaskTracker(前端程序员) 和Reduce TaskTracker (后端程序员)两类 ,下属具体的JVM和资源(类似公司的电脑)

运行流程

流程优化:无 (额外的DAG模型生成工具)
流程调度:基础任务调度、Map与Reduce函数的执行
[大数据计算基础] 大数据计算系统_第6张图片

初始化:

  1. MapReduce程序创建新的JobClient
  2. JobClient向JobTracker请求获得一个新的JobId标识本次作业
  3. JobClient将运行作业需要的相关资源放入作业对应的HDFS目录、 计算分片数量和map任务数量
  4. 向JobTracker提交作业,并获得作业的状态对象句柄
    总的来看就好像是新建一个JobClient对象,然后给相应的信息和计算资源

然后进行作业调度

  1. 作业提交请求放入队列等待调度
  2. 从HDFS中取出作业分片信息,创建对应数量的TaskInProgress调 度和监控Map任务

作业调度大致有先进先出(FIFO)公平(Fair)调度,能力(Capacity)调度器 三种

下面进行的就是任务分配 ,差不多就是创建TaskTracker,然后JobTracker与这些TaskTracker进行通信,保活检测等

等待前三部完成后,后面进行的就是具体的Spilt-Map-Shuffle-Reduce-Output过程了
比较值得说的就属于Shuffle
Shuffle顾名思义,洗牌,做的就是Map后进行文件排序和部分的合并(合并Map产生的中间数据),如下图所示:
[大数据计算基础] 大数据计算系统_第7张图片

数据存储机制

HDFS
采用NameNode 和DataNode 的结构,NameNode 是整个文件系统的大脑,提供整个文件系统的目录信息,各个文件的分块信息,数据块的位置信息,并且 管理各个数据服务器。 DataNode 是数据服务器,分布式文件系统中的每一个文件,都被切分成若务器上

HDFS中每个文件都会被切分成若干个块(Block),默认64MB,每一 块都有连续的一段文件内容是存储的基本单位。客户端写文件的时候,不是一个字节一个字节写 入文件系统的,而是累计到一定数量后,往文件写入数个数据包(Packet )。 在每一个数据包中, 都会将数据切成更小的块 (Chunk )( 512 字节 )
[大数据计算基础] 大数据计算系统_第8张图片
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不擅长:

  1. 多数据中心情况
  2. 低延迟数据访问需求(10ms)
  3. 大量的小文件
  4. 多个数据写入者

事务处理
就是讲Hadoop的容错机制
节点的容错:
主节点中会周期性地设置检查点(checkpoint),检查整个计算作业的执行情况,一旦某个任务失效,可以从最近有效 的检查点开始重新执行,避免从头开始计算的时间浪费。
工作节点失效是很普遍发生的,主节点会周期性地给工作节点发送检测命令,如果工作节点没有回应,这认为该工作节点失效,主节点将终止该工作节点的任务并把失效的任务 重新调度到其它工作节点上重新执行

TaskTracker的容错:

  1. 心跳监测 :已完成的任务会正常返回,未完成的任务则重新分配TaskTracker节点执 行
  2. TaskTracker黑名单机制 :每个Job会维护一个TaskTracker黑名单,将不好使的TaskTracker加进去,以后将不在该TaskTracker上调度任何task

容错的恢复

  1. 重启出错的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 之间交流的中间件

  1. 处理客户端请求
  2. 启动/监控ApplicationMaster
  3. 监控NodeManager – 资源分配与调度

NodeManager :类似老版本的TaskTracker

  1. 单个节点上的资源管理
  2. 处理来自ResourceManager的命令
  3. 处理来自ApplicationMaster的命令

ApplicationMaster :负责一个 Job 生命周期内的所有工作,类似老的框架 中 JobTracker

  1. 数据切分
  2. 为应用程序申请资源,并分配给内部任务
  3. 任务监控与容错 Hadoop

[大数据计算基础] 大数据计算系统_第9张图片
YARN 容错

ResourceManager
– 存在单点故障;
– 基于ZooKeeper实现。
NodeManager
–失败后,ResourceManager 将失败任务告诉对应的ApplicationMaster;
–ApplicationMaster决定如何处理失败的任务。
ApplicationMaster
–失败后,由ResourceManager重启;
–ApplicationMaster需处理内部任务的容错问题;
–ApplicationMaster会保存已经运行完成的Task, 重启后无需重新运行已经完成的工作。

2.Spark

在谈Spark之前,我们看看什么是大数据的批处理

  • 批处理操作作用于大容量静态数据集,并在计算过程完成后返回结果

批处理模式中使用的数据集通常符合下列特征:

  • 有界:批处理数据集代表数据的有限集合,不像流模型一样是无穷的。
  • 持久:数据通常始终存储在某种类型的持久存储位置中。
  • 大量:批处理操作通常是处理极为海量数据集的唯一方法。

批处理适合

  • 需要访问全套记录才能完成的计算工作
  • 对历史数据进行分析

批处理不适合

  • 对处理时间要求较高的场合(这时候需要使用流数据处理框架)

再看一下Spark与Hadoop的对比
[大数据计算基础] 大数据计算系统_第10张图片
不难看出,MapReduce框架把中间结果写入到稳定存储 (比如磁盘)中,带来了大量的数据复制、磁盘IO和序列化开销;而Spark在进行处理时,中间内容和计算结果是常驻内存的,这就是Spark中的RDD机制

因为要理解Spark必须先理解其中的RDD机制,spark中的很多特性都和他有关,所以先谈RDD(弹性分布式数据集)
一个RDD是一个分布式对象集合,本质上是一个只读的分区记录集合 ,提供了一个抽象的数据架构,不必担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换处理 。

一个RDD的不同分区可以被保存到集群中不同的节点上, 从而可以在集群中的不同节点上进行并行计算

不同RDD之间的转换操作形成依赖关系,可以实现数据流水处理,避免中间数据存储

RDD提供了一种高度受限的共享内存模型

  • RDD是只读的记录分区的集合,不能直接修改 ,类似软件构造中的不可变类
  • 只能基于稳定的物理存储中的数据集创建RDD,或者通过在其他RDD上执行确定的转换操作(如map、join和 group by)而创建得到新的RDD ,这里,RDD提供了一组丰富的操作以支持常见的数据运算,分为 “动作”(Action)和“转换”(Transformation)两种类型

RDD的执行过程:

  • RDD读入外部数据源进行创建
  • RDD经过一系列的转换(Transformation)操作,每一次都 会产生不同的RDD,供给下一个转换操作使用
  • 最后一个RDD经过“动作”操作进行转换,并输出到外部数据源

从上面可以看出RDD的优点:惰性调用、管道化、避免同步等待、不需要保存中间结果、每次操作变得简单

计算的中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销

存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化
[大数据计算基础] 大数据计算系统_第11张图片
容错机制:

RDD本身维护着可以用来重建丢失分区的信息

[大数据计算基础] 大数据计算系统_第12张图片

RDD还有优秀的容错机制:

  • 一般的容错机制:数据复制或者记录日志
  • RDD的容错机制:血缘关系、重新计算丢失分区、无需回滚系统、 重算过程在不同节点之间并行、只记录粗粒度的操作

你可能感兴趣的:(大数据计算基础,大数据)