共计 2075 个字符,预计需要花费 6 分钟才能阅读完成。
<!– 苦楚调优 10 小时,我把 Spark 脚本运行工夫从 15 小时缩短到 12 分钟!–>
周一我就有个困惑,还写成文章了:如何从 Spark 的 DataFrame 中取出具体某一行,外面提了本人猜测的几种解决方案。
没想到这么快就要面对这个问题了,我用小孩子都听得懂的例子形容一下我在干什么。
简略活泼小例子
说一所小学有好几个班级,当初要 以班级为单位 给孩子们依照身高进行排序,并且记录下来。
问题就是,全学校只有一条测身高的尺子,而且因为孩子们过于顽劣等主客观因素,测量身高、按身高排序、注销身高这些过程,必须在一间教室里进行。 没有被轮到测量的班级,就在操场流动。
而最让老师感到头疼的是:组织孩子们进教室这一过程。测身高呀、记录呀、排序呀,都用不了几分钟,唯独让孩子们进教室这件事,要让老师们使出九牛二虎之力,而且特地耗时。
好消息是,组织一个班进教室,和组织一百个班同时进教室,破费的工夫差不多。 因而,一般来讲,老师都是间接把所有学生全副叫进这间教室来的。
然而我面临一个辣手的状况。我的操场上,有 2200 个班级,每个班级有 16 万人。我的教室也很大,然而必定装不下 2200 × 16 万人 ≈ 3 亿人。
于是我就想着,我一个班一个班测,这是最直观的、最好治理的。
“来,一班,进教室!”… 花了十几分钟才都叫进来 … 花了几十秒就都测好了、排好序了、记录好了 …“好了!一班进来!二班进来!”…
如此往返,等到了第 2200 个班的时候,曾经过来了快一个月 …
内位看官讲话了:你把他们都叫进来不就行了?反正后面有条件:『组织一个班进教室,和组织一百个班同时进教室,破费的工夫差不多。』
有情理,这就是我上午在做的事:把教室修大一点。
我请了土地局的人、请了工程师、请了施工队,尝试了各种办法,每次费尽力量修好(能包容 5 亿人那种),教室就因为各种起因塌了。
唉!我计算过,实践上明明能够建成的呀!
我就不甘心,就始终尝试,反反复复,而后几小时过来了。
这是又有位看官讲话了:别修教室了,你把孩子们分成几批,一次叫几个班进教室不就得了!
有情理,可是这样原有的治理逻辑须要改一部分,着实破费了我一些工夫。此外,还花了大量工夫 debug。
我初步设置为 100 班为一批进教室:
- 原来我须要做『喊孩子们进教室』这件事 2200 次(每个班含一次)
- 当初我只做『喊孩子们进教室』这件事 22 次,你看看,是不是快了 100 倍
对照解释
下面其实就是我做的事的简化版,其中:
- 「教室」就是计算机的「内存」,你得把数据拿进内存能力对其进行排序什么的计算
- 「进教室」就是计算机的「IO 操作」,计算机的内存很贵,个别的电脑都是 8G、16G 这种,而硬盘绝对便宜,有 256G、512G,甚至几个 T 之多,因而数据个别都放在硬盘上,须要用时,在读到内存里,这个读的过程叫做「IO 操作」
- 「IO 操作」相比计算,相当消耗工夫
以下是我的工作日志节选(脱敏版):
首先我是『把每个班级独自叫进教室』,很耗时。
7 月 19 日早上大略 9:30
开始的,到 7 月 20 日 中午 0:23
完结,一共 2200 列,每一列都有 160000 个数据,都要进行排序操作,还波及到 IO 操作,一共用时 15 小时。这其中用时为 IO 工夫 和 对每一列解决工夫:
$$\alpha \times time_{\text{IO}} * 列 + \beta \times 行 \log_2{行}$$
而其中,相比 IO,计算工夫(比方排序)能够忽略不计,因而工夫能够记为
$$\alpha \times time_{\text{IO}} * 列 $$
于是我想着,能不能『把所有班级一下全叫进教室』,毕竟:
- 我的机器内存有 8G
- 数据顶多应用 4G
我开始着手「扩充教室」,尝试了很多,和配置文件 .conf
、spark-shell
、spark-env.cmd
、JVM -Xmx4g
等等这种材料、操作大战了一上午,无果。
我认为我的尝试产生了成果,因为原有的谬误不报了,collect
这个过程也能走完(孩子们都能进教室,之前是进不去的),然而一旦波及到操作(collect
完结后会卡顿很久,无奈返回应有的 Array
),就会爆 JVM heap
。此外,通过一些其余调整后,不爆 heap
了,爆 GC overhead limit exceeded
这种垃圾回收问题。
那我有理由狐疑是性能被硬件限度了。
于是我思考:『把孩子们分成几批,一次叫几个班进教室』。
有很多 bug,我最初抉择的是一次叫 100
个班级,用时大略 12 分钟。
“调优”完结。
总体来看,思路上简直没什么难度,破费了这么多工夫,次要是因为:
- 不甘心本人的某个思路不可行,一股脑硬试上来
- 经验不足
啊!要是用时 15 小时的代码不是 1 个月前的我写的,而是他人写的,那我把他调到 12 分钟,还显得我蛮厉害的🤣 开个玩笑,我心愿大家写出的代码都是很棒的,这样咱们都能够节俭出工夫劳动😑
好了,回去睡觉了,今天还得接着给“孩子们”做别的工作;而且还有另一所学校另一个工作(同时被领导安顿两个工作并行有点难顶啊)。
我是小拍,天津大学研究生在读,微信 PiperLHJ,如果您也在从事 Spark 相干工作,务必加我微信,我十分须要高手让我骚扰😅
别忘了点在看~