总结《Spark技术内幕》第一章 Spark简介

@

Spark简介

1.1 spark 是什么?

spark是大数据分析引擎,集批处理,实时流计算处理分布式数据集。

Spark实现了一种分布式的内存抽象,称为弹性分布式数据集(Resilient Distributed Dataset,RDD)。它支持基于工作集的应用,同时具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。

RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。

1.2 spark的优点?

  1. Spark vs Mapreduce 内存 vs 磁盘

spark 和 mapreduce 计算都是发生在内存中,区别在于:Mapreduce 需要将中间计算的结果写入磁盘,然后再读取磁盘,从而导致了频繁的磁盘io。

spark则不需要将中间计算结果保存在磁盘,得益于RDD(弹性分布式数据集)和DAG(有向无环图)

DAG记录了job的stage以及在job执行过程中父RDD和子RDD之间的依赖关系

中间结果能够以RDD的形式存放在内存中,且能够从DAG中恢复,大大减少了磁盘IO

  1. spark和MapReduce Shuffle,两者至少有一点不同:

MapReduce在Shuffle时需要花费大量时间进行排序,排序在MapReduce的Shuffle中似乎是不可避免的

Spark在Shuffle时则只有部分场景才需要排序,支持基于Hash的分布式聚合,更加省时

  1. 多进程模型 vs 多线程模型的区别

MapReduce采用了多进程模型,而Spark采用了多线程模型。

多进程模型的好处是便于细粒度控制每个任务占用的资源,但每次任务的启动都会消耗一定的启动时间。就是说MapReduce的Map Task和Reduce Task是进程级别的,而Spark Task则是基于线程模型的。

mapreduce 中的 map 和 reduce 都是 jvm 进程,每次启动都需要重新申请资源,消耗了不必要的时间(假设容器启动时间大概1s,如果有1200个block,那么单独启动map进程事件就需要20分钟)

Spark则是通过复用线程池中的线程来减少启动、关闭task所需要的开销。

1.3 spark架构

spark 架构图

1.3.1 角色说明:

  1. Driver用户编写的数据处理逻辑,这个逻辑中包含用户创建的SparkContext。

  2. SparkContext是用户逻辑与Spark集群主要的交互接口,它会和Cluster Manager交互,包括向它申请计算资源等

  3. ClusterManager负责集群的资源管理和调度,现在支持Standalone、Apache Mesos和Hadoop的YARN。

  4. Worker Node是集群中可以执行计算任务的节点

  5. Executor 是在一个Worker Node上为某应用启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上

  6. Task是被送到某个Executor上的计算单元。每个应用都有各自独立的Executor,计算最终在计算节点的Executor中执行。

1.3.2 用户程序从最开始的提交到最终的计算执行,需要经历以下几个阶段:

  1. 用户程序创建SparkContext时,新创建的SparkContext实例会连接到Cluster ManagerCluster Manager会根据用户提交时设置的CPU和内存等信息为本次提交分配计算资源,启动Executor。

  2. Driver会将用户程序划分为不同的执行阶段每个执行阶段由一组完全相同的Task组成,这些Task分别作用于待处理数据的不同分区。在阶段划分完成和Task创建后,Driver会向Executor发送Task

  3. Executor在接收到Task后,会下载Task的运行时依赖,在准备好Task的执行环境后,会开始执行Task,并且将Task的运行状态汇报给Driver

  4. Driver会根据收到的Task的运行状态来处理不同的状态更新。Task分为两种:一种是Shuffle Map Task,它实现数据的重新洗牌,洗牌的结果保存到Executor所在节点的文件系统中;另外一种是Result Task,它负责生成结果数据

  5. Driver会不断地调用Task,将Task发送到Executor执行,在所有的Task都正确执行或者超过执行次数的限制仍然没有执行成功时停止

原文地址:https://www.cnblogs.com/erlou96/p/14297078.html