爱吃芒果

Spark Standalone

Spark集群可以使用不同的方式进行部署,比如Standalone、Mesos, YARN和Kubernetes,这几个版本的主要区别在于:Standalone版本的资源管理和任务调度器由Spark系统本身提供,其他版本的资源管理和任务调度器依赖于第三方框架,如YARN可以同时管理Spark任务和Hadoop MapReduce任务。

Spark错误容忍机制

Spark的错误容忍机制的核心方法主要有两种:

  1. 通过重新执行计算任务来容忍错误,当job抛出异常不能继续执行时,重新启动计算任务,再次执行
  2. 通过采用checkpoint机制,对一些重要的输入、输出、中间数据进行持久化,这可以在一定程度上解决数据丢失问题,而且能够提高任务重新计算时的效率。

Spark采用了延迟删除策略,将上游stage的Shuffle Write的结果写入本地磁盘,只有在当前job完成后,才删除Shuffle Writre写入磁盘的数据。这样,即使stage2中某个task执行失败,但由于上游的stage0和stage1的输出数据还在磁盘上,也可以再次通过Shuffle Read读取得到相同的数据,避免再次执行上游stage中的task,所以,Spark根据ShuffleDependency切分出的stage既保证了task的独立性,也方便了错误容忍的重新计算。

Spark数据缓存

缓存机制实际上是一种空间换时间的方法,集体的,如果数据满足一下3条,就可以进行缓存.

  1. 会被重复使用的数据。更确切地,会被多个job共享使用的数据。被共享使用的次数越多,那么缓存该数据的性价比越高。一般来说,对于迭代型和交互型应用非常适合。
  2. 数据不宜过大。过大会占用大量的存储空间,导致内存不足,也会降低数据计算时可使用的空间。虽然缓存数据过大时也可以存放到磁盘,但磁盘的I/O代价比较高,有时甚至不如重新计算块。
  3. 非重复缓存的数据。重复缓存的意思是如果缓存了某个RDD,那么该RDD通过OneToOneDependency连接的parent RDD就不需要被缓存了,除非有job不使用缓存的RDD,而直接使用parent RDD。

包含数据缓存操作的应用执行流程生成的规则:Spark首先假设应用没有数据缓存,正常生成逻辑处理流程(RDD之间的数据依赖关系),然后从第2个job开始,将cached RDD 之前的RDD都去掉,得到削减后的逻辑处理流程。最后,将逻辑处理流程转化为物理执行计划。

Spark Job执行流程

// CoarseGrainedExecutorBackend
case LaunchTask(data) =>
  if (executor == null) {
    exitExecutor(1, "Received LaunchTask command but executor was null")
  } else {
    val taskDesc = TaskDescription.decode(data.value)
    logInfo(log"Got assigned task ${MDC(LogKeys.TASK_ID, taskDesc.taskId)}")
    executor.launchTask(this, taskDesc)
  }

接收到Drive端传来的task,反序列化后,启动task