会有一些任务需要实时调取某用户的XX信息,在这一层如果使用接口去做,如果数据量到达30几万的数据,光一个scan就卡死在那边了。后面采用离线任务去做,大概一个任务可能会需要10几秒左右完成。
但是接口那边请求的量不小,差不多一批次会有1000个,总不能启1000多个离线任务来做吧?显然不太合理在小集群上,大概9个节点。
方案
使用sparkStreaming将任务分发到spark executors上去做。
第一次优化
本来之前没有加入线程池,而是按照传统SparkStreaming的方式,拿到微批,collect之后,一个一个分发。这样就导致慢的任务卡了快的任务,处理速度明显跟不上。
加入线程池的目的,就是为了让快的任务 在慢的任务执行的同时,也能同时执行。
第二次优化
使用foreachPartitionAsync和countAsync,让同一个任务的Action动作可以并行执行
第三次优化
当中碰到rpc.time.out的情况,增加参数配置
sparkConf.set("spark.network.timeout", "300s")
去掉反压策略
sparkConf.set("spark.streaming.backpressure.enabled", "true")
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。