使用pig来实现快速的分析爬虫及cdn日志

      苦逼呀,这两天我在分析了爬虫的日志,和一小部分的cdn的日志。爬虫的日志收集cs是我们自己写的一套收集系统。  现在需要做的是离线分析。  也就是对接工单系统,可以方便的自动分析特定的日志。 以前有个哥们是个geek,分析的程序是groovy写的,虽然他已经在很大程度让我爽了很多,但是不怎么好改。  java派系的那些东西,玩不转呀。

最近爬虫很是凶猛呀。原文地址是,http://xiaorui.cc

      那一开始是用python写的,逻辑也简单,就是拆分成多个文件,然后多进程处理,最后的结果入库。 总起来说,速度还是有些慢。一个5g的日志,经常干到最少40分钟。 因为日志会做域名的抽取。   爬虫log里面肯定是有很多域名的, 但是域名都是详细的域名,所以需要抽取他的一级域名。  就这个操作是很费cpu的。    

      其实做这件事情前,我也考虑过用pig,毕竟以前用pig从hadoop里面抽取访问次数和ip排名。 只是我印象中 pig 没有regex的功能,也就没有搜他的文档,直接用python搞的。 

#coding:utf-8
from urlparse import urlparse
from buzz.lib.consts import CATEGORY
import 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管道取数据,性能不是那么太靠谱。 



大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

3 Responses

  1. 沈灿 2014年12月7日 / 下午8:47

    带我,ruishen

  2. ruby 2014年12月7日 / 上午9:17

    上次在群里说,写个详细的pig,请问详细的在哪里?

    • 峰云 2014年12月8日 / 上午9:49

      正在准备下,这次环境有些问题,就写点概念性质的东西。

沈灿进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注