从《长安十二时辰》大案牍术理解大数据计算

542 阅读12分钟

从《长安十二时辰》望楼传信理解网络通信一文中,通过对望楼传信的设计讲了网络通信的流程。

本文通过《长安十二时辰》里的另一个设计「大案牍术」来聊一聊大数据计算!

大案牍术是剧中徐宾所擅长的方法,即在档案中发掘出有用的信息!为了方便大案牍术的实行,靖安司的选址也很讲究:

咱们靖安司草创之时,地点几经改易,最终定在了光德坊。这里同坊有京兆府,便于案牍调阅;西邻西市,可以监控胡商;北接皇城,时刻联络宫中;东连朱雀大街,易于调动兵力。

从《长安十二时辰》大案牍术理解大数据计算

寻人灭狼卫

话说,催六郎抓狼卫失败。李必命徐宾用大案牍术再找一位得力的人选来灭狼。

为了能快速找到狼卫,保长安太平,此人必须:

  • 熟悉长安地形
  • 有丰富的办案经验
  • 办案能力超群
  • 有足够多的暗桩
  • 最好会功夫

徐宾接到命令后,遂着手开始大案牍术!

下面我们就以「办案数量」为分析维度,来看看徐宾是如何通过大案牍术找到张小敬的!

为了便于流程的说明,这里对条件进行简化,只根据「办案经验」来进行查找

大案牍术基本流程

假设,大案牍术的基本流程是这样子的(官方也没给出具体的大案牍术流程,那我就只好自己来编了!!!):

  • 从京兆府将相应的案牍借调出来
  • 徐宾一个案牍一个案牍的翻阅
  • 找出符合上面要求的人,记录下来
  • 对记录进行汇总
  • 将汇总数据进行分析,找出最符合要求的那个人(核心逻辑)
  • 将结果告知李必
  • 将案牍还于京兆府

从《长安十二时辰》大案牍术理解大数据计算

假设,现在需要查询3000册案牍,而车子一次只能从京兆府运出300册案牍,运送一次要30分钟;徐宾1分钟能翻阅完一册案牍,1分钟能汇总10条数据,最终分析时间30分钟,我们来看一下上面的流程所花费的时间。

  • 从京兆府将相应的案牍借调出来。每次30分钟,需要运10次,即300分钟。
  • 徐宾一个案牍一个案牍的翻阅。每个案牍1分钟,即需要3000分钟。
  • 找出符合要求的人,记录下来。假设此时间已经包含在上面的翻阅中了。记录格式:(张三,1),(李四,1),(王五,1),(李四,1),(张小敬:1)
  • 将符合要求的人进行汇总。假设找到了5000个记录,1分钟汇总分析10条记录,需要500分钟。汇总后格式:(张三,10),(李四,12),(王五,20),(张小敬:70)。
  • 对结果分析,找出最符合要求的那个人。耗时30分钟。在这里张小敬的办案经验最丰富。
  • 告知李必。因为同在靖安司内,故时间忽略。
  • 将案牍还于京兆府。运回时间和运出时间相同,也需要300分钟。不过因为此时人已经找到了,所以此时间就不算到计算时间内。

总时间就是 30(第一次运送案牍的时间) + 3000(翻阅案牍的总时间) + 500(汇总时间) + 30(分析时间) = 3560 分钟,即需要近60个小时!!!

分工合作

很明显,上面的大案牍术根本无法满足现在的紧急情况。等找到这个人的时候,长安早凉了!!!不不不,是凉透了!!!

可以看到,上面的流程中,耗时最长的是翻阅案牍的时间,主要原因是人手不够,只有徐宾一个人翻阅,速度太慢了。由于翻阅只是简单的找出办案数量并记录下来,所以普通人也可以做。

为了能尽快找到能抓狼卫的人,李必紧急给徐宾调来99个人来协助。现在流程就变成了:

  • 从京兆府将相应的案牍借调出来
  • 100个人(包括徐宾)一个案牍一个案牍的翻阅
  • 找出符合上面要求的人,记录下来
  • 最终数据到徐宾处进行汇总
  • 徐宾对汇总的数据进行分析,找出最符合要求的那个人
  • 告知李必
  • 将案牍还于京兆府

