文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 01:44

关注

周一我就有个困惑,还写成文章了:如何从 Spark 的 DataFrame 中取出具体某一行,里面提了自己猜想的几种解决方案。

没想到这么快就要面对这个问题了,我用小孩子都听得懂的例子描述一下我在干什么。

简单生动小例子

说一所小学有好几个班级,现在要 以班级为单位 给孩子们按照身高进行排序,并且记录下来。

问题就是,全学校只有一条测身高的尺子,而且因为孩子们过于顽劣等主客观因素,测量身高、按身高排序、登记身高这些过程,必须在一间教室里进行。 没有被轮到测量的班级,就在操场活动。

而最让老师感到头疼的是:组织孩子们进教室这一过程。测身高呀、记录呀、排序呀,都用不了几分钟,唯独让孩子们进教室这件事,要让老师们使出九牛二虎之力,而且特别耗时。

孩子们快进教室吧,求求了!

好消息是,组织一个班进教室,和组织一百个班同时进教室,花费的时间差不多。 因此,一般来讲,老师都是直接把所有学生全部叫进这间教室来的。

但是我面临一个棘手的情况。我的操场上,有 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 limit exceeded 这种垃圾回收问题。

那我有理由怀疑是性能被硬件限制了。

于是我考虑:『把孩子们分成几批,一次叫几个班进教室』。

有很多 bug ,我最后选择的是一次叫 100 个班级,用时大概 12 分钟。

“调优”结束。

总体来看,思路上几乎没什么难度,花费了这么多时间,主要是因为:

啊!要是用时15小时的代码不是1个月前的我写的,而是别人写的,那我把他调到 12 分钟,还显得我蛮厉害的?? 开个玩笑,我希望大家写出的代码都是很棒的,这样咱们都可以节省出时间休息??

 

好了,回去睡觉了,明天还得接着给“孩子们”做别的工作;而且还有另一所学校另一个工作(同时被领导安排两个工作并行有点难顶啊)。

 

来源:Piper蛋窝内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