苦逼呀,这两天我在分析了爬虫的日志,和一小部分的cdn的日志。爬虫的日志收集cs是我们自己写的一套收集系统。 现在需要做的是离线分析。 也就是对接工单系统,可以方便的自动分析特定的日志。 以前有个哥们是个geek,分析的程序是groovy写的,虽然他已经在很大程度让我爽了很多,但是不怎么好改。 java派系的那些东西,玩不转呀。
最近爬虫很是凶猛呀。原文地址是,http://xiaorui.cc
那一开始是用python写的,逻辑也简单,就是拆分成多个文件,然后多进程处理,最后的结果入库。 总起来说,速度还是有些慢。一个5g的日志,经常干到最少40分钟。 因为日志会做域名的抽取。 爬虫log里面肯定是有很多域名的, 但是域名都是详细的域名,所以需要抽取他的一级域名。 就这个操作是很费cpu的。
其实做这件事情前,我也考虑过用pig,毕竟以前用pig从hadoop里面抽取访问次数和ip排名。 只是我印象中 pig 没有regex的功能,也就没有搜他的文档,直接用python搞的。
#coding:utf-8from urlparse import urlparsefrom buzz.lib.consts import CATEGORYimport re""" 针对没有分类和channel_name"""class knowDomainClass(): def __init__(self): self.topHostPostfix = ( '.com','.la','.io', '.co', '.cn','.info', '.net', '.org','.me', '.mobi', '.us', '.biz', '.xxx', '.ca', '.co.jp', '.com.cn', '.net.cn', '.org.cn', '.mx','.tv', '.ws', '.ag', '.com.ag', '.net.ag', '.org.ag','.am','.asia', '.at', '.be', '.com.br', '.net.br', '.bz', '.com.bz', '.net.bz', '.cc', '.com.co', '.net.co', '.nom.co', '.de', '.es', '.com.es', '.nom.es', '.org.es', '.eu', '.fm', '.fr', '.gs', '.in', '.co.in', '.firm.in', '.gen.in', '.ind.in', '.net.in', '.org.in', '.it', '.jobs', '.jp', '.ms', '.com.mx', '.nl','.nu','.co.nz','.net.nz', '.org.nz', '.se', '.tc', '.tk', '.tw', '.com.tw', '.idv.tw', '.org.tw', '.hk', '.co.uk', '.me.uk', '.org.uk', '.vg') self.extractPattern = r'[^\.]+('+'|'.join([h.replace('.',r'\.') for h in self.topHostPostfix])+')$' def parse_url(self,url): parts = urlparse(url) host = parts.netloc# extractPattern = r'[^\.]+('+'|'.join([h.replace('.',r'\.') for h in self.topHostPostfix])+')$' pattern = re.compile(self.extractPattern,re.IGNORECASE) m = pattern.search(host) return m.group() if m else host def if_url_class(self,url): if re.search('(space|blog)',url): return 2 if re.search('(ask|question)',url): return 5 if re.search('(forum|club|bbs|thread)',url): return 3 return 1
今天看了下文档,发现 尼玛 是支持regex的。哎。。 坑死了。 简单介绍下pig
Apache Pig是用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程序的难度要小N倍,实现同样的效果的代码量也小N倍。Apache Pig为大数据集的处理提供了更高层次的抽象,为mapreduce算法(框架)实现了一套类SQL的数据处理脚本语言的shell脚本,在Pig中称之为Pig Latin,在这套脚本中我们可以对加载出来的数据进行排序、过滤、求和、分组(group by)、关联(Joining),Pig也可以由用户自定义一些函数对数据集进行操作,也就是传说中的UDF(user-defined functions)。
Pig有两种运行模式:Loca模式和MapReduce模式。当Pig在Local模式下运行时,Pig只访问本地一台主机;当Pig在MapReduce模式下运行时,它将访问一个Hadoop集群和HDFS的安装位置。这时,Pig将自动地对这个集群进行分配和回收。因为Pig系统可以自动对MapReduce程序进行优化,所以当用户使用Pig Latin语言进行编程的时候,不必关心程序运行的效率,Pig系统将会自动对程序进行优化,这样可以大了节省编程时间。Pig的Local模式和MapReduce模式都有三种运行方式,分别为:Grunt Shell方式、脚本文件方式和嵌入式程序方式。
Pig是一种编程语言,它简化了Hadoop常见的工作任务。Pig可加载数据、表达转换数据以及存储最终结果。Pig内置的操作使得半结构化数据变得有意义(如日志文件)。同时Pig可扩展使用Java中添加的自定义数据类型并支持数据转换。
([a-z0-9A-Z]+\\.(com|hk|la|io|net|mx|com.cn|fm|tv|ws|cc|org|tv)).
本来想周六写个pig的文档,结果 mac下pig装的有问题。公司的那个测试机还连不上,尼玛。 现在正在下载vm,过会给大家演示下。
总起来说,pig的速度要比python要快不少,尤其是从hadoop输入文件的时候。 毕竟像python这样靠着streaming管道取数据,性能不是那么太靠谱。