2012-11-02 1 views
-1

Je suis novice très à Hadoop et incapable de comprendre le concept bien, je l'avais suivi ci-dessous processusComment traiter un fichier journal apache avec Hadoop en utilisant python

  1. installé Hadoop en voyant here

  2. Essayé les exemples de base dans le tutoriel en voyant here et Wccount exemple en python et fonctionne très bien avec eux.

En fait ce que je suis en train de faire/l'exigence que je suis arrivé est le traitement d'un fichier journal apache dans fedora (linux) situé à /var/log/httpd avec Hadoop en utilisant python dans le format ci-dessous

IP address Count of IP Pages accessed by IP address 

Je sais que les fichiers journaux apache seront de deux types

  1. access_logs

  2. error_logs

mais je suis vraiment incapable de comprendre le format des fichiers journaux apache.

Mon contenu du fichier journal apache est quelque chose comme ci-dessous

::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" 

Quelqu'un peut-il s'il vous plaît me expliquer la structure des fichiers journaux ci-dessus/apache

Je suis confus sur la façon de traiter le fichier journal avec le adresse Ip de données, countof adresse IP, pages accédées par l'adresse IP

Quelqu'un peut-il me faire savoir comment nous pouvons traiter les fichiers journaux apache avec haddop en utilisant les informations python et ci-dessus et stocker le résultat dans le format mentionné ci-dessus

Quelqu'un peut-il également fournir un code de base en python pour traiter les fichiers journaux apache dans le format ci-dessus, afin que je puisse avoir une idée en temps réel du traitement des fichiers avec le code python

Répondre

2

Ceci est juste une réponse partielle, mais j'espère que vous la trouverez utile, si vous avez besoin de quelque chose de plus spécifique, veuillez mettre à jour votre question avec votre code et les points spécifiques sur lesquels vous êtes collé.

substance de traitement de fichiers

Le Python docs expliquer le traitement des fichiers très bien.

Si vous souhaitez surveiller les fichiers journaux en temps réel (je pense que c'est ce que votre question signifiait ...), puis consultez this question here. Il s'agit également de surveiller un fichier journal. Je n'aime pas vraiment la réponse acceptée, mais il y a beaucoup de bonnes suggestions.

substance de traitement de ligne

Une fois que vous parvenez à obtenir des lignes individuelles à partir du fichier journal, alors vous aurez envie de les traiter.Ce ne sont que des ficelles, aussi longtemps que vous connaissez le format, c'est assez simple. Encore une fois, je me réfère à the python docs. Dans le cas où vous voulez faire quelque chose d'intense, vous pourriez vouloir vérifier cela.

Maintenant, étant donné le format de la ligne que vous nous avez:

EDIT étant donné le format réel de lignes de log que nous pouvons faire des progrès ...

Donc, si vous prenez une ligne d'un journal fichier tel que:

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"' 

La première étape consiste à le diviser en différents morceaux. Je utilise le fait que la date et l'heure sont entourées en [...] '

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

Cela nous laisse:

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"' 

L'élément date can be converted into a friendlier format

Le' L'élément url 'contient des informations sur la requête actuelle (le verbe HTTP, la version HTTP, un nombre mystérieux et un tas de trucs d'agent utilisateur).

EDIT Ajout de code pour saisir l'adresse URL et l'adresse IP. bourre temps ignoreing

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} 

Ainsi, les clés de dAccessCount sont les toutes les adresses IP qui ont accédé à une URL, et les clés de dAccessCount [some_ip_address] sont tous les urls que ce ip_address a accédé, et enfin: dAccessCount [ some_ip_address] [some_url] = le nombre de fois que l'on a accédé à some_url à partir de some_ip_address.

Questions connexes