spark入门之路

一、对比MapReduce与Spark的主要区别

  易用性:Spark编程简洁方便
  效率:Map中间结果写入磁盘,效率低下,不适合迭代运算。Spark Job中间输出结果可以保存在内存,不再需要读写HDFS
任务启动开销:MapReduce采用的是多进程模型,Spark采用了多线程模型

二、Spark技术栈

Spark Core:核心组件,分布式计算引擎
Spark SQL:高性能的基于Hadoop的SQL解决方案
Spark Streaming:可以实现高吞吐量、具备容错机制的准实时流处理系统
Spark GraphX:分布式图处理框架 Spark
MLlib:构建在Spark上的分布式机器学习库

三、架构设计

1、运行架构

在这里插入图片描述
Spark Application提交流程

1.提交应用程序Application(包括Driver代码和Executor代码)启动Driver,创建SparkContext对象,并加载配置信息、依赖信息和代码

2.DAG graph:根据用户提交的计算逻辑(Application)中的RDD的转换和动作来生成RDD之间的依赖关系,同时这个计算链也就生成了逻辑上的DAG(有向无环图)。

3.DAGScheduler:基于stage的调度器,负责创建Job,将DAG中的RDD划分到不同的Stage,并将Stage作为TaskSet提交给底层调度器TaskScheduler执行。

4.TaskScheduler:任务调度器,Spark通过它提交任务并且请求集群调度任务。因其调度的 Task 由 DAGScheduler 创建,所以DAGScheduler是TaskScheduler的前置调度。

5.SparkContext可以连接不同类型的Cluster Manager(Standalone,YARN,Mesos)并根据DAGSchduler向Cluster Manager申请资源(需要多少个Executor)

6.一个Worker节点默认一个Executor,如果集群并发度较高(需要运行很多个Application)则需要开启单节点多Executor模式,通过SPARK_WORKER_INSTANCES调整

7.Cluster Manager将Executor的节点信息反馈给SparkContext

8.SparkContext通过SchedulerBackend给任务分配Executor资源
再通过TaskScheduler把任务调度到对应的Worker节点上的Executor

9.Executor有一个线程池,每个线程(core)可以执行一个task
  当Executor收到一个TaskSet之后,会启动多个线程对这一批task并行计算
  每一个task处理一个RDD分区,因此每一次并行计算会生成新的RDD分区(即map,flatMap,reduce等转换算子操作)
  然后Driver会根据新的RDD向Executor提交新的task,直至stage结束(遇到shuffle)
  因为stage是以shuffle(宽依赖)来划分的,因此这个过程不存在跨分区(窄依赖有利于高并发)。

10.当Executor上的task全部执行完成后,如果需要进行shuffle(发生宽依赖)才能进入下一步计算
则会根据DAG找到相应的Worker节点,将生成的RDD数据集迁移到当前Executor上进行计算

11.以Action算子为Job结束的标志,将结果数据落盘或输出控制台。
通过DAG判断所有Job是否执行完毕,是的话则将结果带回SparkContext,并反馈Cluster Manager,释放SparkContext资源。

12.Executor可以为应用程序中要求缓存的RDD提供内存式存储,RDD是直接缓存在Executor进程内的。
如果某个Job过程中产生的RDD数据集要跟其他的Job共用,那么在这个Job计算的过程可以调用cache或persist方法把数据缓存。

2、Spark架构核心组件及其作用

Application:建立在Spark上的用户程序,包括Driver代码和运行在集群各节点Executor中的代码。

Driver program:驱动程序。Application中的main函数并创建SparkContext。
➢ 将用户程序转化为作业(job)
➢ 在 Executor 之间调度任务(task)
任务调度分为两个模块:DAGScheduler(建立DAG图,划分Stage)和TaskScheduler(通过ClusterManager启动节点上的Executor)

SchedulerBackend:每个 TaskScheduler 对应一个 SchedulerBackend,作用是分配当前可用的资源,具体就是向当前等待分配计算资源的 Task 分配计算资源(Executor),并在分配的 Executor 上启动 Task,完成计算的调度过程
➢ 跟踪 Executor 的执行情况
➢ 通过 UI 展示查询运行情况

Cluster Manager :
➢ 在集群(Standalone、Mesos、YARN)上获取资源的外部服务。

Executor:集群中工作节点worker中的一个JVM进程,运行具体任务,专门用于计算。
➢ 负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程
➢ 它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

Master:
➢ Master 是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责,类似于 Yarn 环境中的 RM
Worker Node:集群中任何可以运行Application代码的节点。
➢ 由 Master 分配资源对数据进行并行的处理和计算,类似于 Yarn 环境中 NM。

Task:被送到某个Executor上的工作单元。
➢Spark 中的任务分为两种:ShuffleMapTask 与 ResultTask。
Job :包含多个Task组成的并行计算,往往由Spark Action算子触发生成,一个Application中往往会产生多个Job。
➢每触发一次action动作算子就会产生一个Job,Job内部会根据是否有shuffle过程分割为多个Stage
Stage:每个Job会被拆分成多组Task,作为一个TaskSet,其名称为Stage

四、核心API

SparkContext,连接Driver与Spark Cluster(Workers),是Spark的主入口,每个JVM仅能有一个活跃的SparkContext,创建方式SparkContext.getOrCreate

import org.apache.spark.{SparkConf, SparkContext}

object CteateSparkContext {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[2]")
      .setAppName(this.getClass.getName)
    
    val sc: SparkContext = SparkContext.getOrCreate(conf)
    
  }
}

SparkSession是Spark 2.0+应用程序的主入口:包含了SparkContext、SQLContext、HiveContext以及StreamingContext。使用方法为SparkSession.getOrCreate

import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession

object CreateSparkSession {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder()
      .appName(this.getClass.getName)
      .master("local[2]")
      .getOrCreate()
      
    //使用SparkSession创建SparkContext
    val sc: SparkContext = spark.sparkContext
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值