分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

分布式大数据处理系统概览(一)

  本博文主要对现如今分布式大数据处理系统进行概括整理,相关课程为华东师范大学数据科学与工程学院《大数据处理系统》,参考大夏学堂,下面主要整理HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph有关的内容。


分布式大数据处理系统大纲


  第一节部分主要总结分布式系统的目标、性质;简要介绍几种分布式计算的编程模型;介绍计算机进程与线程关系及远程调用方式;介绍文件系统DFS、介绍Hadoop的文件系统HDFS;介绍分布式计算批处理系统MapReduce和Spark。

0.绪论

0.1分布式系统的目标

分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

0.2 大数据的五个特性(5V)

(1)数量Volume
(2)种类Variety
(3)价值Value
(4)真实性Veracity
(5)速度Velocity

0.3 分布式计算生态圈分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
0.4分布式计算底层系统

(1)协调服务系统:Zookeeper;
(2)资源管理系统:Yarn;
(3)分布式文件系统:HDFS;

0.5数据处理分布式计算系统:

(1)批处理:MapReduce、Spark;
(2)流处理:Storm、Spark Streaming;
(3)批流融合系统:Google Dataflow、Flink;

0.6专门应用领域分布式计算系统:

(1)图处理:GraphX、Giraph
(2)机器学习系统:SystemML、Tensorflow;

0.7编程模型:

分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

0.8进程

(1)进程与线程之间的关系
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
(2)进程之间的通讯
# 信号、信号量、消息队列、匿名管道、有名管道、共享内存、套接字
# 远程调用RPC:进程通过参数传递的方式调用另一个进程中的一个方法并得到返回的结果
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

0.9序列化与压缩

(1)序列化定义:
# 序列化:将对象状态按照一定的格式转换成有序字节流;
# 反序列化:从文件中或网络上获得的序列化的对象字节流后,根据字节流中保存的对象状态和描述信息重建对象;
(2)压缩定义:
# 压缩:通过一些有别于原始编码的特殊编码方式保存数据,使得占用空间减少;
# 解压缩:还原原有数据格式;

1.文件系统

1.1文件系统的概念:

(1)文件系统是操作系统中负责管理和存取信息的模块;
(2)文件是由文件名字标识的一组信息的集合;
(3)文件目录:建立和维护的关于系统的所有文件的清单;文件目录主要以树形目录为主
(4)文件控制块:每个目录项对应一个文件的信息描述;主要包括:
# 文件存取控制信息;
# 文件的结构信息;
# 文件使用信息;
# 文件管理信息;
(5)目录文件:目录信息以文件的形式存放;

1.2文件系统的功能:

(1)基本功能:按名存取
(2)文件目录的建立与维护
(3)实现逻辑文件到物理文件的转换;
(4)文件存储空间的分配和管理
(5)数据保密
(6)提供一组用户使用的操作

1.3按名存取步骤

(1)系统超找目录文件,获得对用的文件目录;
(2)根据文件名寻找到对应文件的文件控制块;
(3)根据文件控制块内的信息对文件进行存取;

2.分布式文件系统(DFS)

2.1 DFS的体系架构

(1)实现思路:保证每台机器均可以透明访问其他机器上的文件;将每台机器的文件系统关联起来,形成一个对外同义的整体;
(2)C/S架构的文件系统的挂载:通过RPC调用访问其他机器上的文件;将不同文件系统挂载到主系统的某一个目录下,当访问这个目录时相当于访问对应的文件系统;
(3)集群分布式文件系统:主节点进行管理,从节点存储数据:文件切分为块,分散存储在从节点中。

3.Hadoop分布式文件系统(HDFS)

3.1 DFS设计假设与目标:

分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

3.2 HDFS体系架构

分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
(1)NameNode:每个集群只有一个NameNode,负责文件系统元数据的操作、数据块的副本机器定位。
# NameNode包含两个总要重要文件:fsimage:元数据镜像文件(保存文件系统的目录树);edits:元数据操作日志(针对目录树的修改操作)
(2)SecondaryNameNode:并非是NameNode的热备,其辅助分担NameNode工作量,定期合并fsimage和edits文件并推送给NameNode,在紧急情况下可辅助恢复NameNode。
(3)DataNode:集群中每个结点表示一个DataNode,其负责数据块的存储、为客户端提供实际文件数据。

3.3 HDFS的工作原理

分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
第一阶段NameNode工作
(1)第一次启动NameNode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志edits和镜像文件fsimage到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对数据进行增删改查。
第二阶段SecondaryNameNode工作
(1)Secondary NameNode询问NameNode是否需要checkpoint。
直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行checkpoint。
(3)NameNode滚动正在写的edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。

3.4 数据读写策略:

分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

3.5 文件读写一致性:

