【调优】大数据高效跑数技巧 - 串行改并行

  今天来填前面文章的坑。

表及其字段:table1 里面有三个指标 A、B、C,假如 A 是今日访问次数,B 是今日访问次数较昨日涨幅,C 是今日访问次数较上月涨幅。

回溯范围:回溯历史 120 天的数据。

问题:由于 B 指标依赖昨天的数据,C 指标依赖上月的数据,那么回溯只能一天一天跑,1 月 1 日 跑完了才能跑 1 月 2 日。

  • 时间:假如跑一天的数据要 15 min,那回溯 120 天就要 15 * 120 = 1800 min = 30 h,这不是浪费时间吗?
  • 资源:假如跑一天的数据要 300 核 CPU、1 T 内存,但是集群资源有 10000 核 CPU、1000T 内存,这不是浪费资源吗?

显然一天一天跑数据是不可接受的。所以必须要想办法解决依赖,提高并行。

办法其实很简单,mentor 让自己想,没想出来。mentor 一说答案,原来如此简单。所以实习能很快进步,少走弯路,能去实习尽量去实习。

1.方法

具体做法就是,跑两个遍!具体做法如下:

  • 不考虑依赖,开 30 的并发(30 天的数据同时跑),那么 120 天的数据只需要跑 4 次就能跑完。
  • 不考虑依赖的后果是:得到的结果表里面,A(今日访问次数) 是正确的,B(今日访问次数较昨日涨幅) 和C(今日访问次数较上月涨幅) 是错误的。
    • 举个例子,4 月 1 日 和 4 月 2 日的任务并行跑,A 没有依赖,当然是对的,B 是 “今日访问次数较昨日涨幅)”,计算方法是:(4 月 2 日的 A - 4 月 1 日 的 A) ÷ (4 月 1 日 的 A)。由于两天的数据在同时跑,那么 4 月 2 日的任务计算 B 指标时,4 月 1 日 的 A 指标还没算出来, 4 月 2 日的任务计算的 B 指标自然就是错的。
    • C 指标也是同理,依赖上月。
  • 跑完得到结果之后,再次开 30 的并发跑一遍,这样结果就是正确的了。
    • 因为第一次跑数已经得到了每天正确的 A 指标,第二次跑数用正确的 A 指标自然能得到正确的 B 、C 指标。
    • 此时 A 指标会重复计算一次,没关系,将表里面的结果覆盖一遍,没有任何影响。

2.总结

最后计算一下时间:

  • 原来的方式已经计算过,跑一天的数据要 15 min,那回溯 120 天就要 15 * 120 = 1800 min = 30 h;
  • 新的方式,一次跑 30 天,120 天 4 次就能跑完,那么时间大约是 4 * 15 = 60 min = 1 h,由于要跑两边才能得到正确的结果,所以最终消耗 2 * 1 = 2 h。
  • 结果:节约了 28 h。

再算一下资源:

  • 集群资源有 10000 核 CPU、1000T 内存。
  • 以前每次消耗 300 核 CPU,1T 内存,资源利用率分别是 3%、0.1%;
  • 现在每次消耗 300 * 30 = 9000 核 CPU,300 * 1 = 300T 内存,资源利用率分别是 90%、30%。

可以看到一个简单的技巧,提升是非常大的。

后面还会更新一些调优方法,想到了再更新吧。

欢迎点击此处关注公众号。

猜你喜欢

转载自blog.csdn.net/weixin_45545090/article/details/125368919