一、Spark Streaming动态资源分配
Spark Streaming为什么要动态分配和申请资源呢?
默认情况下,Spark是先分配好资源,然后在进行计算,也就是粗粒度的资源分配;
粗粒度的好处:资源是提前给分配好的,所以计算任务的时候,直接使用这些资源;
粗粒度的缺点:从Spark Streaming的角度讲,有高峰值和低峰值,高峰和低峰的时候,需要的资源是不一样的;如果按照高峰值的角度去分配,低峰值的时候,有大量的资源的浪费;
资源的动态分配是由一个定时器,不断的扫描Executor的情况,例如:有段时间之内,Executor没收到任何任务,所以会把这个Executor移除掉。
动态资源调整的时候,最好不要设置太多的Core,Core设置的太多,假如资源调整太过频繁的话,是比较麻烦的。
Spark Streaming要进行处理资源的动态调整,就是Executor的动态调整;
Spark Streaming是Batch Duration的方式执行的,这个Batch Duration里需要很多资源,下一个Batch Duration里不需要那么多资源,可能想调整资源的时候,还没来得及调整完资源,当前的这个Batch Duration的运行已过期的情况,这个时候的资源调整就是浪费的;
Spark动态资源调整的频率是100ms。
二、Spark Streaming动态控制消费速率
Spark Streaming提供了弹性的机制,Spark Streaming会看一下流进来数据的速度和处理数据的速度,进行比较,如果不能够来得及处理的话,会自己动态去控制这个数据流进来的速度,有个配置参数:spark.streaming.backpressure.enabled;