最近用spark的mlib模块中的协同过滤库做个性化推荐。spark里面用的是als算法,本质上是矩阵分解svd降维,把一个M*N的用户商品评分矩阵分解为M*K的userFeature(用户特征矩阵)和K*N的productFeature(商品特征矩阵),由于K远小于N和M,存储和计算获得相应的优化。

这样对于一个用户a,推荐100个商品怎么做呢?取a的特征向量(1*K)和productFeature相乘得到1*M的结果向量,向量中的值代表该商品和用户a的相关度,取结果向量中前100的商品推荐给用户。

过程很简单,但是当M和N非常大呢?假设M为千万级,N为百万级,推荐一个商品需要KN+N*logN,用spark提供的单用户推荐api大约需要500ms,那么对于1000万用户,就需要500万秒,大约50几天。spark考虑到这种场景,所以提供了一次性推荐所有用户的api:recommendProductsForUsers。这个方法速度挺快,但内部采用userFeature和productFeature笛卡尔积的方法,这样产生了大量的shuffle,需要大量内存。用户量增加的时候,经常因为内存不够OOM挂掉,很不稳定。

优化势在必行,我们的目标是稳定和可扩展。分析一下整个计算过程,最大的问题就是用户量巨大且不稳定,一次性全量用户推荐需要大量内存和计算。随用户量动态调整节点数目和内存的方案,听上去很酷炫,但是调整的依据和公式又在哪呢。

简单的方案才是最好的方案,如下图。换个思路,不要一次性全量推荐了,每次推荐一部分固定数量(比如500万)的用户,切成几批,最后把结果merge起来。固定数量的用户,我们可以测出需要多少内存和节点,这样不需要扩展节点。如果用户量增加,只需要切的批次增加,多算几次,每次计算依然按照固定数量来推荐。

对于离线计算来说,多几个小时的计算时间不是问题,如果用户数量增长到推荐速度确实不够的时候,可以通过增大固定数量来解决(这种情况出现的概率很小,或者几个月后才会出现,不影响可行性)。这样就达到了我们的目的:稳定输出和可扩展。

由于spark没有这样的接口,所以只有自己写了。spark是用scala写的,深入源码用python就不行了,正好顺便把scala学了。重写过程主要是,把recommendProductsForUsers方法中的全量推荐代码复制出来稍加修改,变成自己的推荐方法,然后推荐的时候把userFeature分块去调用重写的推荐方法就可以了。

主要的收获是第一次通过修改开源代码去解决实际生产问题,黑盒变成了白盒。

欢迎关注个人技术公众号,坚持原创

个性化推荐调优:重写spark推荐api的更多相关文章

  1. GC调优在Spark应用中的实践(转载)

    Spark是时下非常热门的大数据计算框架,以其卓越的性能优势.独特的架构.易用的用户接口和丰富的分析计算库,正在工业界获得越来越广泛的应用.与Hadoop.HBase生态圈的众多项目一样,Spark的 ...

  2. 【翻译】Spark 调优 (Tuning Spark) 中文版

    由于Spark自己的调优guidance已经覆盖了很多很有价值的点,因此这里直接翻译一份过来.也作为一个积累. Spark 调优 (Tuning Spark) 由于大多数Spark计算任务是在内存中运 ...

  3. GC调优在Spark应用中的实践[转]

    作者:仲浩   出处:<程序员>电子刊5月B   摘要:Spark立足内存计算,常常需要在内存中存放大量数据,因此也更依赖JVM的垃圾回收机制.与此同时,它也兼容批处理和流式处理,对于程序 ...

  4. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  5. spark调优篇-Spark ON Yarn 内存管理(汇总)

    本文旨在解析 spark on Yarn 的内存管理,使得 spark 调优思路更加清晰 内存相关参数 spark 是基于内存的计算,spark 调优大部分是针对内存的,了解 spark 内存参数有也 ...

  6. Spark学习之路 (十一)SparkCore的调优之Spark内存模型

    摘抄自:https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-apache-spark-memory-management/ind ...

  7. Spark学习之路 (十一)SparkCore的调优之Spark内存模型[转]

    概述 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在 ...

  8. Hbase集群搭建及所有配置调优参数整理及API代码运行

    最近为了方便开发,在自己的虚拟机上搭建了三节点的Hadoop集群与Hbase集群,hadoop集群的搭建与zookeeper集群这里就不再详细说明,原来的笔记中记录过.这里将hbase配置参数进行相应 ...

  9. spark调优篇-spark on yarn web UI

    spark on yarn 的执行过程在 yarn RM 上无法直接查看,即 http://192.168.10.10:8088,这对于调试程序很不方便,所以需要手动配置 配置方法 1. 配置 spa ...

随机推荐

  1. Progressive Web Applications

    Progressive Web Applications take advantage of new technologies to bring the best of mobile sites an ...

  2. ECJTUACM16 Winter vacation training #1 题解&源码

    //寒假训练赛,第一次拿第一,感觉很爽哦,AC3题! A------------------------------------------------------------------------ ...

  3. 51 Nod 1029 大数除法【Java大数乱搞】

    1029 大数除法 基准时间限制:4 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给出2个大整数A,B,计算A / B和A Mod B的结果.   Input 第1行:大数A ...

  4. Coins、Tokens、山寨币:区别在哪里

    [译] Coins, Tokens & Altcoins: What's the Difference? coin:指"正宗的"数字货币,比如比特币 tokens:比如用 ...

  5. css实现视差滚动效果

    今天逛京东金融的时候发现他家网站首页的滚动效果看着很有意思,于是就做了一个,demo链接http://1.liwenyang.applinzi.com/index.html 大多数的视差滚动效果都是使 ...

  6. [国嵌攻略][119][Linux中断处理程序设计]

    裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...

  7. CXF之"@XmlType.name 和 @XmlType.namespace 为类分配不同的名称"错误

    CXF 的 wsdl2java.bat 生产的代码,拷贝到目录,进行调研 web service接口时,抛出错误: Exception in thread "main" javax ...

  8. HDU 1068 Girls and Boys(模板——二分图最大匹配)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1068 Problem Description the second year of the univ ...

  9. Uva10129 - Play on Words 欧拉通路 DFS

    题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105& ...

  10. 三续ASM

    在ASM的Core API中使用的是访问者模式来实现对类的操作,主要包含如下类: 一.ClassVisitor接口: 在这个接口中主要提供了和类结构同名的一些方法,这些方法可以对相应的类结构进行操作. ...