1、spark架构与作业执行流程简介
运行spark最简单的方法就是通过local模式(即伪分布模式)
./bin/run-example org.apache.examples.SparkPi local
2、基于Standalone的spark架构与作业执行流程
Standalone模式下,集群启动时包括master与worker,其中master负责接受客户端提交的作业,管理worker。提供了web站视集群与作业信息。
名词解释:
- 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。
- 作业相关的名词解释
- Stage :一个Spark作业一般包含一到多个Stage。
- Task:一个stage包含一到多个task,通过多个task实现并行运行的功能。
- DAGScheduler:实现将spark作业分解成一到多个stage,每个stage根据RDD的partition个数决定task的个数,然后生成相应的task set放到taskScheduler中。
- TaskScheduler:实现task分配到executor上执行。
3、提交作业的两种方式
- 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
作业执行流:
作业执行流程描述:
- 客户端提交作业给Master
- master让一个worker启动driver,即schedulerbackend。worker创建一个driver runner线程,driver runner启动schedulerbackend进程
- 另外master还会让其余worker启动executor,即executorbackend。worker创建一个executor runner线程,executor runner会启动executorbackend进程。
- executorbackend启动后回想driver的schedulerbackend注册。schedulerbackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。对于每个stage的task,都会被存放到task scheduler中,executorbackend向schedulerbackend汇报的时候把task scheduler中的task调度到executorbackend执行。
- 所有stage都完成后作业结束。
-
Driver运行在客户端
直接执行Spark作业,作业运行命令如下:
./bin/run-example org.apache.spark.examples.SparkPi spark://host:port
作业执行流如图所示:
作业执行流程描述:
- 客户端启动后直接运行用户程序,启动driver相关的工作:DAGScheduler和BlockManagerMaster等。
- 客户端的Driver向Master注册。
- Master还会让Worker启动Exeuctor。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。
- ExecutorBackend启动后会向Driver的SchedulerBackend注册。Driver的DAGScheduler解析作业并生成相应的Stage,每个Stage包含的Task通过TaskScheduler分配给Executor执行。
- 所有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快?
- 基于内存计算,减少低效的磁盘交
- 高效的调度算法,基于DAG
- 容错机制Linage,精华部分就是DAG和Lingae
8、.Spark技术栈有哪些组件,每个组件都有什么功能,适合什么应用场景?可以分别解释下每个组件的功能和场景
- Spark core:是其它组件的基础,spark的内核,主要包含:有向循环图、RDD、Lingage、Cache、broadcast等,并封装了底层通讯框架,是Spark的基础。
- SparkStreaming是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如Kdfka、Flume、Twitter、Zero和TCP
套接字)进行类似Map、Reduce和Join等复杂操作,将流式计算分解成一系列短小的批处理作业。 - Spark sql:Shark是SparkSQL的前身,Spark SQL的一个重要特点是其能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行外部查询,同时进行更复杂的数据分析
- BlinkDB :是一个用于在海量数据上运行交互式 SQL 查询的大规模并行查询引擎,它允许用户通过权衡数据精度来提升查询响应时间,其数据的精度被控制在允许的误差范围内。
- MLBase是Spark生态圈的一部分专注于机器学习,让机器学习的门槛更低,让一些可能并不了解机器学习的用户也能方便地使用MLbase。MLBase分为四部分:MLlib、MLI、ML Optimizer和MLRuntime。
- GraphX是Spark中用于图和图并行计算
9、广播变量
广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量。广播变量可被用于有效地给每个节点一个大输入数据集的副本。Spark还尝试使用高效地广播算法来分发变量,进而减少通信的开销。 Spark的动作通过一系列的步骤执行,这些步骤由分布式的洗牌操作分开。Spark自动地广播每个步骤每个任务需要的通用数据。这些广播数据被序列化地缓存,在运行任务之前被反序列化出来。这意味着当我们需要在多个阶段的任务之间使用相同的数据,或者以反序列化形式缓存数据是十分重要的时候,显式地创建广播变量才有用。
10、 累加器
累加器是仅仅被相关操作累加的变量,因此可以在并行中被有效地支持。它可以被用来实现计数器和总和。Spark原生地只支持数字类型的累加器,编程者可以添加新类型的支持。如果创建累加器时指定了名字,可以在Spark的UI界面看到。这有利于理解每个执行阶段的进程。(对于python还不支持) 累加器通过对一个初始化了的变量v调用SparkContext.accumulator(v)来创建。在集群上运行的任务可以通过add或者”+=”方法在累加器上进行累加操作。但是,它们不能读取它的值。只有驱动程序能够读取它的值,通过累加器的value方法。