• Spark Streaming揭秘 Day17 资源动态分配


    Spark Streaming揭秘 Day17

    资源动态分配

    今天,让我们研究一下一个在Spark中非常重要的特性:资源动态分配。
    为什么要动态分配?于Spark不断运行,对资源也有不小的消耗,在默认情况下,Spark采用的是粗粒度分配,那么低峰值时会产生大量的资源浪费。
    比较有意思的是,在Spark Core和Spark Streaming中对于动态资源管理,采用了两种不同的思路。

    Spark core:动态资源控制

    在SparkContext启动时,可以看到就有一个动态资源分配的属性控制,默认为关闭。
    Snip20160530_1

    从代码分析,其实现是在类ExecutorAllocationManager中

    其中有两个关键部分:

    首先,动态资源分配,是一个定时发起的任务,采用周期性触发的方式来发起。
    Snip20160530_2

    其次,从实现方法来看,主要就是包含了增加Executor和减少Executor两步操作。
    Snip20160530_3

    通过定时器,会根据Dirver中的元数据,不断的扫描Executor的情况,满足条件就会进行Executor的添加和删除。例如说正在运行的Stage运行在不同的Executor中,如果60秒时间,发现Executor中一个task也没运行,那就会remove掉,如果发现资源不够的话,会申请更多的资源。
    同时,调整资源时,要考虑下资源的粒度,每个Executor的core是3-5个,奇数设置时,稳定性比较高。

    Spark Streaming:动态速率控制

    Spark Streaming中,Spark Core的动态资源控制方法不太适用,因为在每个Batch Duration可能要求的资源差别很大,有可能还没调整完资源,运行就过期了。

    所以,在Spark Streaming中考虑以Batch Duration为周期来进行调整,Spark会判断处理速率,如果来不及处理,会控制处理的速度,叫做动态速率控制。

    具体来说,SparkStreaming有一个rate功能可以控制流入的速率,在这个基础上提供了一套算法,根据流入数据和处理时间的比例关系,根据一定的关系,将流入的rate提高或者降低。其实现在PIDRateEstimator中,关键代码大致如下:
    Snip20160530_4

    关键算法如下,即会以前两个Batch的运行时间来进行判断,按照运行趋势,计算下一周的窗口时间。
    Snip20160530_5

    资源动态控制,比较适合长时间耗时的任务,Spark Streaming都是微处理,比较适合动态速率控制,而不是资源控制。同时调整的时候,是逐步调整的,并不是一步到位那种。

    欲知后事如何,且听下回分解

    DT大数据每天晚上20:00YY频道现场授课频道68917580

  • 相关阅读:
    TIMESTAMP类型字段在SQL Server和MySQL中的含义和使用
    Redis阻塞诊断基础
    MySQL分区表
    Redis 主从复制
    Redis安全以及备份还原
    Redis物理文件结构
    Redis的Errorlog或者启动日志(错误日志)的配置
    Redis 编译安装
    MySQL自增列锁模式 innodb_autoinc_lock_mode不同参数下性能测试
    SQL Server并发操作单个表时发生在page页面级的死锁
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5543983.html
Copyright © 2020-2023  润新知