从《长安十二时辰》大案牍术理解大数据计算

我们假设这99个人翻阅案牍的速度和徐宾相同,都是1分钟能翻阅一个案牍,那么我们来计算一下这个流程所花费的时间:

  • 从京兆府将相应的案牍借调出来。每次30分钟,需要运10次,即300分钟。
  • 100个人一个案牍一个案牍的翻阅。每个案牍1分钟,每次翻阅时间为3分钟,总共需要30分钟。
  • 找出符合上面要求的人,记录下来。假设此时间已经包含在上面的翻阅中了。记录格式:(张三,1),(李四,1),(王五,1),(李四,1),(张小敬:1)
  • 最终数据到徐宾处汇总。假设找到了5000个记录,1分钟汇总十条,需要500分钟。汇总后格式:(张三,10),(李四,12),(王五,20),(张小敬:70)
  • 对符合要求的人进行分析,找出最符合要求的那个人。这里即张小敬。耗时30分钟
  • 将结果告知李必。同在靖安司内。时间忽略。
  • 将案牍还于京兆府。运回时间和运出时间相同,也需要300分钟。

花费的总时间为: 300(运送案牍的总时间) + 300(运回案牍的总时间) + 500(汇总时间) + 30(分析时间) = 1130 分钟,即近20个小时。虽然时间减少了40个小时,但是依然还是太慢了。

为什么这里要计算完整的运送案牍的时间?

在上面的流程中,主要时间消耗在案牍翻阅上,第一次案牍运送到靖安司后,徐宾进行翻阅,需要300分钟,而这300分钟内,剩下的案牍就已经全部运送过来了。

而在这里的流程里,案牍被送过来以后,3分钟就被翻阅完了,然后就需要等运送的车子回去再运,一来一去60分钟需要计算在流程内。翻阅案牍的时间被包含在了运送案牍的时间里了,所以不要再计算到流程内。

同时我们会发现,100个人基本都是空闲状态的,在案牍被送到后,三分钟就被翻阅完了,然后就要等57分钟,等下一批案牍被送过来。这个空闲的时间,我们还能做点什么吗?

在这个空闲时间里,这99个人是否可以对自己记录的数据进行汇总呢(这样徐宾需要汇总的数据可能就会少一点了。为什么是可能?下面解释!)?答案是肯定的。我们假设每次汇总数据是500条,那么每次汇总就需要50分钟。

那么现在所需要花费的时间就是:300(运送案牍的总时间) + 300(运回案牍的总时间) + 50(最后一次的可能汇总时间) + 30(分析时间) = 680 分钟,即11个多小时。

为什么要调出案牍?

虽然现在只需要11个多小时,也就是6个时辰,但是因为办案时间总共就12个时辰,一半的时间都花在找人上,办案的实际时间就只有6个时辰。为了给出足够的办案时间,需要对大案牍术的时间进行进一步的压缩优化。

可以看到,现在时间的消耗,大部分都花费在运送案牍上!有没有什么办法能节省这一部分的时间呢?

很简单,既然运送案牍这么耗时间,那就不要从京兆府里运出来了!徐宾等人直接去京兆府不就行了?

这里就是大数据计算与普通计算的一个差异!不是「数据」被传输到「计算逻辑」所在的位置,而是「计算逻辑」到「数据」所在的位置!

这样大案牍术的流程就变成了:

  • 100个人直接到京兆府
  • 一个个的翻阅案牍
  • 找出符合上面要求的人,记录下来
  • 各自汇总,将汇总数据在徐宾处做最终汇总
  • 徐宾对最终数据进行分析,找出最符合要求的那个人
  • 将结果告知李必

从《长安十二时辰》大案牍术理解大数据计算