(1)一个文件经过创建、写入和关闭后不得改变文件内容;
(2)已经写入到HDFS文件、仅容许在文件末尾追加数据;
(3)当文件在写入操作时,NameNode拒接针对该文件的读写操作;
(4)当文件在读操作时,NameNode允许其他读操作。

3.6 HDFS容错性

(1)心跳机制,在Namenode和Datanode之间维持心跳检测,当由于网络故障之类的原因,导致Datanode发出的心跳包没有被Namenode正常收到的时候,Namenode就不会将任何新的IO操作派发给那个Datanode,该Datanode上的数据被认为是无效的,因此Namenode会检测是否有文件block的副本数目小于设置值,如果小于就自动开始复制新的副本并分发到其他Datanode节点。
(2)检测文件block的完整性,HDFS会记录每个新创建的文件的所有block的校验和。当以后检索这些文件的时候,从某个节点获取block,会首先确认校验和是否一致,如果不一致,会从其他Datanode节点上获取该block的副本。
(3)集群的负载均衡,由于节点的失效或者增加,可能导致数据分布的不均匀,当某个Datanode节点的空闲空间大于一个临界值的时候,HDFS会自动从其他Datanode迁移数据过来。
(4)Namenode上的fsimage和edits日志文件是HDFS的核心数据结构,如果这些文件损坏了,HDFS将失效。因而,Namenode可以配置成支持维护多个FsImage和Editlog的拷贝。任何对FsImage或者Editlog的修改,都将同步到它们的副本上。它总是选取最近的一致的FsImage和Editlog使用。Namenode在HDFS是单点存在,如果Namenode所在的机器错误,手工的干预是必须的。
(5)文件的删除,删除并不是马上从Namenode移出namespace,而是放在/trash目录随时可恢复,直到超过设置时间才被正式移除。

  • Hadoop的核心是分布式文件系统HDFS和MapReduce。

4 MapReduce

4.1 MapReduce

(1)MapReduce是对并行计算的封装,是用户通过一些简单的逻辑即可完成复杂的并行运算。将一个大的运算任务分解到集群的每个结点上,充分运用集群资源,缩短运行时间。
(2)MapReduce的数据模型:将数据抽象为一系列键值对,在处理过程中对键值对进行转换。
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
(3)MapReduce的计算模型:
# 逻辑计算模型:将复杂的、运行于大规模集群上的并行计算过程高度地抽象为Map和Reduce两个过程。
# 物理计算模型:MapReduce采用“分而治之”策略,将一个分布式文件系统中的大规模数据集,分成许多独立的分片。这些分片可以被多个Map任务并行处理。
# MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave。Master上运行JobTracker,Slave运行TaskTracker
(4)MapReduce的架构:
# JodTracker:集群资源管理(负责集群资源的分配、监控TaskTracker状况、资源使用量等信息);集群作业管理(将Job作业拆分为Task,跟踪Job和Task的执行进度等信息)
# TaskTracker:结点任务管理(与JobTracker心跳机制通信,接受JobTracker命令并执行Map或Reduce任务,资源划分,定时向JobTracker汇报资源使用情况)
# 客户端(Client):提交作业(用户提交的程序通过Client提交到JobTracker);作业查看(用户通过Client接口查看作业运行状态)

4.2 MapReduce运行过程

(1)客户端提交作业信息到HDFS;
(2)客户端提交作业给JobTracker;
(3)JobTracker读取作业信息,生成一系列的Map和Reduce任务,调度给空闲的TaskTracker;
(4)TaskTracker启动Map任务,并从HDFS中读取数据,执行期间每次心跳向JodTracker发送状态和任务完成进度;
# 读取HDFS文件,并每行解析为<k,v>,每个键值对调用一次map函数
# 然后处理,转换为新的<k,v>
# 然后对新的键值对进行分区,对不同分区内的数据按照k进行排序、分组(相同k的所有v放在一起)
# 对分组后的数据进行归约。
(5)Map执行完后,JobTracker将Reduce任务分配给TaskTracker,并启动进程执行Reduce任务,执行过程中心跳向JobTracker发送状态和进度:
# 根据Map的输出,按照不同的分区,复制到不同的Reduce结点上;
# 然后进行合并、排序,得到新的<k,v>并写入HDFS中。
(6)Reduce完成后,将结果写入HDFS中,任务结束。
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

4.3 MapReduce原理

(1)Map逻辑过程:[k1,v1]->list([k2,v2])
(2)Map物理过程:
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
(4)shuffle逻辑过程:
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
(5)Reduce逻辑过程:
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)(6)Reduce物理过程:
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

4.4 MapReduce容错

(1)JobTracker故障:其发生故障后,所有作业需要重新执行;
(2)TaskTracker故障:其发生故障时,JobTracker不会收到心跳;JobTracker会安排其他TaskTracker运行失败的作业;整个过程对永不是透明的
(3)Task故障:重新执行Map任务;重新读取HDFS数据;如果任务经过多次尝试后依然失败,则任务被标记为失败。

