**一 spark **
Spark是一个分布式计算框架 ,你对 RDD 进行 map 操作,其实是对它里面的每一个分区进行 map 进行操作
你对 RDD 里面的数据进行操作,其实 RDD 里面 不装数据, RDD里面有多个分区 ,每个分区会生成 多个 task
你对 RDD 操作,本质上是对 RDD 里面的每个分区进行操作 ,分区会记录你的操作信息(调哪个方法,传哪个函数)
以后会根据这个分区信息 生成task
spark程序的流程 :
读取或者转化数据创建一系列 RDD ,然后使用转化操作生成新的 RDD ,最后使用 行动操作得到结果 或或者将数据存储到文件存储系统中,
spark 程序 其实就是 隐式的创建杵了一个由上述操作组成的逻辑上的有向无环图,当Drive 程序运行时 ,它会把这个逻辑图转为物理执行计划
二 shuffle
概念 : 需要通过网络将数据传输到多台机器,数据被打散,但是有网络传输,不一定就有shuffle
1) 上游 RDD 的 一个分区将数据给了下游的 RDD 的多个分区,就是 shuffle
需要注意的是 ,shuffle 过程是下游的 Task 到 上游拉取数据,不是上游的 Task 发送给下游的
2) shuffle 的功能是将 具有一定规律的数据按照 指定的分区器的分区规则 ,通过网络传输到指定的一台机器的 一个分区中 即 Task 中
3) 下游的一个分区 来自上游的多个分区 ,上游的一个 RDD 分区给到下游的多个分区,只要存在这种可能性就是shuffle
三 map 和 mapPartitions 有啥区别,哪个效率更高
答: 在一般的场景下效率是一样的,如果有特殊的场景 :
比如想访问一下数据库,关联一些维度的数据
1) 如果在 map 方法里用到数据库的连接,每拿一条数据创建一个连接
2)如果用 mapPartitons 事先可以把这个连接创建好,以后可以将每个分区里面的多条数据迭代出来,用你事先创建好的链接 会更加高效一些
四 什么是 DAG
概念: 有向无环图:代表有方向的,无闭合的
是对多个 RDD 转换过程和依赖关系的描述
触发 Action 就会形成 一个完整的 DAG,一个 DAG 就是一个 job
五 什么是 Aplication
使用 SparkSubmit 向集群里面提交的一个计算机应用
一个 Application 中可以触发 一到 多次的 Action ,触发一次Action,形成一个DAG,对应一个 job
一个 Appliction 中可以有 一到多个 job
六 --executor-memory 512m
512m 的意思 :
如果你想要的内存不够 ,它不会立即退出,它会等一会
七 master
负责资源的调度
八 Drive 和 Executor
Drive
(1) 把用户程序转为任务
程序负责把用户程序转换为多个物理执行单元,这些单元也被 称为任务(task)
(2)跟踪 Executor 的运行状况
有了物理执行计划之后,Driver 程序必须再各个 Executor 进程间协调任务的调度,Exector 进程启动后,会向 Driver 进程注册自己,因此 Driver进程就可以跟踪应用中所有的 Executor节点的信息
(3)为 Ececutor 节点调度任务
Drive 程序会根据当前的 Executor 节点集合 ,尝试把所有 Task 基于数据所在位置分配给合适的 Executor 进程 ,当 Task 执行时, Executor进程会把缓存数据村粗起来,而 Driver 进程同样会跟踪这些缓存数据 的位置,并且利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输
4)UI展示应用运行状况
Executor(执行器节点)
Spark Executor节点是一个工作进程,负责在Spark 作业中运行任务,任务间相互独立。Spark 应用启动时,Executor 节点被同事启动,并且始终伴随着整个Spark 应用的生命周期而存在,如果有 Executor 系欸但发生了故障或崩溃,Spark 应用也可以继续执行,会将出错的节点上的任务调度到其他Executor节点上继续运行
执行器进程有两大作用 :
1 它们负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程
2 它们通过自身的块管理器(Block Manager)为用户程序要求缓存的RDD提供内存式存储
RDD 是直接缓存在 Executor 进程内的 ,因此任务可以运行时充分利用缓存数据加速运算
执行器程序通常都运行在专用的进程中。