随着互联网知识信息指数级膨胀,个性化的需求对于用户来讲愈来愈重要,经过推荐算法和用户点击行为的流式计算能够很简单的作出一个商用的推荐系统。java
spark streaming从kafka读取用户行为数据,过滤数据后从redis中拉取物品类似度矩阵,从db或缓存中获取用户历史行为,经过协同过滤进行兴趣/ctr候选集计算,将结果缓存到redis,异步持久化到db,经过接口进行数据展现。mysql
开发包使用KafkaUtils类redis
数据从kafka拉取时,可能由于程序异常,形成数据丢失或不一致,能够经过kafka把数据从新拉取,能够指定offset读取。算法
从kafka拉取数据,转换为spark streaming中的数据结构DStream。 接收数据有两种:sql
基本的使用kafka高阶api,接收的全部数据存储在spark的executor中,以后spark streaming提交的job会处理这些数据。数据库
reveiver方式,spark中partiton和kafka的partition并非相关的,若是加大每一个topic的partition数量,仅仅增长线程来处理由单一receiver消费的主题,但并无增长spark在处理数据上的并行度。api
对于不一样的group和topic,可使用多个receiver建立不一样的DStream来提高并行度,以后利用union来统一成一个DStream。缓存
Direct方式,没有receiver这一层,会周期性的获取kafka中每一个topic的每一个partition中新的offset,以后根据设定的maxRatePerPartition来处理每一个batch。网络
相较于receiver方式的优点是:数据结构
receiver方式,是从zk获取offset值,zk保存了当前消费的offset值,若是从新启动开始消费会接着上次offset继续消费。 direct方式中,直接从kafka来读取数据,offset要本身记录,能够经过checkpoint,数据库,文件记录,或者写回到zk。
若是批处理时间设置短,产生的job并不能在这期间完成,就会形成数据不断累积,致使spark streaming阻塞。
spark streaming中的DStream若是被反复利用,最好使用cache(),将数据流缓存起来,防止过分调度形成网络开销。
设置合理的GC,并行垃圾回收。