Spark Streaming揭秘 Day17
资源动态分配
今天,让我们研究一下一个在Spark中非常重要的特性:资源动态分配。
为什么要动态分配?于Spark不断运行,对资源也有不小的消耗,在默认情况下,Spark采用的是粗粒度分配,那么低峰值时会产生大量的资源浪费。
比较有意思的是,在Spark Core和Spark Streaming中对于动态资源管理,采用了两种不同的思路。
Spark core:动态资源控制
在SparkContext启动时,可以看到就有一个动态资源分配的属性控制,默认为关闭。
从代码分析,其实现是在类ExecutorAllocationManager中
其中有两个关键部分:
首先,动态资源分配,是一个定时发起的任务,采用周期性触发的方式来发起。
其次,从实现方法来看,主要就是包含了增加Executor和减少Executor两步操作。
通过定时器,会根据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中,关键代码大致如下:
关键算法如下,即会以前两个Batch的运行时间来进行判断,按照运行趋势,计算下一周的窗口时间。
资源动态控制,比较适合长时间耗时的任务,Spark Streaming都是微处理,比较适合动态速率控制,而不是资源控制。同时调整的时候,是逐步调整的,并不是一步到位那种。
欲知后事如何,且听下回分解
DT大数据每天晚上20:00YY频道现场授课频道68917580