-1

我是hadoop的新手,无法很好地理解这个概念,我遵循了以下过程

  1. 通过查看此处安装了 Hadoop

  2. 通过查看此处和 python 中的 worcount 示例来尝试教程中的基本示例,并与它们一起正常工作。

实际上我正在尝试做的/我得到的要求是/var/log/httpd使用以下格式的 python 处理位于 hadoop的 fedora(linux) 中的 apache 日志文件

IP address    Count of IP   Pages accessed by IP address

我知道apache日志文件有两种

  1. 访问日志

  2. 错误日志

但我真的无法理解 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代码处理文件并根据需要扩展它们

4

1 回答 1

2

这只是部分答案,但我希望您会发现它有用,如果您需要更具体的内容,请使用您的代码和您遇到的具体问题更新您的问题。

文件处理的东西

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的key是访问过任意url的所有ip地址,dAccessCount[some_ip_address]的key是该ip_address访问过的所有url,最后:dAccessCount[some_ip_address][some_url] =次数some_url 是从 some_ip_address 访问的。

于 2012-11-02T10:12:40.320 回答