周一我就有个困惑,还写成文章了:如何从 Spark 的>
孩子们快进教室吧,求求了!
好信息是,组织一个班进教室,和组织一百个班同时进教室,破费的期间差不多。 因此,普通来讲,教员都是间接把一切在校生所有叫进这间教室来的。
然而我面临一个辣手的状况。我的操场上,有 2200 个班级,每个班级有 16 万人。我的教室也很大,然而必需装不下 2200 × 16 万人 ≈ 3亿人。
于是我就想着,我一个班一个班测,这是最直观的、最好治理的。
“来,一班,进教室!”...花了十几分钟才都叫出去...花了几十秒就都测好了、排好序了、记载好了...“好了!一班出去!二班出去!”...
如此往返,等到了第 2200 个班的时刻,曾通过去了快一个月...
内位看官讲话了:你把他们都叫出去不就行了?反正前面有条件:『组织一个班进教室,和组织一百个班同时进教室,破费的期间差不多。』
有情理,这就是我上午在做的事:把教室修大一点。
我请了土地局的人、请了工程师、请了施工队,尝试了各种方法,每次费尽力气修好(能容纳 5 亿人那种),教室就由于各种要素塌了。
唉!我计算过,通常上明明可以建成的呀!
我就不甘愿,就不时尝试,反重复复,而后几小时过去了。
这时又有位看官讲话了:别修教室了,你把孩子们分红几批,一次性叫几个班进教室不就得了!
有情理,可是这样原有的治理逻辑须要改一局部,着实破费了我一些期间。此外,还花了少量期间 debug 。
我初步设置为 100 班为一批进教室:
对照解释
下面其实就是我做的事的简化版,其中:
「教室」就是计算机的「内存」,你得把数据拿进内存才干对其启动排序什么的计算
「进教室」就是计算机的「IO操作」,计算机的内存很贵,普通的电脑都是 8G、16G 这种,而硬盘相对廉价,有 256G、512G,甚至几个 T之多,因此数据普通都放在硬盘上,须要用时,在读到内存里,这个读的环节叫做「IO操作」
「IO操作」相比计算,相当消耗期间
教员干活很利索,就是孩子们进教室有点吃力
以下是我的上班日志节选(脱敏版):
首先我是『把每个班级独自叫进教室』,很耗时。
7月19日早上大略9:30开局的,到7月20日中午0:23完结,一共 2200 列,每一列都有 160000 个数据,都要启动排序操作,还触及到 IO操作,一共用时 15 小时。这其中用时为 IO期间 和 对每一列处置
而其中,相比 IO ,计算期间(比如排序)可以疏忽不计,因此期间可以记为
于是我想着,能不能『把一切班级一下全叫进教室』,毕竟:
我开局着手「扩展教室」,尝试了很多,和性能文件 .conf 、 spark-shell 、 spark-env.cmd 、 JVM -Xmx4g等等这种资料、操作大战了一上午,无果。
一些截图: .conf
我以为我的尝试发生了成果,由于原有的失误不报了, collect 这个环节也能走完(孩子们都能进教室,之前是进不去的),然而一旦触及到操作(collect完结后会卡顿很久,无法前往应有的 Array),就会爆 JVM heap 。此外,通过一些其余调整后,不爆 heap 了,爆 GC overhead limitexceeded 这种渣滓回收疑问。
那我有理由疑心是性能被配件限度了。
于是我思考:『把孩子们分红几批,一次性叫几个班进教室』。
有很多 bug ,我最后选用的是一次性叫 100 个班级,用时大略 12 分钟。
“调优”完结。
总体来看,思绪上简直没什么难度,破费了这么多期间,关键是由于:
啊!要是用时15小时的代码不是1个月前的我写的,而是他人写的,那我把他调到 12 分钟,还显得我蛮凶猛的??开个玩笑,我宿愿大家写出的代码都是很棒的,这样我们都可以节俭出期间劳动??
好了,回去睡觉了,明日还得接着给“孩子们”做别的上班;而且还有另一所学校另一个上班(同时被指导布置两个上班并行有点难顶啊)。