当前位置: 首页 > 科技观察

痛苦调优10小时,我把Spark脚本运行时间从15小时缩短到12分钟!

时间:2023-03-20 15:56:58 科技观察

周一有一个困惑,写了一篇文章:HowtoextractaspecificrowfromSpark'sDataFrame,里面提到了我猜到的几种解决方案。没想到这么快就遇到了这个问题。我会用一个孩子能理解的例子来描述我在做什么。一个简单形象的例子说,某小学有几个班级,现在需要以班级为单位,按照身高对孩子进行排序,并记录下来。问题是全校只有一把测高尺子,而且由于孩子太调皮等主客观因素,测高、按身高排序、登记身高的过程必须在学校进行。一间教室。没测过??的班级在操场上活动。而最让老师头疼的是:组织孩子进教室的过程。测高、记录、排序只需几分钟。只是让孩子进教室这件事,需要老师们使出浑身解数,很费时间。孩子们,请进教室!好消息是,让一个班级进入教室所需的时间与同时让一百个班级进入教室所需的时间大致相同。所以一般来说,老师都是直接把所有的学生都叫进这个教室。但我面临着一个棘手的情况。在我的操场上,有2200个班级,每个班级有16万人。我的教室也很大,但肯定容不下2200×16万人≈3亿人。所以我想,我就一个班一个班考,这样最直观,管理也最好。“来吧,一班,进教室!”……十多分钟叫进来……测量、布置、记录,用了几十秒……“好!一班出来了!第2班在!”……以此类推,一直到第2200班,差不多一个月过去了……有知情人说:你就把他们都叫进来?反正前面有条件:“组织一个班级进教室的时间,相当于同时组织一百个班级进教室的时间。”’有道理,这就是我今天早上要做的事情:把教室变大。我请来国土局、工程师、施工队的人,试了各种办法。每次我尽力修好(能容纳5亿人的那种),教室就因为各种原因倒塌了。唉!我算了一下,理论上是可以建起来的!我不甘心,就不断地尝试,一遍又一遍,几个小时过去了。这时,另一个督察开口了:别修教室了,你们把孩子分成几组,一次叫几个班进教室!有道理,但是需要改变一部分原有的管理逻辑,代价实在是太大了。花了我一些时间。此外,调试花费了大量时间。我最初设置100个班级为一批进入教室:我本来需要做2200次“叫孩子进教室”的事情(包括每个班级一次)现在我只做“叫孩子进教室”的事情theclassroom”22下次你看,是不是快了100倍?上面的解释实际上是我所做的简化版本。其中:“教室”是电脑的“记忆”。您必须将数据放入内存中才能对其进行排序。What计算“进教室”就是计算机的“IO操作”。计算机的内存非常昂贵。一般电脑8G、16G,硬盘相对便宜,有256G、512G,甚至几个T。所以,数据一般都是放在硬盘上,需要的时候读入内存.这个读取过程称为“IO操作”。与计算相比,“IO操作”是相当耗时的。摘录我的工作日志(脱敏版):首先,我“把每个班单独叫进教室”,非常耗时。7月19日上午9时30分左右开始,7月20日深夜0时23分结束。一共有2200列,每列有16万条数据。需要排序操作,涉及到IO操作。总时间用了15个小时。花费的时间是IO时间和每列的处理时间:其中与IO相比,计算时间(如排序)可以忽略不计,所以时间可以记为Classroom”,毕竟:我的机器有8G数据量,最多用4G,开始“扩容课堂”,试了很多,配置files.conf,spark-shell,spark-env.cmd,JVM-Xmx4g等,数据和运行battle了一上午,无济于事.一些截图:.conf我觉得我的尝试有效果,因为原来的错误没有报错,collect的过程也可以完成(小朋友可以进教室了,以前是做不到的),但是一旦涉及到操作(collect结束后会卡很久,无法返回合适的Array),就会爆JVM堆,另外经过一些其他的调整,堆不再爆了,并且GCoverheadlimitexceeded的垃圾回收问题爆了,那我有理由怀疑性能受硬件限制。于是我想:“把孩子们分成几个小组,一次叫几个班进教室。”有很多错误,我最终遇到的错误是一次调用100个类,大约需要12分钟。“调整”结束。总的来说,想起来几乎没有什么困难,花了那么多时间,主要是因为:不甘心自己的一个想法不可行,经验不够努力去尝试!如果15个小时的代码不是我一个月前写的,是别人写的,那我调整到12分钟,我还挺好看的??开个玩笑,希望大家都能写出好的代码,这样大家才能省钱。休息时间??好了,回去睡觉吧,明天我还要为“孩子们”做其他的工作;而且还有一所学校和另一份工作(被领导同时分配两份工作有点难)。