mrjob 多种运行方式
1、local 本地测试,直接在本地运行代码,检测代码是否有 bug;
2、inline 内嵌模式,在本地模拟 hadoop 集群上运行,特点是调试方便,启动单一进程模拟任务执行状态及结果,Mrjob 默认以内嵌方式运行
3、hadoop 集群模式,在 hadoop 集群上运行;
4、emr Amazon EMR 模式,参照 aws;
5、dataproc Google Cloud Platform 模式,参照谷歌云平台 Google Cloud Platform。
实战一:
这是一份用户观影的日志,日志是经过处理的 json 文件
数据文件:
video.log:http://bug.xuexianswer.com/hadoop/mrjob_data/video.log
下载数据文件:
wget -c http://bug.xuexianswer.com/hadoop/mrjob_data/video.log -O video.log
实验目标:通过这份日志来统计每部电影的热度,即每部电影有多少人观看过
{"user_id": "5E79247F1098C82E436B5980AF98D67D", "action": 0, "timestamp": 1534551357, "data": "01"} {"user_id": "45f218b28d19492a94c2fb1853351b91", "action": 0, "timestamp": 1535673718, "data": "04"} {"user_id": "5E79247F1098C82E436B5980AF98D67D", "action": 0, "timestamp": 1535750303, "data": "10"}
日志参数含义:
1、user_id:用户 id,观影用户的唯一标识;
2、action:用户行为,0表示用户浏览电影信息,并未进行观看,1表示用户观看了电影;
3、timestamp:时间戳,表示用户行为的发生时间;
4、data:电影 id,被操作的电影 id。
实战前准备:安装MRjob以及matplotlib
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pyyaml pip install mrjob pip install matplotlib
实现思路
1.下载数据文件video.log,放于项目目录中
2.创建video.py,通过 mapper 将输入的每条日志转为电影id:1格式的key:value值。然后在通过 reducer 针对每个 key(电影)进行 sum 的求和操作。最后就能统计出每部电影的观看用户数量。
from mrjob.job import MRJob import json #统计每个电影有多少人观看过 class GetVideos(MRJob): def mapper(self, _, line): try: jsline = json.loads(line) cuid = jsline["user_id"] action = jsline["action"] video = jsline["data"] if action == 1: yield video,1 except Exception: pass def reducer(self, key, value): yield key,sum(value) if __name__ == '__main__': GetVideos.run()
3.执行video.py文件
python video.py -r inline video.log > result.txt
4.运行结束后,result.txt文件内容为:
"01" 1 "02" 2 "03" 1 "04" 2 "05" 1 "06" 3 "07" 2 "09" 1 "10" 1 "11" 1 "12" 3 "14" 3 "15" 2
5.序号与对应的电影名称关系,如下:
01 一出好戏 02 大三儿 03 精灵旅社3:疯狂假期 04 巨齿鲨 05 欧洲攻略 06 快把我哥带走 07 新乌龙院之笑闹江湖 08 西虹市首富 09 小偷家族 10 爱情公寓 11 美食大冒险之英雄烩 12 狄仁杰之四大天王 13 神秘世界历险记4 14 最后的棒棒 15 风雨咒
6.编写result.py文件,将result.py的内容用图表的形式呈现:
import matplotlib.pyplot as plt #下方两行代码用于防止绘图时出现中文乱码 plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体 plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题 # 创建空列表,用于将电影,观影人数分别存放到x,y数组中 x = [] y = [] for line in open("result.txt"):#逐行读取 #将电影序号替换为电影名称 replist = {"01": "一出好戏", "02": "大三儿", "03": "精灵旅社", "04":"巨齿鲨", "05": "欧洲攻略", "06": "快把我哥带走", "07": "新乌龙院", "08": "西虹市首富", "09": "小偷家族", "10": "爱情公寓", "11": "美食大冒险", "12": "狄仁杰", "13": "神秘世界", "14": "最后的棒棒", "15": "风雨咒", } for i in replist: line = line.replace(i, replist[i]) # print(line) # 按空格分割为数组 wordsArray = line.split() x.append(wordsArray[0])#将电影名添加到数组x中 y.append(wordsArray[1])#将观影人数添加到数组y中 #绘制柱形图 plt.title('观影人数统计') # 防止标签重叠,可以将窗口设置的大一些 # plt.figure(figsize=(20, 6.5)) plt.bar(x, y, color = 'g', width = 0.5) plt.show()
7.最终的观影效果展示图:
本文作者为BUG之神,转载请注明。