需求分析
网站日志需求分析
由于缺乏真实网站日志,在这里用 Python 2.7.5 构建日志生成器模拟网站日志,作为之后实验的基础。
之后的实验为用 Flume 采集网站的日志信息,基于此做一系列的处理。
为搭建好网站之后采集真实网站日志信息做准备。
数据集需求分析
由于缺乏有效的 ALS 数据集做为模型的训练与测试,在这里用 Python 2.7.5 构建日志生成器模拟数据集。
为 Spark Streaming + ALS 推荐系统的模型的训练与测试做准备
环境说明
系统: CentOS 7.2 mini
Python 版本: 2.7.5
(PS: Python 为 CentOS 7.2 mini 自带的,可通过 python --version 来查看 Python 的版本,注意 Python 2.X 和 Python 3.X 存在很大的区别,这里采用的是系统自带的 Python 2.7.5)
Python 日志生成器的编写
网站日志生成器的编写
格式可根据实际需求做出调整
generate_log.py 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92import random
import time
#从什么搜索引擎跳转过来的
http_referers = [
"http://www.baidu.com/s?wd={query}",
"https://www.google.com/search?q={query}",
"https://www.sougou.com/web?query={query}",
"http://cn.bing.com/search?q={query}",
"https://search.yahoo.com/search?p={query}"
]
#搜索关键字
search_keyword = [
"鸡排饭",
"虾排饭",
"芒果布丁",
"海鲜自助",
"水果拼盘",
"黄焖鸡米饭",
"西红柿牛腩面"
]
#网站链接路径
url_path = [
"class/111.html",
"class/112.html",
"class/113.html",
"class/114.html",
"class/115.html",
"class/116.html",
"anyway/666",
"NoBUG/666"
]
#ip地址
ip_slices = [10,123,132,125,168,187,25,66,37,168,131,86,53,19,163]
#状态码
status_codes = ["200","404","500"]
#sample(seq, n)从序列seq中选择n个随机且独立的元素
#随机生成一个带refer和keyword的url
def sample_refer():
if random.uniform(0, 1) > 0.2:
return "_"
refer_str = random.sample(http_referers, 1)
query_str = random.sample(search_keyword, 1)
return refer_str[0].format(query=query_str[0])
#随机生成一个url
def sample_url():
return random.sample(url_path,1)[0]
#随机生成一个ip
def sample_ip():
slice = random.sample(ip_slices,4)
return ".".join([str(item) for item in slice])
#随机生成一个状态码
def sample_status_code():
return random.sample(status_codes,1)[0]
def generate_log(count = 10):
#获取本地时间
time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#打开access.log文件,并赋予 f 写的权限
#w+为消除文件内容,然后以读写方式打开文件。
#a+为以读写方式打开文件,并把文件指针移到文件尾
#为了将数据连续的写入文件采用 a+
#f = open("/abs/project/data/log/access.log","w+")
f = open("/abs/project/data/log/access.log","a+")
while count >=1:
query_log="{ip}t{local_time}t"GET /{url} HTTP/1.1"t{status_code}t{refer}".format(local_time=time_str,url=sample_url(),ip=sample_ip(),refer=sample_refer(),status_code=sample_status_code())
#测试时输出到控制台,在实际使用中是将他存入相应的文件中
#print query_log
#将日志输入到access.log
f.write(query_log + "n")
count = count - 1
if __name__ == '__main__':
generate_log()
数据集生成器的编写
我们所需要的数据集的格式为: user_id::food_id::food_rating
可根据实际需求做出调整
generate_dataset.py 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51import random
#食物id
food_id = [1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,
1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,
1021,1022,1023,1024,1025,1026,1027,1028,1029,1030]
#用户id
user_id = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
#用户对食物的评价
food_rating = [1,2,3,4,5]
#sample(seq, n)从序列seq中选择n个随机且独立的元素
#随机生成一个food
def sample_food():
return random.sample(food_id, 1)[0]
#随机生成一个用户
def sample_user():
return random.sample(user_id, 1)[0]
#随机生成一个食物评价
def sample_foodrating():
return random.sample(food_rating, 1)[0]
def generate_dataset(count = 10):
#打开rating文件,并赋予 f 写的权限
#w+为消除文件内容,然后以读写方式打开文件。
#a+为以读写方式打开文件,并把文件指针移到文件尾
#为了将数据连续的写入文件采用 a+
#f = open("/abs/project/data/dataset/rating","w+")
f = open("/abs/project/data/dataset/rating","a+")
while count >=1:
#query_log="{food}t{user}t{foodrating}".format(food=sample_food(),user=sample_user(),foodrating=sample_foodrating())
query_log="{food}::{user}::{foodrating}".format(food=sample_food(),user=sample_user(),foodrating=sample_foodrating())
#测试时输出到控制台,在实际使用中是将他存入相应的文件中
#print query_log
#将日志输入到rating
f.write(query_log + "n")
count = count - 1
if __name__ == '__main__':
generate_dataset()
扩展
定时执行工具
Linux crontab
参照介绍可以得出每隔1分钟执行一次的 crontab 表达式 */1****
在 /abs/project 目录中新建日志生成器脚本 log_generator.sh
1
2
3
4# 新建日志生成器脚本 log_generator.sh
vi log_generator.sh
python /abs/lib/generate_log.py
新打开一个界面,然后查看输出 tail -200f /abs/project/data/log/access.log
为 log_generator.sh 增加可执行权限 chmod u+x log_generator.sh
执行脚本 ./log_generator.sh
配置 crontab
1
2
3
4
5
6
7
8
9
10
11# 配置 crontab
crontab -e
# 每隔1分钟执行一次 log_generator.sh
*/1 * * * * /abs/project/log_generator.sh
# 查看 crontab
crontab -l
# 删除 crontab
crontab -r
小结
学会了用 Python 实现日志生成器的代码编写,并在此基础上进行相关拓展
学会了周期性执行任务的守护进程 crontab 的基本操作与使用