解决方案:
先创建sparkSession,然后再通过SparkSession去创建StreamingContext
SparkStreaming流控制
其中也提到了开启反压的缘由:一个批次的数据应该在一个批次内处理完,即batch process time应该接近于batch Duration,如果batch处理时间总是比batch间隔时间长,就会不断增加调度延迟时间而且数据也会在内存里堆积,进而增加系统不稳定性;另一方面,如果batch处理时间总是远远小于batch间隔时间,则集群资源利用率不高,也是一种资源浪费。
控制批处理时间的关键在batch接收的数据量和业务逻辑处理复杂度,往往前者起了决定性作用,反压机制就可以动态控制batch接收消息速率,来适配集群处理能力。
速率预估
启用反压也比较简单:sparkConf.set("spark.streaming.backpressure.enabled", "true")。spark会在作业执行结束后,调用RateController.onBatchCompleted更新batch的元数据信息:batch处理结束时间、batch处理时间、调度延迟时间、batch接收到的消息量等.