个性化推荐调优:重写spark推荐api
最近用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的更多相关文章
- GC调优在Spark应用中的实践(转载)
Spark是时下非常热门的大数据计算框架,以其卓越的性能优势.独特的架构.易用的用户接口和丰富的分析计算库,正在工业界获得越来越广泛的应用.与Hadoop.HBase生态圈的众多项目一样,Spark的 ...
- 【翻译】Spark 调优 (Tuning Spark) 中文版
由于Spark自己的调优guidance已经覆盖了很多很有价值的点,因此这里直接翻译一份过来.也作为一个积累. Spark 调优 (Tuning Spark) 由于大多数Spark计算任务是在内存中运 ...
- GC调优在Spark应用中的实践[转]
作者:仲浩 出处:<程序员>电子刊5月B 摘要:Spark立足内存计算,常常需要在内存中存放大量数据,因此也更依赖JVM的垃圾回收机制.与此同时,它也兼容批处理和流式处理,对于程序 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- spark调优篇-Spark ON Yarn 内存管理(汇总)
本文旨在解析 spark on Yarn 的内存管理,使得 spark 调优思路更加清晰 内存相关参数 spark 是基于内存的计算,spark 调优大部分是针对内存的,了解 spark 内存参数有也 ...
- Spark学习之路 (十一)SparkCore的调优之Spark内存模型
摘抄自:https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-apache-spark-memory-management/ind ...
- Spark学习之路 (十一)SparkCore的调优之Spark内存模型[转]
概述 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在 ...
- Hbase集群搭建及所有配置调优参数整理及API代码运行
最近为了方便开发,在自己的虚拟机上搭建了三节点的Hadoop集群与Hbase集群,hadoop集群的搭建与zookeeper集群这里就不再详细说明,原来的笔记中记录过.这里将hbase配置参数进行相应 ...
- spark调优篇-spark on yarn web UI
spark on yarn 的执行过程在 yarn RM 上无法直接查看,即 http://192.168.10.10:8088,这对于调试程序很不方便,所以需要手动配置 配置方法 1. 配置 spa ...
随机推荐
- Java_web学习(一) jdk配置
1.下载好jdk1.8.0版本或以上版本 2.配置JAVA_HOME,CLASSPATH,PATH 其中JAVA_HOME必须的 2.1 JAVA_HOME=E:\java\jdk1.8.0_77 ...
- 在HTML页面中获取当前项目根路径的方法
在HTML页面获取项目根路径的方法: function getRootPath(){ var curPageUrl = window.document.location.href; var rootP ...
- 常用OJ名字+地址(自用)
常用OJ名字+地址 不定期更新,自己用,有补充的也可以给我说说哈. 中文 openjudge 地址:openjudge.cn 说明:北大提供的一个平台,学校可申请小组: 比较好的小组: 计算概论:ic ...
- 基于Windows下python3.4.1IDLE常用快捷键小结
安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.ALT ...
- itoa函数,sprintf函数
itoa函数 itoa 为c语言的一个函数.itoa 函数是一个广泛应用的,从非标准扩展到标准的C语言.它不能被移植,因为它不是标准定义下的C语言,但是,编译器通常在一个不遵循程式标准的模式下允许其通 ...
- Trees on the level(指针法和非指针法构造二叉树)
Trees on the level Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- The Blocks Problem(vector)
题目链接:http://poj.org/problem?id=1208 The Blocks Problem Time Limit: 1000MS Memory Limit: 10000K Tot ...
- mitm6:通过IPv6攻破IPv4网络
一.前言 虽然IPv6正在互联网上逐步推广,但在内部网络环境中使用IPv6的公司依然非常稀少.然而,大多数公司并不知道,即使他们没有主动去使用IPv6,但从Windows Vista以来,所有的Win ...
- [国嵌攻略][090][linux网络编程模型]
编程模型 Socket的实质就是一个接口,利用该接口,用户在使用不同的网络协议时,操作函数得以统一.而针对不同协议的差异性操作,则交给了Socket去自行解决. TCP编程模型 UDP编程模型
- Oracle_where子句
Oracle_where子句 --1.查询员工名为'SMITH'的信息 select * from emp where ename = 'SMITH'; --2.查询在1980/12/17入职的员 ...