分享

关于mapreduce统计准确性的问题

wjhdtx 发表于 2014-12-5 09:33:56 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 11638
本帖最后由 wjhdtx 于 2014-12-5 14:26 编辑

需要统计的是:按城市统计visitIp出现的个数(需要IP去重),即每个城市每天的UV(用户访问数)。


程序比较简单,大概如下:
  1. public void map(...)
  2. {
  3.    ...
  4.    if(!redis.sIsMember(uvSetKey.getBytes(), visitIp.getBytes())) // 去重
  5.    {
  6.       uv = 1;
  7.       redis.sAdd(uvSetKey.getBytes(), visitIp.getBytes())  // 去重</span>
  8.       redis.hSet("uvmap", city, redis.hGet("uvmap", city) + 1);  // redis实现统计结果
  9.    }
  10.    ...
  11.    context.write(city, uv);
  12. }
  13. public void reduce(...)
  14. {
  15.    int sumUv;
  16.    for (int uv : values) {
  17.       sumUv += uv;
  18.    }
  19.    ...
  20.    context.write(city, sumUv);        
  21. }
复制代码

大家注意下,在map方法中,我用redis也实现了该mapreduce作业要实现的统计结果。
问题是,最后我统计redis中的结果和mapreduce作业中的结果有出入,对于每个城市的uv总量,mapreduce的统计量要小于redis的统计量。

mareduce   redis
----------------------
4754          4958
996            1021
...




我仔细看了程序,没什么大问题。mapreduce要经历 排序、分区、combine、copy、合并、reduce等,是中间结果可能数据有问题吗?

谢谢









已有(4)人评论

跳转到指定楼层
desehawk 发表于 2014-12-5 13:53:56


这个属于逻辑错误,楼主可以看看pv、与uv。
看看是不是去重的问题。

还有个笨方法,就是找出它们不同点。然后深究原因。
回复

使用道具 举报

wjhdtx 发表于 2014-12-5 14:18:25
本帖最后由 wjhdtx 于 2014-12-5 14:23 编辑
desehawk 发表于 2014-12-5 13:53
这个属于逻辑错误,楼主可以看看pv、与uv。
看看是不是去重的问题。

1. 没有逻辑问题(pv、uv只是举个例子而已)
2. 不是去重的问题,两个代码都在一个if中,且有去重问题,mapreduce的结果数应该大于redis的结果数
回复

使用道具 举报

desehawk 发表于 2014-12-5 14:28:31
wjhdtx 发表于 2014-12-5 14:18
1. 没有逻辑问题(pv、uv只是举个例子而已)
2. 不是去重的问题,两个代码都在一个if中,且有去重问题, ...


目前都是主观的交流,没有太大的意义。
建议楼主,仔细调试。
比如认为可能在哪会出问题,不一样的原因,要么map,要么reduce。
先一个个定位,这样才比较容易找出问题。
回复

使用道具 举报

wjhdtx 发表于 2014-12-5 16:13:16
desehawk 发表于 2014-12-5 14:28
目前都是主观的交流,没有太大的意义。
建议楼主,仔细调试。
比如认为可能在哪会出问题,不一样的原 ...

下周详细测试下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条