会有一些任务需要实时调取某用户的XX信息,在这一层如果使用接口去做,如果数据量到达30几万的数据,光一个scan就卡死在那边了。后面采用离线任务去做,大概一个任务可能会需要10几秒左右完成。

但是接口那边请求的量不小,差不多一批次会有1000个,总不能启1000多个离线任务来做吧?显然不太合理在小集群上,大概9个节点。

方案

image.png

使用sparkStreaming将任务分发到spark executors上去做。

第一次优化

本来之前没有加入线程池,而是按照传统SparkStreaming的方式,拿到微批,collect之后,一个一个分发。这样就导致慢的任务卡了快的任务,处理速度明显跟不上。

加入线程池的目的,就是为了让快的任务 在慢的任务执行的同时,也能同时执行。

第二次优化

使用foreachPartitionAsync和countAsync,让同一个任务的Action动作可以并行执行

第三次优化

当中碰到rpc.time.out的情况,增加参数配置

sparkConf.set("spark.network.timeout", "300s")

去掉反压策略

sparkConf.set("spark.streaming.backpressure.enabled", "true")


小鸡
214 声望24 粉丝

1.01的365次方=37.8


引用和评论

0 条评论