spark采用foreach方法向下游写数据导致mysql报警问题记录

    为了统计数据库中某一字段动态变化量,采用定时采集数据的方式,每半小时采集一次动态数据,每天统一汇总推送到hadoop文件系统中,每月采用spark分布式计算动态数据的变化规律,并写入数据库中,以便监控数据库中数据变化趋势。

    但是在写入数据的过程中,采用调用下游接口的方式,利用spark针对rdd的foreach方式写入,代码如下:

    spark采用foreach方法向下游写数据导致mysql报警问题记录

但是,在写入过程中,数据库瞬时qps达到了1700/s,会造成段时间连接问题,单机的cpu也超限,可能导致服务器瞬时不可用的问题,所以在采用spark访问下游服务过程中,一定要避免这样直接像下游写入数据,那么如何正确写入数据呢?

spark采用foreach方法向下游写数据导致mysql报警问题记录

第一种方式,是改造foreach方法,改为foreachPartition,将单个rdd组装成数组类型批量写入数据库,或者分别写入,但是写入之间加入sleep操作。

spark采用foreach方法向下游写数据导致mysql报警问题记录

第二种方式,是在写入数据与接收数据之间加入通道,比如redis队列、kafka,采用滑动窗口机制保证数据平缓写入下游数据库中。