Spark基础及架构

一、认识Spark

        Spark是用于大规模数据处理的统一分析引擎。

  • Speed
    • Apache Spark使用最新的DAG调度程序,查询优化器和物理执行引擎,为批处理数据和流数据提供了高性能;
  • Ease of Use
    • 使用Java,Scala,Python,R和SQL快速编写应用程序;
  • Generality
    • Spark提供了SparkSQL、Streaming、MLlib、GraphX,功能强大。一站式解决需求;
  • Runs Everywhere
    • 可以在EC2,Hadoop YARN,Mesos或Kubernetes上使用其独立集群模式运行Spark 。访问HDFS, Alluxio, Apache Cassandra, Apache HBase, Apache Hive以及数百种其他数据源中的数据;

1.1 Spark与 MapReduce比较

  • 易用性
    • MapReduce中对于数据处理只提供了两个操作,即Map和 Reduce;同样的功能换成Spark,最短只需一行代码即可完成;
  • 效率
    • MapReduce中需要进行大量的磁盘IO操作,效率低下。中间结果写入磁盘。Spark Job中间输出结果可以保存在内存,不再需要读写 HDFS;
  • 任务启动开销
    • Spark和 Hadoop MapReduce都实现了异步并发模型,而 MapReduce采用的是多进程模型,Spark采用了多线程模型。采用了多线程模型;多线程模型便于细粒度控制每个任务占用的资源,但会消耗较多的启动时间,不适合运行低延迟类型的作业;而Spark则适合运行低延迟类型的作业;

1.2 Spark技术栈

  • Spark Core
    • 核心组件,分布式计算引擎。其实现了Spark的作业调度、内存管理、容错、与存储系统交互等基本功能,并针对弹性分布式数 据集(RDD)提供了丰富的操作;
  • Spark SQL
    • 一个高性能的基于Hadoop的 SQL解决方案。部分用法与 Hive非常类似;
  • Spark Streaming
    • 基于Spark Core实现的高吞吐量、具备容错机制的准实时流处理系统。将流式计算分解成一系列小批处理作业,也称微批处理;
  • Spark GraphX
    • 分布式图处理框架,支持图并行计算;
  • Spark MLlib
    • 构建在Spark上的分布式机器学习库。是 Spark对常用的机器学习算法的实现库,还提供了相关的测试与数据生成器;

二、Spark架构与运行环境

2.1 Spark环境部署

2.2 Spark架构

Spark的运行架构:

  • 在驱动程序中,通过SparkContext主导应用的执行;
  • SparkContext可以连接不同类型的Cluster Manager(Standalone、YARN、Mesos),连接后,获得集群节点上的Executor;
  • 一个Worker节点默认一个Executor,可通过SPARK_WORKER_INSTANCES调整;
  • 每个应用获取自己的Executor;
  • 每个Task处理一个RDD分区;
    在这里插入图片描述

Spark核心组件:

  • Application:建立在 Spark上的用户程序,包括 Driver代码和运行在集群各节点 Executor中的代码;
  • Driver program:驱动程序。 Application中的 main函数并创建 SparkContext;
  • Cluster Manager:在集群(Standalone、Mesos、YARN)上获取资源的外部服务;
  • Worker Node:集群中任何可以运行 Application代码的节点;
  • Executor:某个 Application运行在 worker节点上的一个进程;
  • Task:被送到某个 Executor上的工作单元;
  • Job:包含多个Task组成的并行计算,往往由 Spark Action算子 触发生成,一个Application中往往会产生多个 Job;
  • Stage:每个 Job会被拆分成多组 Task,作为一个 TaskSet,其名称为 Stage;

Attention:Spark RDD包括四类算子:创建算子、转换算子、持久化算子及 Action算子一个 Action算子对应一个 Job,其余的算子对应一个 Task.


2.3 Spark 编程入口

        在开发过程中,常用API主要有: SparkContext、 SparkSession、 RDD、 DataSet及 DataFrame,这里主要介绍 SparkContext、 SparkSession。

2.3.1 SparkContext

