总纲传送门:基于Mahout的个性化推荐系统
GitHub传送门:基于Mahout的个性化推荐系统
一、前言
在推荐系统中,往往会有很多数据来源,比如初始数据集录入(学习使用)、第三方平台数据(类似广告联盟)、用户行为数据(在平台上的操作数据如点击)、用户属性分析数据(年龄性别等)等。
本文主要讲解推荐系统的数据来源模块——数据采集模块、执行器模块。数据采集主要用于采集及写入,执行器主要用于计算刷新用户偏好。
在本项目中,数据采集模块主要采集用户行为数据和推荐商品数据。用户行为信息主要用于计算用户偏好,推荐商品信息主要用于构建排行榜,进行热门推荐。
取名,讲究
显微镜:借鉴于曾经实习的时候,接触过前端项目名为显微镜——主要做前端埋点上报用户行为信息所用。
嗅探器:在采集信息的时候,除了前端上报信息外,均是采用异步计算方式进行采集、计算写入,类似于网络攻防中的“嗅探器”,故名之。
执行器:主要用于进行执行计算用户偏好信息,将用户行为信息进行计算并写入用户偏好表中,起到执行器的作用。
二、异步
在此模块中,用户信息采集、计算写入均是采用的异步执行。在本项目中,异步的实现主要是通过基于线程池进行。通过配置线程池,当异步方法发生调用时,通过到线程池中获取线程进行方法执行调用。
线程池配置示例:
/**
* 基础业务逻辑
*/
@Bean
public Executor asyncServiceExecutor() {
log.info("ExecutorConfiguration#asyncServiceExecutor start...");
return getDefaultExecutor();
}
/**
* 获取默认执行器
*/
private synchronized Executor getDefaultExecutor() {
ThreadPoolTaskExecutor executor = new VisibleThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix(threadNamePrefix);
executor.setKeepAliveSeconds(keepAliveSeconds);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
其中,方法名asyncServiceExecutor即为线程池名称。同时,在配置过程中,需要注意线程池策略问题,以下为各个策略说明:
- ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出RejectedExecutionException异常。
- ThreadPoolExecutor.DiscardPolicy: 也是丢弃任务,但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy: 丢弃队列最前面的任务&#x