最近用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. Mysql安装与主从配置

    安装MySql 操作系统:Windows Server 2008 R2 Standard MySql版本:mysql-5.7.17-winx64 第一步:解压mysql-5.7.17-winx64.z ...

  2. 【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

    在上一篇文章中,老周扯了一下在 Windows 10 中开启 Linux 子系统,并且进行了一些简单的设置.本篇咱们就往上面安装 .net core . 老周假设你从来没有用过 Linux,所以,接着 ...

  3. b9934107349625014ec251e1333d73a8 这个代码是mad5值

    Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.Rives ...

  4. Redis介绍及Jedis测试

    1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...

  5. SQL Server 加密案例解析

    一.概述 加密是一种安全措施,有时候甚至是法律要求.作为攻破Windows系统的最后一道防线,通过加密可以保证在没有密钥的情况下获取备份或者物理介质变得毫无意义. 二.概念 加密层次结构 加密层次结构 ...

  6. c#简单操作MongoDB_2.4

    一.MongoDB的安装 MongoDb在windows下的安装与以auth方式启用服务 二.下载驱动 使用nuget搜索“mongodb”,下载“MongoDB.Driver”(这是官方推荐的一个驱 ...

  7. 使用vue-axios请求geoJson数据报错的问题

    最近的项目用到了echarts一个带有散点地图的图表,按照正常jquery写法应该使用ajax请求geojson的数据动态去切换地图,就像下面这样 $.get('Js/map/' + cityData ...

  8. 解决DEDECMS Call to undefined function dede_htmlspecialchars()

    作者:DEDECMS建站网 关注: 3610 时间:2015-11-18 16:39 内容详情 以下内容您可能感兴趣: 织梦官方在2015年6月18日更新了织梦5.7,为了兼容php5.4+,修改了/ ...

  9. ngRx 官方示例分析 - 1. 介绍

    ngRx 的官方示例演示了在具体的场景中,如何使用 ngRx 管理应用的状态. 示例介绍 示例允许用户通过查询 google 的 book  API  来查询图书,并保存自己的精选书籍列表. 菜单有两 ...

  10. ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架。

    ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架.