项目背景
目的是熟悉spark的使用和编程套路
官方demo是要看的,但毕竟是demo,离工程实际太远
考虑后,决定构造一个数据沙盒,然后在用spark在这个数据沙盒内实现一个在线推荐算法
算法调通后,可以在其他数据集上去尝试效果
数据沙盒,是指规划的这个在线推荐算法,接受的所有数据源,包括用户反馈都是程序构造的,算法要解决的实际问题并不是一般的提升转化率或利润率,而是挑战测试数据的输入方。
这种算法在真实的企业里应该效果不好,但作为编程练习还是很够难度的。
作为不太准确的类比,在训练人工智能下围棋,打星际,打王者荣耀时,一个重要手段是让AI程序之间自身对战,每天对局次数可以达到人类上百年,毕竟程序的运行效率比真人快太多
构造产品集合
算法从可用数据开始考虑,虽然所有数据都可以构造,但也分难易先后
第一波我选择构造浏览数据,
数据格式本身简单,就是一批数字作为商品id,每个id带1-3个数量不等的标签id
略有难度的是浏览数据如何输入给spark
spark内有多个数据加载方式,例如通过textfile读本地硬盘文件,textfilestream监视hdfs路径,sockectstream从外部服务读,从kafka订阅
显然最接近工程实际的是从kafka订阅
语言选择python这个老朋友,访问python的库来自pip的confluent_kafka
先搞一个简单的消费者,官方例子就差不多,只收消息不处理
from confluent_kafka import Consumer, KafkaError
c = Consumer ( {
\
'bootstrap.servers':'localhost:9092', \
'group.id':'NullDumper'\
})
c.subscribe (['AccessLog'])
msgCount = 0
while True:
msg = c.poll (1.0)
if msg is None:
continue
if msg.error ():
print ("Consumer error: {}".format (msg.error ()))
continue
msgCount += 1
if msgCount % 100 == 0 :
print ('Received {} messages\n{}'.format (msgCount,msg))
c.close ()
再弄个生产者,这就比消费者要复杂多了,
因为还要有个模拟用户行为的对手方,这个生产者承担的实际是个要写日志的API服务
自己要监听端口提供,根据访问请求来返回一定数量的商品列表
返回的商品列表要写入kafka作为推荐算法的数据源
推荐算法的推荐结果也要从这里推出给对手方
python里的异步socket有好久没用了,一天才撸完一个粗略框架
先记录一下
import csv
import random
import sys
import socket
import selectors
from confluent_kafka import Producer
sel