周一我就有个困惑,还写成文章了:如何从 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时间 和 对每一列处理时间:

α×timeIO∗列+β×行log⁡2行\alpha \times time_{\text{IO}} * 列 + \beta \times 行 \log_2{行}α×timeIO​∗列+β×行log2​行

而其中,相比 IO ,计算时间(比如排序)可以忽略不计,因此时间可以记为

α×timeIO∗列\alpha \times time_{\text{IO}} * 列α×timeIO​∗列

于是我想着,能不能『把所有班级一下全叫进教室』,毕竟:

  • 我的机器内存有 8G
  • 数据顶多使用 4G

我开始着手「扩大教室」,尝试了很多,和配置文件 .confspark-shellspark-env.cmdJVM -Xmx4g 等等这种资料、操作大战了一上午,无果。

我认为我的尝试产生了效果,因为原有的错误不报了, collect 这个过程也能走完(孩子们都能进教室,之前是进不去的),但是一旦涉及到操作(collect 结束后会卡顿很久,无法返回应有的 Array),就会爆 JVM heap 。此外,经过一些其他调整后,不爆 heap 了,爆 GC overhead limit exceeded 这种垃圾回收问题。

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

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

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

“调优”结束。

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

  • 不甘心自己的某个思路不可行,一股脑硬试下去
  • 经验不足

啊!要是用时15小时的代码不是1个月前的我写的,而是别人写的,那我把他调到 12 分钟,还显得我蛮厉害的

Spark 自己实现分箱逻辑遇到的坑相关推荐

  1. 信用评分系统运行原理中篇-分箱逻辑

    前言 本篇承接上篇 信用评分系统运行原理上篇 分箱逻辑比较复杂 设计到很多的算法 为了确保分析的准确性 我通过pycharm编译器Debug的方式跑这段代码 一步一步的分析代码的实现逻辑 编译器环境的 ...

  2. 【数据处理】python变量分箱常见手法:分类型、数值型、卡方、自定义

    """ 分箱逻辑:1.类别型特征: 1)类别数在5个以下,可以直接根据类别来分箱 (binning_cate) 2)类别数在5个以上,建议做降基处理,再根据降基后的类别做 ...

  3. python评分卡建模-卡方分箱(2)之代码实现

    卡方值计算 计算卡方值的函数需要输入numpy格式的频数表.对于pandas数据集,只需使用pd.crosstab计算即可,例如变量"总账户数" 与 目标变量 "是否坏客 ...

  4. python分箱统计个数_【数据处理】python变量分箱常见手法:分类型、数值型、卡方、自定义...

    """ 分箱逻辑: 1.类别型特征: 1)类别数在5个以下,可以直接根据类别来分箱 (binning_cate) 2)类别数在5个以上,建议做降基处理,再根据降基后的类别 ...

  5. 数据科学猫:数据预处理 之 数据分箱(Binning)

    进击的橘子猫正式改名上线啦! 我的CSDN主页:https://blog.csdn.net/Orange_Spotty_Cat 也欢迎大家搜索微信公众号"进击的橘子猫",我也会定期 ...

  6. 数据预处理 -----数据分箱

    一.定义 数据分箱(Binning)作为数据预处理的一部分,也被称为离散分箱或数据分段.其实分箱的概念其实很好理解,它的本质上就是把数据进行分组. 分箱就是把数据按特定的规则进行分组,实现数据的离散化 ...

  7. 分箱_best-ks分箱

    好久没有更新了,emm- 之前给大家分享过卡方分箱,想了解的可以点击下面链接. 卡方分箱 那么,今天给大家分享在评分卡中另外一种常见的分箱方法best-ks,首先我们先来了解一下,best-ks是如何 ...

  8. 逻辑回归预测事件发生的概率_通过逻辑回归,对信用卡申请数据使用卡方分箱法预测违约率建模...

    一. 建模步骤 (1)从数据中衍生特征 (2)对类别型变量和数值型变量进行补缺 (3)基于卡方分箱法对变量进行分箱 (4)WOE编码后的单变量分析与多变量分析 (5)应用逻辑回归模型 (6)尺度化 ( ...

  9. 【菜菜的sklearn课堂笔记】逻辑回归与评分卡-用逻辑回归制作评分卡-分箱

    视频作者:菜菜TsaiTsai 链接:[技术干货]菜菜的机器学习sklearn[全85集]Python进阶_哔哩哔哩_bilibili 分训练集和测试集 from sklearn.model_sele ...

最新文章

  1. 英特尔高管晒照片不小心泄密,正在研发的雷电5就这样暴露了
  2. 关于linux文件挂载(一)
  3. 69.数据库系统的两级映射(映像)
  4. vue中v-for循环如何将变量带入class的属性名中
  5. df 命令查看linux磁盘空间
  6. 汇编 --- EXE文件 的程序的加载过程
  7. PHP密码问题陈婷代码_登录中利用JS前端加密PHP后端解密保证数据非明文传输的安全方法...
  8. 挑战 TensorFlow、PyTorch,“后浪”OneFlow 有没有机会?
  9. Android loopback(三)
  10. SQLyog——下载2058问题
  11. 【小技巧】2345——劫持IE浏览器主页
  12. 三维空间点到线段的距离
  13. 使用idea开发vue初始步骤
  14. android7.1修改默认休眠时间为1分钟
  15. 开心网刷分程序详解以及web游戏破解思路分析(一)
  16. 如何在linux下配置网络桥接?-使初学者轻松远离ping不通的烦恼
  17. 深度学习基础知识整理
  18. miredo - Teredo IPv6 tunneling for Unix
  19. SSM框架上传文件并不刷新页面,并预览图片
  20. glade 使用指南(2)

热门文章

  1. System.Security.Cryptography.RSA.FromXmlString 系统找不到指定的文件和X509读取证书文件系统找不到指定的文件异常
  2. Cent OS 6/7 中通过yum安装软件时提示cannot find a valid baseurl...的解决方法
  3. node解决通过npm无法安装forever的方法
  4. 解决Linux系统在设置alias命令重启后失效的问题
  5. 解决RStudio(非conda安装)在使用Anaconda中的R环境时,缺失“ libbz2-1.dll ”而不能正常启动问题
  6. 亚马逊的PuTTY连接AWS出现network error connection refused,终极解决方案。
  7. 微信JSSDK多图片上传并且解决IOS系统上传一直加载的问题
  8. Spring Cloud 异常处理
  9. Hadoop namenode无法启动问题解决
  10. 在Java中安全地将long转换为int