为什么写这篇文件?
我们在统计的时候pv和uv可以说的最基础的也是最常见的,相信做数据的都知道。这种需求
我们一般就是使用hive进行统计就完事了,非常的简单。
根据url计算每个页面的访问次数和独立访客用户数。
为什么写这篇文件?
我们在统计的时候pv和uv可以说的最基础的也是最常见的,相信做数据的都知道。这种需求
我们一般就是使用hive进行统计就完事了,非常的简单。
根据url计算每个页面的访问次数和独立访客用户数。
|
|
那好,我们通过mapreduce如何计算呢?
我想我大多数人都是通过在reduce中使用Set或者List进行判断是否在集合中存在,
如果不存在那么就加1。
事实却是如此,我搜索发现很多blog都是此方法并且内容大致相同,包括我最开始写的mapreduce也是
按照这种方法做的。
但是,使用这种方法做数据量小看不出问题,但是数据量一旦非常大就马上出现问题。
因为你的数据放在了内存,很容易就oom了。
其实我们需要通过两个mapreduce进行计算。
第一个map就是分割url+uid作为key,value为1
数据格式如下:
|
|
相同的key值发送到同一个reduce中,这样的话zhangsan的数据都为1了,reduce不用做什么就是
把key写入就行。
然后到了第二个map中,我们将第一个reduce的数据进行拆解就得到了url和uid的数据了
由于在第一个mr中已经将相同的uid和url归为一类,所以不会存在重复数据,所以这里就和
wordcount一样计算就行了。
实践
上面已经说了这么多了,是不是感觉很乏味了。来看看代码醒醒脑吧,嘿嘿嘿~
使用hadoop2.7.0
测试数据:
|
|
|
|
|
|
|
|
|
|
总结
一般使用分布式框架表示我们数据是比较大的,放内存肯定是不合理的。
看来代码质量有待提高!!!