5 批处理系统Spark

5.1 Spark及其设计思想

(1)Spark最初是基于内存计算的大数据并行计算框架,用于构建大型的,低延迟的数据分析应用程序;
(2)Spark具有如下几个特点:运行速度快;容易使用;通用性;运行模式多样;
(3)MapReduce局限性:用户编程复杂;磁盘IO开销大,延迟高;多个作业之间的衔接涉及IO开销;
(4)数据模型RDD(弹性分布式数据集):具有可恢复的容错性;每个RDD可分为多个分区,不同分区可存在集群的不同节点上;每个分区是一个数据集片段;
# 在物理存储中,每个分区指向一个存储在内存或者硬盘中的数据块 (Block) ,其实这个数据块就是每个 task 计算出的数据块,它们可以分布在不同的节点上。所以,RDD 只是抽象意义的数据集合,分区内部并不会存储具体的数据,只会存储它在该 RDD 中的 index,通过该 RDD 的 ID 和分区的 index 可以唯一确定对应数据块的编号,然后通过底层存储层的接口提取到数据进行处理。
# RDD是只读的对象集合,一经创建不可修改。由于已有的 RDD 是不可变的,所以只有对现有的RDD进行转化操作,才能得到新的RDD。在 RDD 的计算过程中,不需要立刻去存储计算出的数据本身,我们只要记录每个 RDD 是经过哪些转化操作得来的,即:依赖关系,这样一方面可以提高计算效率,一方面是错误恢复会更加容易。如果在计算过程中,第 N 步输出的 RDD 的节点发生故障,数据丢失,那么可以根据依赖关系从第 N-1 步去重新计算出该 RDD,这也是 RDD 叫做"弹性"分布式数据集的一个原因;
# RDD遵循函数式编程(对于变量的操作不是修改已有值,而是创建新值);
# RDD是可并行处理的。
(4)计算模型DAG:
# RDD操作支持数据运算有转换(transformation)和动作(action)
#逻辑计算模型(左图)和对应的物理计算模型(右图)
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

5.2 Spark体系架构

(1)Cluster Manager(集群管理器):负责管理整个系统的资源,监控工作节点
(2)Executor(执行器):负责执行任务,运行在工作节点(Worker Node)上的进程
(3)Driver(驱动器):负责启动应用程序的主函数并管理作业运行
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
(4)Spark与Hadoop对比:
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

5.3 Spark工作原理

(1)Driver创建SparkContext进行资源申请、任务分配和监控,根据RDD的依赖关系构建DAG,交给DAGScheduler划分stage(task/taskSet),并将每个stage分配给TaskScheduler;
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
# 划分stage:在DAG中反向解析,遇到宽依赖就划分,遇到窄依赖就加入stage;
# 一个stage内部特点:所有依赖关系都是窄依赖,可采用流水线方式;
# 不同stage之间特点:所有依赖关系都是宽依赖,只能使用shuffle方式;
# Spark的Task有两种:ShuffleMapTask和ResultTask,其中后者在DAG最后一个阶段推送给Executor,其余所有阶段推送的都是ShuffleMapTask
分布式大数据系统概览(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)
(2)资源管理器为Executor分配资源,并启动Executor进程;
(3)Executor向SparkContext申请Task,SparkContext根据Task Scheduler按照stage的拓扑顺序将应用程序分发给Executor执行
(4)执行结束后写入数据并释放

5.4 Spark应用、作业与任务之间的关系:

(1)应用:用户编写的应用程序;
(2)Job(基本调度单位):一个Job包含多个RDD及作用于相应RDD转换操作,其中最后一个为action;
(3)Stage:一个Job会分为多组Task;
(4)Task:运行在Executor上的工作单元

5.5 Spark容错

(1)RDD提供持久化接口;
(2)RDD的Lineage 机制:RDD的Lineage记录的是粗颗粒度的特定数据Transformation操作(如filter、map、join等)行为,当这个RDD的部分分区数据丢失时,它可以通过Lineage获取足够的信息来重新运算和恢复丢失的数据分区。
# 窄依赖:当一个节点数据丢失,可检查对应父节点RDD的partition是否存在,若存在则执行RDD操作,否则重构父亲RDD对应的partition;
# 宽依赖:当一个节点数据丢失,可检查对应父节点RDD的partition是否存在,若存在则执行RDD操作,否则重构整个父亲RDD对应的partition;
(4)RDD检查点机制:将RDD写入外部可靠的分布式文件系统(例如HDFS)


分布式大数据处理系统大纲


  博客记录着学习的脚步,分享着最新的技术,非常感谢您的阅读,本博客将不断进行更新,希望能够给您在技术上带来帮助。喜欢请关注+点赞o( ̄▽ ̄)d