赐度虻 发表于 2025-6-10 19:23:20

使用Redis分布式锁优化 Java Spark 服务

为了优化 Java Spark 服务,尝试了各种办法和各种参数组合。
为什么要优化

现网有个spark服务,白天数据量大,积压数据,夜间数据量小,再把积压的数据处理完,虽然达到了平衡,保证了每天的数据能处理完,但白天的数据处理延迟比较大。
数据积压的原因

接手这个服务以来,我一直以为是因为下载图片耗时长导致的数据处理速度慢。这周测试发现,存储图片的时候,判断图片是否存在,不存在则保存图片到本机文件夹,这两个步骤有时耗时几十毫秒,有时甚至耗时十几分钟!
难点

数据处理并行度小了不行,会导致数据处理速度慢;并行度大了也不行,会导致上述两个步骤有概率出现特别慢的情况,从而有概率严重拖慢spark任务;通过测试发现,并行度无论怎么设置,都会有概率出现特别慢的情况。
解决办法


[*]通过spark.streaming.kafka.maxRatePerPartition参数和JavaStreamingContext构造函数的batchDuration参数,控制数据流量
[*]开启spark推测执行,并设置合适的参数
[*]通过redis分布式锁控制并行度
关键代码如下:
spark.streaming.kafka.maxRatePerPartition参数设置:
sparkConf.set("spark.streaming.kafka.maxRatePerPartition", "1");推测执行参数设置:
sparkConf.set("spark.speculation", "true");
sparkConf.set("spark.speculation.interval", "5s");
sparkConf.set("spark.speculation.quantile", "0.1");
sparkConf.set("spark.speculation.multiplier", "6");batchDuration参数设置:
JavaStreamingContext jssc = new JavaStreamingContext(jsc, Durations.milliseconds(10000));Redis分布式锁tryLock定义:
public static boolean tryLock(String key) {
    String r = RedisClusterUtil.getJedis().set(redisKeyPre + key, "value", "NX", "PX", 10);
    if ("OK".equals(r)) {
      return true;
    } else {
      return false;
    }
}Redis分布式锁tryLock使用
try {
    String key = String.valueOf(partitionId % 8);
    while (!RedisLock.tryLock(key)) {
      Thread.sleep(5);
    }
} catch (InterruptedException e) {
    log.error("获取Redis锁异常!!!");
}说明:锁超时释放,没有使用unlock手动释放
优化效果

通过以上方法,降低了判断图片文件是否存在和保存图片这两个步骤出现长耗时的概率和出现长耗时时的耗时时长。
但是依然有概率会出现特别慢的情况。如下图所示:
Spark截图1


Spark截图2


后续

使用SpringBoot多线程单体服务代替Spark后,再也没有数据积压了,出现图片下载失败、新建目录失败的情况几乎没有了,长耗时的情况也几乎没有了

结论:此类存储任务不适合使用Spark服务处理


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

谲脾 发表于 2025-10-18 00:40:57

懂技术并乐意极积无私分享的人越来越少。珍惜

锑砖 发表于 2025-10-29 22:47:28

喜欢鼓捣这些软件,现在用得少,谢谢分享!

翁真如 发表于 2025-12-11 07:09:38

谢谢分享,试用一下

骆贵 发表于 2025-12-14 16:17:56

yyds。多谢分享

炳裘垦 发表于 2025-12-16 06:29:43

yyds。多谢分享

纪音悦 发表于 2025-12-16 15:54:02

鼓励转贴优秀软件安全工具和文档!

予捻 发表于 2025-12-29 23:45:43

不错,里面软件多更新就更好了

司马黛 发表于 2026-1-7 14:27:36

懂技术并乐意极积无私分享的人越来越少。珍惜

靳谷雪 发表于 2026-1-20 21:03:34

前排留名,哈哈哈

左丘纨 发表于 2026-1-22 01:37:20

谢谢楼主提供!

类饲冰 发表于 2026-1-24 12:15:15

分享、互助 让互联网精神温暖你我

司马黛 发表于 2026-1-24 12:16:23

收藏一下   不知道什么时候能用到

供挂 发表于 2026-1-27 05:05:26

喜欢鼓捣这些软件,现在用得少,谢谢分享!

扎先 发表于 2026-1-29 03:38:09

前排留名,哈哈哈

勉欤铅 发表于 2026-2-4 08:00:58

喜欢鼓捣这些软件,现在用得少,谢谢分享!

铵滔 发表于 2026-2-7 02:21:31

感谢,下载保存了

判涔 发表于 2026-2-8 16:43:18

很好很强大我过来先占个楼 待编辑

向梦桐 发表于 2026-2-8 20:36:15

前排留名,哈哈哈

蒙飘 发表于 2026-2-9 11:11:40

东西不错很实用谢谢分享
页: [1] 2
查看完整版本: 使用Redis分布式锁优化 Java Spark 服务