免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2211 | 回复: 0
打印 上一主题 下一主题

[Hadoop&HBase] 利用hadoop的mapreduce做用户来源统计 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-23 02:32 |只看该作者 |倒序浏览
假设一个这样的应用场景:需要对一个大日志文件(这个文件有100G或1T大)做用户来源的统计,需要<br>得到的结果是:广东省&nbsp;xxx;北京xxx……&nbsp;或&nbsp;电信&nbsp;xxxx&nbsp;;联通&nbsp;xxxx。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主要的工作步骤很简单:获取到用户的IP,解析到用户IP的地址,然后做地址的统计。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在我们用hadoop来简单实现),在实现过程中,对ip来源地址的解析我现在偷懒只是简单使用了web调用接口,而不使用程序client调用接口和解析纯真库。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;定义Map方法(日志格式为:User_IP|date|URI……):<br><a href="http://blog.chinaunix.net/attachment/201110/27/22270773_1319685789JFTj.jpg" target="_blank" target="_blank"><img src="http://blog.chinaunix.net/attachment/201110/27/22270773_1319685789JFTj.jpg" .load="imgResize(this, 650);" ;="" border="0"></a><br>主要流程为:获取到每行的第一个字段,使用whois对这个ip进行解析,然后,将来源地址和来源地址的数量做一个key-value。<br><br>Reduce:<br>&nbsp; <a href="http://blog.chinaunix.net/attachment/201110/27/22270773_1319685826K5l5.jpg" target="_blank" target="_blank"><img src="http://blog.chinaunix.net/attachment/201110/27/22270773_1319685826K5l5.jpg" .load="imgResize(this, 650);" ;="" border="0"></a><br>这个就更简单了;对每个key-value对做相加的操作。<br><br>主体程序:<br><a href="http://blog.chinaunix.net/attachment/201110/27/22270773_13196858602wuY.jpg" target="_blank" target="_blank"><img src="http://blog.chinaunix.net/attachment/201110/27/22270773_13196858602wuY.jpg" .load="imgResize(this, 650);" ;="" border="0"></a><br>在这里感叹一句:以前写个分布式并行运行可麻烦一点,现在很多的一些调度框架使用起来做<br>这方面的事情方便很多)<br><br><br>[hadoop@hadoop-237-13 bin]$ hadoop fs -cat /test/userplace/gzoutput/part-00000<br>
广东省广州市 电信&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br>
广东省汕尾市 电信 &nbsp; &nbsp;&nbsp;&nbsp; 1<br>
江苏省苏州市 电信 &nbsp; &nbsp;&nbsp;&nbsp; 1<br>
福建省泉州市 电信&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br><br><br><br>在这里引申一个问题,hadoop中使用第三方包的方法:<br>1.将第三方jar包放在集群中每个节点$HADOOP_HOME/lib目录下或者JDK的ext目录下,其中<br>$HAOOP_HOME为Hadoop的根目录。善于偷懒所以我也采用这种了,因为我做的一些运算使用<br>的包还是比较固定,在装hadoop的时候打包进去就行。<br><br>2.将所有的jar包解压缩,然后把他和源程序的类文件打包到一个jar包中。<br><br>3.使用DistributeCache&nbsp;&nbsp;<a target="_blank" href="http://blog.csdn.net/amuseme_lu/article/details/6706110">http://blog.csdn.net/amuseme_lu/article/details/6706110</a><br><br>&nbsp;&nbsp;对DistribueCache的使用是抄网上的<br>&nbsp;&nbsp;a.&nbsp;配置应用程序的cache,把需要使用的文件上传到DFS中去&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;bin/hadoop&nbsp;fs&nbsp;-copyFromLocal&nbsp;lookup.dat&nbsp;/myapp/lookup.dat&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;bin/hadoop&nbsp;fs&nbsp;-copyFromLocal&nbsp;map.zip&nbsp;/myapp/map.zip&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;bin/hadoop&nbsp;fs&nbsp;-copyFromLocal&nbsp;mylib.jar&nbsp;/myapp/mylib.jar&nbsp;<br>$&nbsp;bin/hadoop&nbsp;fs&nbsp;-copyFromLocal&nbsp;mytar.tar&nbsp;/myapp/mytar.tar<br>$&nbsp;bin/hadoop&nbsp;fs&nbsp;-copyFromLocal&nbsp;mytgz.tgz&nbsp;/myapp/mytgz.tgz&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;$&nbsp;bin/hadoop&nbsp;fs&nbsp;-copyFromLocal&nbsp;mytargz.tar.gz&nbsp;/myapp/mytargz.tar.gz&nbsp;&nbsp;<br><br><br>&nbsp;&nbsp;b.&nbsp;配置JobConf<br>&nbsp;&nbsp;&nbsp;JobConf&nbsp;job&nbsp;=&nbsp;new&nbsp;JobConf();&nbsp;&nbsp;<br>&nbsp;&nbsp;DistributedCache.addCacheFile(new&nbsp;URI("/myapp/lookup.dat#lookup.dat"),job);&nbsp;//&nbsp;这里的lookup.dat加了一个符号连接<br>&nbsp;&nbsp;DistributedCache.addCacheArchive(new&nbsp;URI("/myapp/map.zip",&nbsp;job);&nbsp;<br>&nbsp;&nbsp;DistributedCache.addFileToClassPath(new&nbsp;Path("/myapp/mylib.jar"),&nbsp;job);&nbsp;//&nbsp;这里是把相应的jar包加到Task的启动路径上去<br>&nbsp;&nbsp;DistributedCache.addCacheArchive(new&nbsp;URI("/myapp/map.zip",&nbsp;job);&nbsp;<br>&nbsp;&nbsp;DistributedCache.addFileToClassPath(new&nbsp;Path("/myapp/mylib.jar"),&nbsp;job);&nbsp;//&nbsp;这里是把相应的jar包加到Task的启动路径上去<br>&nbsp;&nbsp;Distri<br>butedCache.addCacheArchive(new&nbsp;URI("/myapp/mytar.tar",&nbsp;job);&nbsp;<br>&nbsp;&nbsp;DistributedCache.addCacheArchive(new&nbsp;URI("/myapp/mytargz.tar.gz",&nbsp;job)<br><br><br><br><br>c.&nbsp;在Mapper或者Reducer任务中使用这些文件<br>&nbsp;&nbsp;&nbsp;&nbsp;<ul class="wysiwygUl1"><li class="wysiwygLi">public&nbsp;static&nbsp;class&nbsp;MapClass&nbsp;extends&nbsp;MapReduceBase&nbsp;&nbsp;&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;implements&nbsp;Mapper&lt;K,&nbsp;V,&nbsp;K,&nbsp;V&gt;&nbsp;{&nbsp;&nbsp;</li><li class="wysiwygLi"><br></li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Path[]&nbsp;localArchives;&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Path[]&nbsp;localFiles;&nbsp;&nbsp;</li><li class="wysiwygLi"><br></li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;configure(JobConf&nbsp;job)&nbsp;{&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;the&nbsp;cached&nbsp;archives/files&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localArchives&nbsp;=&nbsp;DistributedCache.getLocalCacheArchives(job);&nbsp;&nbsp;//&nbsp;得到本地打包的文件,一般是数据文件,如字典文件&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localFiles&nbsp;=&nbsp;DistributedCache.getLocalCacheFiles(job);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;得到本地缓冲的文件,一般是配置文件等&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li class="wysiwygLi"><br></li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;map(K&nbsp;key,&nbsp;V&nbsp;value,&nbsp;&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputCollector&lt;K,&nbsp;V&gt;&nbsp;output,&nbsp;Reporter&nbsp;reporter)&nbsp;&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IOException&nbsp;{&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Use&nbsp;data&nbsp;from&nbsp;the&nbsp;cached&nbsp;archives/files&nbsp;here&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.collect(k,&nbsp;v);&nbsp;&nbsp;</li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br></li><li class="wysiwygLi">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br></li></ul><br>
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP