标签:form 发送 spark 分配 机制 主程序 partition 故障 理论
Application
Application=a driver program + executors
一般来说:1个SparkContext = 1个application=1个SparkShell
Spark提交任务不一定须在集群里提交,有gateway就行
1个application ==> 有n jobs ==> 有n stages ==> 有n tasks(n表示多个)
partition数 == task数
Cluster Mode Components:
Spark应用程序在集群中运行为独立的进程集,由主程序中的Sparkcontext对象协调 (called the driver program).
具体地说,要在集群上运行,SparkContext可以连接到几种类型的集群管理器(Spark自己独立的集群manager、Mesos或 Yarn),它们在应用程序之间分配资源。一旦连接,Spark就在集群中的节点上获取执行器,这些进程运行计算并为应用程序存 储数据。接下来,它将应用程序代码(通过jar或Python文件定义为SparkContext)发送给执行程序。最后,SparkContext将任务 发送给执行器运行。
注意事项:
1.每个应用程序都有自己的执行器进程,这些进程在整个应用程序的持续时间内运行,并在多个线程中运行任务。这有利于在调 度时(每个driver调度自己的任务时)和执行时(不同的应用和不同的JVM中的任务)隔离每个任务。然而,这也意味着数据不能在不同的Spark应用程序中共享,除非将其写入外部存储系统。
2.Spark不识别底层的集群管理器。
3.驱动程序必须在其生命周期内监听并接受来自执行器的通信信息。
4.因为驱动程序在集群上调度任务,所以它应该靠近工作节点,最好在同一局域网上运行。
架构图:
Cache:
Spark中最重要的功能之一是在内存中持久化(或缓存)数据集。当您缓存RDD时,每个节点都存储有它在内存中计算的任何分区,并在该数据集上的其他操作(或从它派生的数据集)中重用它们。
cache 是lazy的机制,相似于transformation
unpersist eager
cache和persist的区别(直接看源码定义):
def persist() = persist(StorageLevel.MEMORY_ONLY)
def cache() = persist()
class StorageLevel private(
private var _useDisk: Boolean, //是否存到磁盘
private var _useMemory: Boolean, //是否存到内存
private var _useOffHeap: Boolean, //使用堆外内存
private var _deserialized: Boolean, //是否使用反序列化(序列化消耗内存,可永久化数据)
private var _replication: Int = 1) //副本数
MEMORY_ONLY (false, true, false, true)
如何抉择用哪种StorageLevel:
1.如果您的RDDS与默认存储级别(MeimyIyOnLead)适配,那么就用它。这是CPU效率最高的选项,允许RDDS上的操作尽可能快地运行。
2.如果不适配,尝试使用MEMORY_ONLY_SER并选择快速序列化库,以使对象更具空间效率,仍然可以相当快地访问。(Java和Scala 内存不够了就用它)
3.尽可能的不要存储到磁盘
4.用于故障时快速恢复数据,所有的存储层都通过重新计算丢失的数据提供完全容错。(不推荐,占空间)
Dependency
窄依赖
一个父RDD的partition至多被子RDD的某个partition使用一次(pipeline)
宽依赖
一个父RDD的partition会被子RDD的partition使用多次
遇到宽依赖,Stage就会被拆分
shuffle ==> stage
即遇到n个shuffle,就有n+1个Stage
补充:
StorageLevel详解
getOrElse的坑
标签:form 发送 spark 分配 机制 主程序 partition 故障 理论
原文地址:https://www.cnblogs.com/cnjf/p/14477134.html