第17课:SparkStreaming资源动态申请和动态控制消费速率原理剖析

原创 2016年05月31日 16:08:42

为什么需要动态?
a) Spark默认情况下粗粒度的,先分配好资源再计算。对于Spark Streaming而言有高峰值和低峰值,但是他们需要的资源是不一样的,如果按照高峰值的角度的话,就会有大量的资源浪费。
b) Spark Streaming不断的运行,对资源消耗和管理也是我们要考虑的因素。
Spark Streaming资源动态调整的时候会面临挑战:
Spark Streaming是按照Batch Duration运行的,Batch Duration需要很多资源,下一次Batch Duration就不需要那么多资源了,调整资源的时候还没调整完Batch Duration运行就已经过期了。这个时候调整时间间隔。

SparkStreaming资源动态申请
1. 在SparkContext中默认是不开启动态资源分配的,但是可以通过手动在SparkConf中配置。

// Optionally scale number of executors dynamically based on workload. Exposed for testing.
val dynamicAllocationEnabled = Utils.isDynamicAllocationEnabled(_conf)
if (!dynamicAllocationEnabled && 
//参数配置是否开启资源动态分配
_conf.getBoolean("spark.dynamicAllocation.enabled", false)) {
  logWarning("Dynamic Allocation and num executors both set, thus dynamic allocation disabled.")
}
 
_executorAllocationManager =
  if (dynamicAllocationEnabled) {
    Some(new ExecutorAllocationManager(this, listenerBus, _conf))
  } else {
    None
  }
_executorAllocationManager.foreach(_.start())
2.  ExecutorAllocationManager: 有定时器会不断的去扫描Executor的情况,正在运行的Stage,要运行在不同的Executor中,要么增加Executor或者减少。
3.  ExecutorAllocationManager中schedule方法会被周期性触发进行资源动态调整。
/**
 * This is called at a fixed interval to regulate the number of pending executor requests
 * and number of executors running.
 *
 * First, adjust our requested executors based on the add time and our current needs.
 * Then, if the remove time for an existing executor has expired, kill the executor.
 *
 * This is factored out into its own method for testing.
 */
private def schedule(): Unit = synchronized {
  val now = clock.getTimeMillis
 
  updateAndSyncNumExecutorsTarget(now)
 
  removeTimes.retain { case (executorId, expireTime) =>
    val expired = now >= expireTime
    if (expired) {
      initializing = false
      removeExecutor(executorId)
    }
    !expired
  }
}
4.  在ExecutorAllocationManager中会在线程池中定时器会不断的运行schedule.
/**
 * Register for scheduler callbacks to decide when to add and remove executors, and start
 * the scheduling task.
 */
def start(): Unit = {
  listenerBus.addListener(listener)
 
  val scheduleTask = new Runnable() {
    override def run(): Unit = {
      try {
        schedule()
      } catch {
        case ct: ControlThrowable =>
          throw ct
        case t: Throwable =>
          logWarning(s"Uncaught exception in thread ${Thread.currentThread().getName}", t)
      }
    }
  }
// intervalMillis定时器触发时间
  executor.scheduleAtFixedRate(scheduleTask, 0, intervalMillis, TimeUnit.MILLISECONDS)
}

动态控制消费速率:
Spark Streaming提供了一种弹性机制,流进来的速度和处理速度的关系,是否来得及处理数据。如果不能来得及的话,他会自动动态控制数据流进来的速度,spark.streaming.backpressure.enabled参数设置。

  • 资料来源于:DT_大数据梦工厂(Spark发行版本定制

  • DT大数据梦工厂微信公众号:DT_Spark 

  • 新浪微博:http://www.weibo.com/ilovepains

  • 王家林老师每晚20:00免费大数据实战

YY直播:68917580



 

Spark Streaming资源动态申请和动态控制消费速率原理剖析

为什么需要动态? a) Spark默认情况下粗粒度的,先分配好资源再计算。对于Spark Streaming而言有高峰值和低峰值,但是他们需要的资源是不一样的,如果按照高峰值的角度的话,就会有大量...
  • snail_gesture
  • snail_gesture
  • 2016年05月31日 09:35
  • 2623

第17课:spark streming资源动态申请和动态控制消费速率原理剖析

第17课:spark streming资源动态申请和动态控制消费速率原理剖析 /* 王家林老师授课http://weibo.com/ilovepains  每天晚上20:00YY频道现场授课频道68...
  • duan_zhihua
  • duan_zhihua
  • 2016年05月28日 07:49
  • 405

Spark定制班第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析

Spark是粗粒度的,即在默认情况下会预先分配好资源,在进行计算。 好处是资源提前分配好,有计算任务时就直接使用使用计算资源,不用再考虑资源分配。 不好的地方是,有高峰值和低峰值时的资源不一样的。资源...
  • andyshar
  • andyshar
  • 2016年05月29日 07:20
  • 2175

第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析

高级特性: 1、Spark Streaming资源动态分配 2、Spark Streaming动态控制消费速率 原理剖析,动态控制消费速率其后面存在一套理论,资源动态分配也有一套理论。 先讲理...
  • luobailian
  • luobailian
  • 2016年05月31日 17:11
  • 733

Spark 定制版:017~Spark Streaming资源动态申请和动态控制消费速率原理剖析

本讲内容:a. Spark Streaming资源动态分配 b. Spark Streaming动态控制消费速率注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)...
  • zisheng_wang_DATA
  • zisheng_wang_DATA
  • 2016年06月22日 21:29
  • 2299

内存资源的申请与释放(C&C++)

在嵌入式系统中动态内存申请存在比一般系统编程时更严格的要求,这是因为嵌入式系统的内存空间往往是十分有限的,不经意的内存泄露会很快导致系统的崩溃。    所以一定要保证你的malloc和free成...
  • diligentcat
  • diligentcat
  • 2011年08月17日 12:05
  • 852

关于C/C++动态申请空间释放和内存泄漏问题介绍

1. 动态申请空间1.1 基本内容  Ⅰ 动态申请的空间没有具体名称,只能通过指针间接访问(无论new还是malloc方式)。   Ⅱ 动态申请空间都是存放在堆中,有别于系统自动分配的空间是存放在堆...
  • FX677588
  • FX677588
  • 2016年09月24日 13:45
  • 2422

动态申请和释放内存

1.一维数组内存的动态分配和释放如下: int *array=new int [10]; //动态分配(例如分配10个单元的) memset(array,0,sizeof(array)); ...
  • yeepom
  • yeepom
  • 2013年03月23日 18:44
  • 1521

SparkStreaming消费Kafka数据遇到的问题

SparkStreaming消费Kafka数据遇到的问题: 查看ZK:
  • nysyxxg
  • nysyxxg
  • 2017年02月08日 14:32
  • 702

陈正冲老师讲c语言之内存的申请malloc() 和释放free()

1.如何使用 malloc 函数   不要莫名其妙,其实上面这段小小的对话,就是malloc的使用过程。malloc是一个函数,专门用来从堆上分配内存。使用malloc函数需要几个要求: ...
  • u010154760
  • u010154760
  • 2015年04月07日 15:33
  • 2793
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第17课:SparkStreaming资源动态申请和动态控制消费速率原理剖析
举报原因:
原因补充:

(最多只允许输入30个字)