如何使用python使用hadoop处理apache日志文件

myzjeezk  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(652)

我是hadoop的新手,不能很好地理解这个概念,我遵循了下面的过程
安装hadoop
通过在python中看到这里和worcount示例,尝试了教程中的基本示例,并且可以很好地使用它们。
实际上,我正试图做的/我得到的要求是在fedora(linux)中处理位于 /var/log/httpd hadoop使用python,格式如下

IP address    Count of IP   Pages accessed by IP address

我知道apache日志文件有两种
访问\u日志
错误日志
但是我真的无法理解apache日志文件的格式。
我的apache日志文件内容如下

::1 - - [29/Oct/2012:15:20:15 +0530] "GET /phpMyAdmin/ HTTP/1.1" 200 6961 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"
::1 - - [29/Oct/2012:15:20:16 +0530] "GET /phpMyAdmin/js/cross_framing_protection.js?ts=1336063073 HTTP/1.1" 200 331 "http://localhost/phpMyAdmin/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"
::1 - - [29/Oct/2012:15:20:16 +0530] "GET /phpMyAdmin/js/jquery/jquery-1.6.2.js?ts=1336063073 HTTP/1.1" 200 92285 "http://localhost/phpMyAdmin/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"

有人能给我解释一下上面/apache日志文件的结构吗
我不知道如何处理日志文件中的数据ip地址,ip地址计数,ip地址访问的页面
有人能告诉我如何使用python和上面的信息用haddop处理apache日志文件,并以上面提到的格式存储结果吗
也可以请任何人提供一个用python处理上述格式的apache日志文件的基本代码,这样我就可以实时了解如何用python代码处理文件,并根据需要进行扩展

wmomyfyw

wmomyfyw1#

这只是一个部分的答案,但我希望你会发现它的使用,如果你需要任何更具体的请更新您的问题与您的代码和具体的要点,你是卡住了。
文件处理人员
python文档非常好地解释了文件处理。
如果您想实时监视日志文件(我想这就是您的问题的意思……),那么请查看下面的问题。它还涉及监视日志文件。我真的不喜欢公认的答案,但有很多好的建议。
生产线加工材料
一旦您设法从日志文件中获得单独的行,那么您就需要对它们进行处理。它们只是字符串,所以只要你知道格式就很简单了。我再次提到python文档。如果你想做任何激烈的事情,你可能想检查一下。
现在考虑到你给我们的那句话的格式:
编辑给定的日志行的实际格式,我们现在可以取得进展。。。
因此,如果从日志文件中获取一行:

line = '::1 - - [29/Oct/2012:15:20:15 +0530] "GET /phpMyAdmin/ HTTP/1.1" 200 6961 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"'

第一步是把它分成不同的部分。我利用了日期和时间被包围在“[…]”的事实

lElements = line.split('[')
lElements = lElements[0] + lElements[1].split(']')

这给我们留下了:

lElements[0] = '::1 - - ' #IPv6 localhost = ::1
lElements[1] = '29/Oct/2012:15:20:15 +0530'
lElements[2] = ' "GET /phpMyAdmin/ HTTP/1.1" 200 6961 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"'

日期元素可以转换成更友好的格式
“url”元素包含关于实际请求的信息(http动词、http版本、一个神秘的数字和一堆用户代理信息)。
编辑添加代码以获取url和ip地址。忽略时间因素

ip_address = lElements[0].split('-')[0] # I'm just throwing away those dashes. are they important?
http_info = lElements[2].split('"')[1] # = 'GET /phpMyAdmin/ HTTP/1.1'
url = http_info.split()[1]  # = '/phpMyAdmin/'

"""
so now we have the ip address and the url. the next bit of code updates a dictionary dAccessCount as the number of url accesses increases...
dAccessCount should be set to {} initially
"""

if ip_address in dAccessCount:
    if url in dAccessCount[ip_address]:
        dAccessCount[ip_address][url]+=1
    else:
        dAccessCount[ip_address][url]=1
else:
    dAccessCount[ip_address] = {url:1}

因此,daccesscount的键是访问任何url的所有ip地址,daccesscount[some\u ip\u address]的键是该ip\u address访问的所有url,最后:daccesscount[some\u ip\u address][some\u url]=从某个ip\u地址访问某个url的次数。

相关问题