Как обработать файл журнала apache с помощью hadoop, используя python

Я очень новичок в hadoop и не могу хорошо понять концепцию, я следовал нижеприведенному процессу

  1. Установил Hadoop, увидев здесь

  2. Попробовал основные примеры в учебнике, увидев здесь и пример работы с Python и прекрасно с ними работавший.

На самом деле то, что я пытаюсь сделать / требование, которое я получил, - это обработка файлов журнала apache в fedora(linux), расположенной по адресу /var/log/httpd с hadoop, используя python в следующем формате

IP address    Count of IP   Pages accessed by IP address

Я знаю, что файлы журнала Apache будут двух видов

  1. access_logs

  2. error_logs

но я действительно не могу понять формат файлов журнала 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-адресу

Может кто-нибудь сообщить мне, как мы можем обработать файлы журнала apache с помощью Haddop, используя информацию Python и выше, и сохранить результат в вышеупомянутом формате

Также может кто-нибудь предоставить основной код на python для обработки файлов журнала apache в указанном выше формате, чтобы я получил представление в реальном времени о том, как обрабатывать файлы с кодом python, и расширил их в соответствии с потребностями.

1 ответ

Решение

Это только частичный ответ, но я надеюсь, что вы найдете его полезным, если вам нужно что-то более конкретное, обновите ваш вопрос, указав свой код и конкретные моменты, на которых вы застряли.

материал для обработки файлов

Документы 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 - это все ip-адреса, которые обращались к любому URL-адресу, а ключи dAccessCount [some_ip_address] - это все URL-адреса, к которым обратился ip_address, и, наконец, dAccessCount[some_ip_address][some_url] = количество раз к some_url обращались из some_ip_address.

Другие вопросы по тегам