本帖最后由 wjhdtx 于 2014-12-5 14:26 编辑
需要统计的是:按城市统计visitIp出现的个数(需要IP去重),即每个城市每天的UV(用户访问数)。
程序比较简单,大概如下:
- public void map(...)
- {
- ...
- if(!redis.sIsMember(uvSetKey.getBytes(), visitIp.getBytes())) // 去重
- {
- uv = 1;
- redis.sAdd(uvSetKey.getBytes(), visitIp.getBytes()) // 去重</span>
- redis.hSet("uvmap", city, redis.hGet("uvmap", city) + 1); // redis实现统计结果
- }
- ...
- context.write(city, uv);
- }
-
- public void reduce(...)
- {
- int sumUv;
- for (int uv : values) {
- sumUv += uv;
- }
- ...
- context.write(city, sumUv);
- }
复制代码
大家注意下,在map方法中,我用redis也实现了该mapreduce作业要实现的统计结果。
问题是,最后我统计redis中的结果和mapreduce作业中的结果有出入,对于每个城市的uv总量,mapreduce的统计量要小于redis的统计量。
mareduce redis
----------------------
4754 4958
996 1021
...
我仔细看了程序,没什么大问题。mapreduce要经历 排序、分区、combine、copy、合并、reduce等,是中间结果可能数据有问题吗?
谢谢
|