Spark Core 02(理论),独立的进程集

时间:2021-03-04 13:20:14   收藏:0   阅读:0

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的坑
技术图片

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!