-1

私はhadoopの初心者で、概念をよく理解できません。以下のプロセスに従いました

  1. こちらを見てHadoopをインストール

  2. hereと worcount example in pythonを見て、チュートリアルの基本的な例を試してみて、それらをうまく操作してください。

実際に私がやろうとしていること/私が得た要件は/var/log/httpd、以下の形式でpythonを使用してhadoopであるfedora(linux)のApacheログファイルを処理することです

IP address    Count of IP   Pages accessed by IP address

Apache ログ ファイルは 2 種類になることを知っています

  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アドレスによってアクセスされたページでログファイルを処理する方法について混乱しています

Pythonと上記の情報を使用してhaddopでApacheログファイルを処理し、結果を上記の形式で保存する方法を教えてください。

また、上記の形式の apache ログ ファイルを処理するための基本的なコードを python で提供してください。これにより、python コードでファイルを処理する方法についてリアルタイムでアイデアを得ることができ、必要に応じてそれらを拡張できます。

4

1 に答える 1

2

これは部分的な回答にすぎませんが、それが役立つことを願っています。さらに具体的なことが必要な場合は、コードと行き詰まっている特定のポイントで質問を更新してください。

ファイル処理のもの

Pythonのドキュメントでは、ファイル処理について非常によく説明されています。

ログファイルをリアルタイムで監視したい場合は (それがあなたの質問の意味だと思います...)、この質問をチェックしてください here . また、ログ ファイルの監視についてもです。受け入れられた答えはあまり好きではありませんが、良い提案がたくさんあります。

ライン処理のもの

ログファイルから個々の行を取得できたら、それらを処理する必要があります。それらは単なる文字列であるため、フォーマットを知っている限り、非常に単純です。再びpython docsを参照します。何か激しいことをしたい場合は、チェックしてみてください。

あなたが私たちに与えた行のフォーマットを考えると:

ログ行の実際の形式を考慮して、編集を進めていくことができます...

したがって、ログ ファイルから次のような行を取得すると、次のようになります。

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 バージョン、不可解な番号、ユーザー エージェントの情報) が含まれます。

EDIT 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_ip_address] のキーはその ip_address がアクセスしたすべての URL であり、最後に: dAccessCount[some_ip_address][some_url] = 回数some_url は some_ip_address からアクセスされました。

于 2012-11-02T10:12:40.320 に答える