从前面Spark运行架构图中可以看出, SparkContext是连接Driver、 Worker以及Cluster Manager Master)的桥梁。作为 Spark应用程序的核心、编程入口,SparkContext主要完成了如下工作:

  • RDD graph:生成RDD 依赖关系图DAG。SparkContext会根据用户提交的计算逻辑(Application)中的RDD的转换和动作来生成RDD之间的依赖关系,同时这个计算链也就生成 了 逻辑上的DAG;
  • DAGScheduler::为高级的、基于 Stage的调度器, 负责创建Job,将DAG 中的RDD 划分到不同的 Stage,并将 Stage作为 Tasksets提交给底层调度器TaskScheduler执行;
  • TaskScheduler::为Spark的任务调度器,Spark通过他提交任务并且请求集群调度任务。因其调度的 Task由DAGScheduler创建,所以DAGScheduler是TaskScheduler的前置调度;
  • SchedulerBackend:是一个trait,作用是分配当前可用的资源。具体即向当前等待分配计算资源的Task分配计算资源(即Executor);
  • ListenerBus:SparkContext中的事件总线,可以接收各种使用方的事件,并且异步传递Spark事件监听与SparkListeners监听器的注册;
  • BlockManager:属于SparkEnv组件中的成员,一个嵌入在 spark 中的key value型分布式存储系统(类似 HDFS)。SparkEnv是SparkContext中非常重要的类,它维护着Spark的执行环境,所有的线程都可以通过SparkContext访问到同一个SparkEnv对象。parkEnv还包括ShuffleManger、SecurityManager、CacheManger等;

2.3.2 SparkSession

        SparkSession是 SparkSQL的入口 ,是在 2.0中引入的新的 API。旨在为 Spark编程提供统一的编程入口,意味着 SparkSession整合了 SparkConf、 SparkContext、SQLContext、 HiveContext以及 StreamingContext,其中 SQLContext、 HiveContext是为了保持兼容被保留, StreamingContext在未来可能会被加入。

        可以发现,当创建了SparkSession对象后,可以间接拿到 sparkContext与sqlContext对象。所以在 2.0版本后推荐使用 SparkSession作为编程入口。

        手动创建SparkSession:

import org.apache.spark.sql.SparkSession
object Test{
  def main(args: Array[String]): Unit = {
  	val conf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[4]")
  	val spark = SparkSession.builder().config(conf).getOrCreate()
   }
}	 

三、RDD—Spark核心数据结构

3.1 RDD概念

        RDD称为弹性分布式数据集( Resilient Distributed Datasets),它是一种分布式的内存抽象,允许在大型集群上执行基于内存的计算( In Memory Computing为用户屏蔽了底层复杂的计算和映射环境。

  • 简单来说:RDD是将数据项拆分为多个分区的集合,存储在集群的工作节点上的内存和磁盘中,并执行正确的操作;
  • 复杂来说:
    • RDD是用于数据转换的接口 ,比如map、filter、groupBy、join等;
    • RDD指向了存储在 HDFS、 Cassandra、 HBase等、或缓存(内存、内存 +磁盘、仅磁盘等),或在故障缓存收回时重新计算其他 RDD分区中的数据 。从这个意义上讲, RDD不包含任何待处理数据;
弹性:RDD默认存放在内存中,当内存不足,Spark自动将RDD写入磁盘;
分布式数据集:RDD是只读的、分区记录的集合,每个分区分布在集群的不同节点上;
                         RDD并不存储真正的数据,只是对数据和操作的描述;
容错性:根据数据血统,可以自动从节点失败中恢复分区;

3.2 RDD特性

RDD共有五大特性:

  • 分区(Parition):RDD是由多个分区构成的;RDD分区概念与MapReduce的输入切片概念是类似的。对每个分区的运算会被一个当作一个Task执行。换句话说,分区是Spark任务执行的基本单位;
    • 分区规则1:只有Key Value类型的RDD才有分区器 ,非Key Value类型的 RDD PairRDD分区器的值是 None;
    • 分区规则2:每个RDD的分区 ID范围: 0~numPartitions 1,决定这个值是属于哪个分区的 ;
  • compute函数:每个分区上都有compute函数,计算该分区中的数据;
  • RDD间的依赖(DAG):RDD有依赖性,通常情况下一个 RDD是来源于另一个RDD,这个叫做 lineage(依赖)。RDD会记录下这些依赖,方便容错。也称DAG。如下图所示,
  • 分区器(Partitioner):RDD的分区器是一个可选项,如果RDD里面存的数据是key value形 式,则可以传递一个自定义的 Partitioner进行重新分区;
  • 分区优先位置列表:该列表存储了存取每个分区的优先位置;

PS:如果有写错或者写的不好的地方,欢迎各位大佬在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!

原创作者:wsjslient

作者主页:https://blog.csdn.net/wsjslient


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值