Spark Streaming资源动态申请和动态控制消费速率原理剖析
来源:互联网 发布:淘宝售假扣48分重开店 编辑:程序博客网 时间:2024/05/16 07:31
为什么需要动态?
a) Spark默认情况下粗粒度的,先分配好资源再计算。对于Spark Streaming而言有高峰值和低峰值,但是他们需要的资源是不一样的,如果按照高峰值的角度的话,就会有大量的资源浪费。
b) Spark Streaming不断的运行,对资源消耗和管理也是我们要考虑的因素。
Spark Streaming资源动态调整的时候会面临挑战:
Spark Streaming是按照Batch Duration运行的,Batch Duration需要很多资源,下一次Batch Duration就不需要那么多资源了,调整资源的时候还没调整完Batch Duration运行就已经过期了。这个时候调整时间间隔。
Spark Streaming资源动态申请
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参数设置。
0 0
- Spark 定制版:017~Spark Streaming资源动态申请和动态控制消费速率原理剖析
- Spark Streaming资源动态申请和动态控制消费速率原理剖析
- 第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析
- 第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析
- Spark定制班第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析
- 第17课:spark streming资源动态申请和动态控制消费速率原理剖析
- 第17课:SparkStreaming资源动态申请和动态控制消费速率原理剖析
- Spark学习笔记(17)Spark Streaming资源动态申请剖析
- spark streaming原理
- Spark 之Streaming--原理
- Spark Streaming原理介绍
- Spark Streaming基础原理
- Spark Streaming + Kafka Integration Guide 位置策略和消费策略译文
- spark-streaming系列------- 5. Spark-Streaming checkpoint的原理和实现
- Spark Worker原理和源码剖析解密
- Spark Streaming原理简析
- Spark Streaming原理简析
- spark streaming原理与实践
- maven的war依赖
- 蒙特卡洛法多线程求圆周率
- 用arm-none-linux-gnueabi交叉编译Linux内核
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- 点击UIViewController任意位置,收起键盘的3种方法
- Spark Streaming资源动态申请和动态控制消费速率原理剖析
- pandas数据分析入门二
- 尾部的零
- AsyncTask异步交互的用法简介
- Android 屏幕(View)坐标系统
- IntelliJ IDEA 使用心得与常用快捷键
- Java并发编程:Lock
- Jquery插件知识之Jquery.cookie实现页面传值
- Xcode LLDB Debug教程