spark笔记

1、spark架构与作业执行流程简介

运行spark最简单的方法就是通过local模式(即伪分布模式)

./bin/run-example org.apache.examples.SparkPi local

2、基于Standalone的spark架构与作业执行流程

Standalone模式下,集群启动时包括masterworker,其中master负责接受客户端提交的作业,管理worker。提供了web站视集群与作业信息。

名词解释:

  1. Stand alone模式下存在的角色
    • Client:客户端进程,负责提交作业到master
    • Master:Standalone模式中主控节点,负责接受client提交的作业,管理worker,并命令worker启动driver和executor。
    • Worker:Standalone模式中slave节点上的守护进程,负责管理本节点的资源,定期向master汇报心跳,接受master的命令,启动driver和executor
    • Driver:一个spark作业运行时包括一个driver进程,也是作业的主进程,负责作业的解析、生成stage并调度Task到Executor上。包括DAGScheduler,Task Scheduler。
    • Executor:即真正执行作业的地方,一个级群一般包含多个Executor,每个Executor接受Driver的命令Launch Task,一个Executor可以执行一到多个Task。
  2. 作业相关的名词解释
    • Stage :一个Spark作业一般包含一到多个Stage。
    • Task:一个stage包含一到多个task,通过多个task实现并行运行的功能。
    • DAGScheduler:实现将spark作业分解成一到多个stage,每个stage根据RDD的partition个数决定task的个数,然后生成相应的task set放到taskScheduler中。
    • TaskScheduler:实现task分配到executor上执行。

3、提交作业的两种方式

  1. Driver运行在Worker上

通过org.apache.spark.deploy.Client类执行作业,作业运行命令如下:

./bin/spark-class org.apache.spark.deploy.Client launch spark://host:port file:///jar_url org.apache.spark.examples.SparkPi spark://host:port

作业执行流:

1546767567526

作业执行流程描述:

  1. 客户端提交作业给Master
  2. master让一个worker启动driver,即schedulerbackend。worker创建一个driver runner线程,driver runner启动schedulerbackend进程
  3. 另外master还会让其余worker启动executor,即executorbackend。worker创建一个executor runner线程,executor runner会启动executorbackend进程。
  4. executorbackend启动后回想driver的schedulerbackend注册。schedulerbackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。对于每个stage的task,都会被存放到task scheduler中,executorbackend向schedulerbackend汇报的时候把task scheduler中的task调度到executorbackend执行。
  5. 所有stage都完成后作业结束。
  1. Driver运行在客户端

    直接执行Spark作业,作业运行命令如下:

    ./bin/run-example org.apache.spark.examples.SparkPi spark://host:port
    

    作业执行流如图所示:

    1546769020634

作业执行流程描述:

  1. 客户端启动后直接运行用户程序,启动driver相关的工作:DAGScheduler和BlockManagerMaster等。
  2. 客户端的Driver向Master注册。
  3. Master还会让Worker启动Exeuctor。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。
  4. ExecutorBackend启动后会向Driver的SchedulerBackend注册。Driver的DAGScheduler解析作业并生成相应的Stage,每个Stage包含的Task通过TaskScheduler分配给Executor执行。
  5. 所有stage都完成作业结束。

4、stage,task和job的区别与划分方式

job:一个由多个任务组成的并行计算,当你需要执行一个rdd的action的时候,会生成一个job。

stage:每个 Job 被拆分成更小的被称作 stage(阶段) 的 task(任务) 组,stage 彼此之间是相互依赖的,各个 stage 会按照执行顺序依次执行。

Task:一个将要被发送到 Executor 中的工作单元。是stage的一个任务执行单元,一般来说,一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个 partition 上的数据。

5、flatmap和map的区别

map:对集合中每个元素进行操作。

flatMap:对集合中每个元素进行操作然后再扁平化。

6、dataframe和dataset区别?

其实dataset就是dataframe的升级版,相当于dataframe是dataset的子集,主要区别在于,在spark2.0以后的dataset添加的编码器,在dataframe中他不是面向对象的编程思维,而在dataset中变成面向对象编程,同时dataset相当于dataframe和rdd的整合版,操作更加灵活

7、10.Spark为什么比mapreduce快?

  1. 基于内存计算,减少低效的磁盘交
  2. 高效的调度算法,基于DAG
  3. 容错机制Linage,精华部分就是DAG和Lingae

8、.Spark技术栈有哪些组件,每个组件都有什么功能,适合什么应用场景?可以分别解释下每个组件的功能和场景

  1. Spark core:是其它组件的基础,spark的内核,主要包含:有向循环图、RDD、Lingage、Cache、broadcast等,并封装了底层通讯框架,是Spark的基础。
  2. SparkStreaming是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如Kdfka、Flume、Twitter、Zero和TCP
    套接字)进行类似Map、Reduce和Join等复杂操作,将流式计算分解成一系列短小的批处理作业。
  3. Spark sql:Shark是SparkSQL的前身,Spark SQL的一个重要特点是其能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行外部查询,同时进行更复杂的数据分析
  4. BlinkDB :是一个用于在海量数据上运行交互式 SQL 查询的大规模并行查询引擎,它允许用户通过权衡数据精度来提升查询响应时间,其数据的精度被控制在允许的误差范围内。
  5. MLBase是Spark生态圈的一部分专注于机器学习,让机器学习的门槛更低,让一些可能并不了解机器学习的用户也能方便地使用MLbase。MLBase分为四部分:MLlib、MLI、ML Optimizer和MLRuntime。
  6. GraphX是Spark中用于图和图并行计算

9、广播变量

​ 广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量。广播变量可被用于有效地给每个节点一个大输入数据集的副本。Spark还尝试使用高效地广播算法来分发变量,进而减少通信的开销。 Spark的动作通过一系列的步骤执行,这些步骤由分布式的洗牌操作分开。Spark自动地广播每个步骤每个任务需要的通用数据。这些广播数据被序列化地缓存,在运行任务之前被反序列化出来。这意味着当我们需要在多个阶段的任务之间使用相同的数据,或者以反序列化形式缓存数据是十分重要的时候,显式地创建广播变量才有用。

10、 累加器

​ 累加器是仅仅被相关操作累加的变量,因此可以在并行中被有效地支持。它可以被用来实现计数器和总和。Spark原生地只支持数字类型的累加器,编程者可以添加新类型的支持。如果创建累加器时指定了名字,可以在Spark的UI界面看到。这有利于理解每个执行阶段的进程。(对于python还不支持) 累加器通过对一个初始化了的变量v调用SparkContext.accumulator(v)来创建。在集群上运行的任务可以通过add或者”+=”方法在累加器上进行累加操作。但是,它们不能读取它的值。只有驱动程序能够读取它的值,通过累加器的value方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章