1.Spark架构:
官网网址:内容要背下来
http://spark.apache.org/docs/latest/cluster-overview.html
(1)Spark Application: 1个driver + 多个exector
(2)Application jar: 打包生成的jar包
(3)Driver program: 运行application中的main方法并且创建一个SparkContext
(4)Cluster manager: 一个从cluster中申请资源的外部服务
(5)Deploy mode: 决定 drive进程跑在哪里, 如果是 client,表示driver跑在本地,如果是cluster,表示跑在集群里面
(6)Executor :启动应用程序的进程在workernodes上,它能够运行多个task,保存数据到disk和memory中,每个应用程序都有自己的executors
(7)Task:作业的基本单元,每个task都会被送到executor上执行
(8)job:众多task组成的并行计算,一个Spark的action算子产生一个job
(9)stage:一个job会有很多stages,根据shuffle决定, 只要有shuffle就会一分为两个stage,一个stage下会有多个task,stage之间是存在依赖关系的。(例如:map和reduce,必须map先执行完成再执行reduce)
注:grouby和reduceByKey都会触发shuffle,一个stage的task数是由分区数决定的,一个partition就是一个task。
(10)cache:它是一个lazy,将数据缓存到内存中,缓存后的数据会变大。
面试题:cache():底层调用persist()方法
persist():底层调用persist方法重载,传入MEMORY_NOLY参数
unpersist():去掉缓存
(11)面试题:
窄依赖:(Narrow)一个父RDD的partition只能被一个子RDD的partition使用一次
宽依赖:(Wide,shuffle后的就是宽依赖)一个父RDD的partition能被一个子RDD的partition使用多次
注:(问join是不是宽依赖,这里需要分情况)
(12)面试题:
reduceByKey是哪一个类里面的:PairRDDFunction(底层用了隐式转换,new了PairRDDFuction对象,将rdd传入进去)
2.架构图:
应用程序他是一堆独立的进程在集群上,它是通过SparkContext对象在你的main方法中。
为了能让应用程序跑在集群上,SparkContext需要连接到集群管理器上(Cluster Manager),
Cluster Manager会去申请资源,一旦资源拿到,就会有Executor在Worker Node上运行,executor是一顿进程,能够运行计算和存储我们的数据,SparkContext会将你的应用程序代码发送到executors上,最终,SparkContext发送你的tasks到executor上执行。
3.在这个架构上需要注意的事情:
(1)每个应用程序都有自己的exceutors进程
(2)Spark不关注地城集群管理,他可以运行在任意(YARK,Mesos)
(3)Driver 要与 Executor一直保持通信
(4)由于 driver是用来调度tasks在集群上,所以driver应该运行靠近 worker nodes