我们假设人到京兆府的时间也是15分钟,那么这个流程的时间花费就是:

  • 100个人直接到京兆府。花费15分钟。
  • 一个个的翻阅案牍。花费30分钟。
  • 找出符合上面要求的人,记录下来。时间忽略
  • 各自汇总,最终数据汇总到徐宾处。花费50分钟的各自汇总时间+可能50分钟的最终汇总。
  • 徐宾对最终数据进行分析,找出最符合要求的那个人。耗时30分钟
  • 将结果告知李必。因为现在人在京兆府,需要返回靖安司,花费15分钟。

总时间为: 15(去京兆府的时间) + 30(翻阅案牍的时间) + 100(汇总时间) + 30(分析时间) + 15(回靖安司的时间) = 190 分钟。即3个多小时!

不稳定因素

现在这个时间减少到了1个多时辰,好像能满足要求了!但是这里有个不稳定因素!就是徐宾的最终汇总时间!上面是按照中位时间来算,但实际这个时间是不固定的。

假设每个人对自己的数据进行汇总后,徐宾拿个了数据不需要再进行汇总了,那这个时间消耗就是0。

此时的总时间为: 15(去京兆府的时间) + 30(翻阅案牍的时间) + 50(汇总时间) + 30(分析时间) + 15(回靖安司的时间) = 140 分钟。即2个多小时!

但是也可能各自汇总后,数据量并没有任何合并,那徐宾拿到数据后,就需要进行完整的汇总流程,那时间就还是500分钟,这里还要加上前面各自的汇总之间,一共需哟啊550分钟

此时的总时间为: 15(去京兆府的时间) + 30(翻阅案牍的时间) + 50(汇总时间)+ 500(总汇总时间) + 30(分析时间) + 15(回靖安司的时间) = 640 分钟。即10个多小时!

如果好死不死,正好是最差的情况,那留给张小敬办案的时间可就不多了。我们必须要消除这个不稳定因素!

消除变数

上面出现变数的原因是每个人的数据都是独立的,也就是说,某个人汇总的数据可能是:(张三,10),(李四,12),(王五,20),(张小敬:70),而另一个人汇总的数据可能是:(张三,5),(李四,2),(王五,4),(赵六,9)。本质上没有减少需要汇总的数据的数量。

有没有办法解决这个问题呢?当然有,那就是让某个人就专门负责对应人的汇总!比如说:A就负责汇总张三的数据,B就负责汇总李四的数据。怎么分配呢?可以按顺序依次分配:

  • 给100个人编号,比如就是1-100
  • 然后依次领取人员进行统计
  • 如果超过了100,就再从1开始领取

当然还有其他方式,比如有一个人专门来分配,看谁相对比较空闲了,就多分配一点数据给他!

现在的流程和时间消耗如下:

  • 100个人直接到京兆府。花费15分钟。
  • 一个个的翻阅案牍。花费30分钟。
  • 找出符合上面要求的人,分批记录下来。比如:张三的数据都记录在一张纸上,李四的数据记录在另外一张纸了。这里相当于多了选则记录到那张纸的过程。时间忽略。
  • 依次领取对应需要统计人员的纸。分别进行统计,花费50分钟。
  • 最终数据汇总到徐宾处。此处不再需要汇总了。徐宾只需要对符合要求的人进行分析,找出最符合要求的那个人。耗时30分钟。
  • 将结果告知李必。返回靖安司,花费15分钟。

总时间为:15(去京兆府的时间) + 30(翻阅案牍的时间) + 50(汇总时间) + 30(分析时间) + 15(回靖安司的时间) = 140 分钟。即2个多小时即可完成。且时长基本是固定的。

从《长安十二时辰》大案牍术理解大数据计算

总结

本文通过大案牍术的流程介绍,来梳理大数据计算(MapReduce)的一般流程:

  • 翻阅记录相当于是Map的过程
  • 认领相当于是Shuffle的过程
  • 汇总相当于是Reduce的过程

可以看到,通过计算方式的不断调整,计算时长从最初的60个小时缩短到了最后的140分钟。

这里的「徐宾等人」实际就是「计算逻辑」,「案牍」就是「数据」!你会发现,当数据量很大的时候,传输数据所消耗的时间会成为计算瓶颈,此时把计算逻辑移动到数据所在地,要比把数据移动到计算所在地划算得多!

公号:抽象思维