演習: Apache Hadoop でログを処理する

標準的な Linux システムで Hadoop を使用してログから有用なデータを抽出する

監査からエラー管理までの機能をサポートするログは、あらゆるコンピューター・システムに不可欠です。(クラウド環境における場合のように) ログが膨大な大きさになり、ログのソースが増加している今、ログを効率的に処理するスケーラブルなシステムが必要となっています。この演習では、標準的な Linux システムから Apache Hadoop を使用してログを処理する方法を探ります。

M. Tim Jones, Independent author, Consultant

Photo of M.Tim JonesM. Tim Jones は組み込みソフトウェアのエンジニアであり、『Artificial Intelligence: A Systems Approach』、『GNU/Linux Application Programming』(現在、第 2 版です) や『AI Application Programming』(こちらも現在、第 2 版です)、それに『BSD Sockets Programming from a Multilanguage Perspective』などの著者でもあります。技術的な経歴は静止軌道衛星用のカーネル開発から、組み込みシステム・アーキテクチャーやネットワーク・プロトコル開発まで、広範にわたっています。彼はコロラド州ロングモン在住で、Intel に勤務するプラットフォーム・アーキテクトであり、執筆活動も行っています。



2012年 6月 28日

ログにはさまざまな形がありますが、アプリケーションやインフラストラクチャーの規模が大きくなるにつれ、マイニングに適した分散データが大量に存在する結果となります。Web サーバーやメール・サーバーのログからカーネルのログやブート・ログに至るまで、最近のサーバーはさまざまな情報を保有しています。大量の分散データは、時系列の構造化テキスト・データであるログ・ファイルと同様に、Apache Hadoop で扱うのに極めて適しています。

ログを処理することによって、さまざまな情報を抽出することができます。ログの最も一般的な用途としては、システム内のエラーをログから抽出することや、何らかのイベント (ログインの失敗など) の発生回数をログからカウントすることが挙げられます。また、1 秒あたりの接続数やトランザクション数などといったパフォーマンス・データもログを基に計算することができます。他にもログから得られる有用な情報の例として、Web のログからサイトへのアクセス・ログを抽出し (map)、それを集約して (reduce) 作成したアクセス・リストなどがあります。このリストを分析することによって、ファイル・アクセスの統計だけでなく、個々の訪問者によるアクセスの記録を調べることもできます。

概要

この記事の演習では、次のタスクを実践します。

  • 単純な Hadoop 環境の立ち上げ
  • Hadoop ファイルシステム (HDFS) の操作
  • 単純な MapReduce アプリケーションの作成
  • フィルタリングを行う Apache Pig クエリーの作成
  • 集約を行う Pig クエリーの作成

前提条件

この記事の演習を最大限に利用するには、Linux の実用的な基礎知識が必要です。さらに仮想アプライアンスに関する知識があれば、単純な環境の立ち上げに役立ちます。


演習 1: 単純な Hadoop 環境を立ち上げる

Hadoop 環境を立ち上げるには 2 つの方法があります。1 つは、Hadoop ソフトウェアをインストールした後、使用している環境に合わせて構成する方法です (最も単純な Hadoop 環境は、単一ノードのインスタンスからなります。この場合、すべてのデーモンは単一ノードで実行されます)。詳細については、「Hadoop による分散データ処理: 第 1 回 導入編」を参照してください。

もう 1 つの、さらに単純な方法は、「Cloudera’s Hadoop Demo VM」を利用する方法です (この VM には Linux イメージに加え、事前に構成された Hadoop インスタンスが含まれています)。Cloudera 仮想マシン (VM) は、VMware、KVM (Kernel-based Virtual Machine)、または Virtualbox 上で動作します。

いずれかの方法を選んでインストールを完了してから、以下のタスクを行ってください。

  • HDFS の ls コマンドを実行して、Hadoop が動作していることを確認します。

演習 2: HDFS を操作する

HDFS は、Hadoop クラスター内のデータとレプリカを効率的に処理できるように計算ノードに配分して管理することを目的とした特殊用途のファイルシステムです。その用途は特化されているとは言え、HDFS は標準的なファイルシステム・コマンドの多くを実装しています。Hadoop のヘルプ情報を取得するには、hadoop dfs コマンドを実行してください。この演習では、次のタスクを実行します。

  • HDFS 内にテスト用サブディレクトリーを作成します。
  • copyFromLocal を使用して、作成した HDFS のサブディレクトリーにローカル・ファイルシステムのファイルを移動します。
  • 念のために、hadoop dfs コマンドを使用して HDFS 内のファイルを表示します。

演習 3: 単純な MapReduce アプリケーションを作成する

Hadoop による分散データ処理: 第 3 回 アプリケーション開発」で実演したように、単語数をカウントする MapReduce アプリケーションを作成するのは簡単です。同記事で紹介した Ruby のサンプル・コードを使用して、Python の MapReduce アプリケーションを開発し、サンプル・データ・セットに対してそのアプリケーションを実行してください。Hadoop が map の出力をソートして似たような単語を連続させることが、リデューサーの最適化に役立つことを思い出してください。


演習 4: 単純な Pig クエリーを作成する

Apache Pig でデータを処理する」で説明しているように、Pig では、単純なスクリプトを作成して、そのスクリプトを MapReduce アプリケーションに変換することができます。この演習 4 では「kernel:」と「terminating」という 2 つの単語が両方とも含まれるすべてのログ・エントリーを (/var/log/messages から) 抽出します。

  • 事前定義された基準と一致するすべての行をログから抽出するスクリプトを作成します。

演習 5: 集約を行う Pig クエリーを作成する

ログ・メッセージは、Linux カーネル内のさまざまなソース (kerneldhclient など) によって生成されます。この演習では、ログ・メッセージを生成する各種のソースと、ソースごとに生成されたログ・メッセージの数を調べます。

  • ログ・ソースごとのログ・メッセージ数をカウントするスクリプトを作成します。

演習の解答

それぞれの演習の出力は、皆さんが使用している Hadoop のインストールおよび構成によって異なります。


演習 1 の解答: 単純な Hadoop 環境を立ち上げる

演習 1 では、HDFS で ls コマンドを実行します。リスト 1 に、正しい解答を記載します。

リスト 1. HDFS で ls を実行する
$ hadoop dfs -ls /
drwxrwxrwx    - hue       supergroup           0 2011-12-10 06:56 /tmp
drwxr-xr-x    - hue       supergroup           0 2011-12-08 05:20 /user
drwxr-xr-x    - mapred    supergroup           0 2011-12-08 10:06 /var
$

ご使用の環境によって、表示されるファイル数は上記より少ない場合も、多い場合もあります。


演習 2 の解答: HDFS を操作する

演習 2 では、HDFS 内にサブディレクトリーを作成して、そこにファイルをコピーします。カーネル・メッセージ・バッファーをファイルに移動することによって、テスト・データを作成することに注意してください。念のために、cat コマンドを使用して HDFS 内のファイルを表示します (リスト 2 を参照)。

リスト 2. HDFS を操作する
$ dmesg > kerndata
$ hadoop dfs -mkdir /test
$ hadoop dfs -ls /test
$ hadoop dfs -copyFromLocal kerndata /test/mydata
$ hadoop dfs -cat /test/mydata
Linux version 2.6.18-274-7.1.el5 (mockbuild@builder10.centos.org)...
...
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
$

演習 3 の解答: 単純な MapReduce アプリケーションを作成する

演習 3 では、Python で単語数をカウントする単純な MapReduce アプリケーションを作成します。この単語数をカウントするサンプル・アプリケーションを実装するには、Python は実に優れた言語です。Michael G. Noll 氏が書いた記事「Writing An Hadoop MapReduce Program In Python (Hadoop で動く Python の MapReduce プログラムを書く)」を読むと、Python で MapReduce アプリケーションを作成する上で参考になるはずです。

以下の例では、演習 2 の手順 (HDFS へのデータの取り込み) を実行済みであることを前提とします。map アプリケーションは、リスト 3 のとおりです。

リスト 3. Python での map アプリケーション
#!/usr/bin/env python

import sys

for line in sys.stdin:
    line = line.strip()
    words = line.split()
    for word in words:
        print '%s\t1' % word

reduce アプリケーションは、リスト 4 のとおりです。

リスト 4. Python での reduce アプリケーション
#!/usr/bin/env python

from operator import itemgetter
import sys

last_word = None
last_count = 0
cur_word = None

for line in sys.stdin:
    line = line.strip()

    cur_word, count = line.split('\t', 1)

    count = int(count)

    if last_word == cur_word:
        last_count += count
    else:
        if last_word:
           print '%s\t%s' % (last_word, last_count)
           last_count = count
        last_word = cur_word

if last_word == cur_word:
    print '%s\t%s' % (last_word, last_count)

リスト 5 に、Hadoop で Python による MapReduce サンプル・アプリケーションを呼び出すプロセスを説明します。

リスト 5. Hadoop で Python による MapReduce アプリケーションをテストする
$ hadoop jar /usr/lib/hadoop-0.20/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \
  -file pymap.py -mapper pymap.py -file pyreduce.py -reducer pyreduce.py \
  -input /test/mydata -output /test/output
...
$ hadoop dfs -cat /test/output/part-00000
...
write	3
write-combining	2
wrong.	1
your	2
zone:	2
zonelists.	1
$

演習 4 の解答: 単純な Pig クエリーを作成する

演習 4 では、/var/log/messages ログから、「kernel:」と「terminating」という 2 つの単語が両方とも含まれるエントリーを抽出します。この場合、Pig をローカル・モードで使用して、ローカル・ファイルに対してクエリーを実行します (リスト 6 を参照)。ローカル・ファイルを Pig リレーション (ログ) にロードし、そのファイルの中身からカーネル・メッセージだけを抽出します。この絞り込まれたリレーションから、さらに終了 (terminating) メッセージを抽出します。

リスト 6. 「kernel:」と「terminating」が含まれるログ・メッセージを抽出する
$ pig -x local
grunt> log = LOAD '/var/log/messages';
grunt> logkern = FILTER log BY $0 MATCHES '.*kernel:.*';
grunt> logkernterm = FILTER logkern BY $0 MATCHES '.*terminating.*';
grunt> dump logkernterm
...
(Dec  8 11:08:48 localhost kernel: Kernel log daemon terminating.)
grunt>

演習 5 の解答: 集約を行う Pig クエリーを作成する

演習 5 では、/var/log/messages からログのソースを抽出し、ログ・メッセージ数をカウントします。この場合、この必要な処理を行うクエリーのスクリプトを作成し、そのスクリプトを Pig のローカル・モードで実行します。リスト 7 では、まずファイルをロードして、スペースを区切り文字に使って入力を構文解析します。次に、区分された文字列フィールドを名前付き要素に割り当てます。GROUP 演算子を使ってメッセージをソース別にグループ化した後、FOREACH 演算子と COUNT 演算子を使ってデータを集約します。

リスト 7. /var/log/messages のログ・ソースおよびカウント・スクリプト
log = LOAD '/var/log/messages' USING PigStorage(' ') AS (month:chararray, \
  day:int, time:chararray, host:chararray, source:chararray);
sources = GROUP log BY source;
counts = FOREACH sources GENERATE group, COUNT(log);
dump counts;

リスト 8 に、このスクリプトの実行結果を記載します。

リスト 8. ログ・ソース・スクリプトを実行する
$ pig -x local logsources.pig
...
(init:,1)
(gconfd,12)
(kernel:,505)
(syslogd,2)
(dhclient:,91)
(localhost,1168)
(gpm[2139]:,2)
[gpm[2168]:,2)
(NetworkManager:,292)
(avahi-daemon[3345]:,37)
(avahi-daemon[3362]:,44)
(nm-system-settings:,8)
$

参考文献

学ぶために

  • Linux と Hadoop による分散コンピューティング」(Ken Mann、M. Tim Jones 共著、developerWorks、2008年12月): 並列処理によるインターネット上の Web ページの索引付けをはじめ、膨大な量のデータの分散処理を可能にする Linux ベースのソフトウェア・フレームワーク、Apache Hadoop について調べてください。
  • Hadoop による分散データ処理: 第 1 回 導入編」(M. Tim Jones 著、developerWorks、2010年5月): Hadoop フレームワークについて詳しく調べてください。この記事では、Hadoop ファイルシステム (HDFS) などの基本要素やよく使われるノード・タイプ、そして Hadoop をそのコアとなる Web インターフェースを使用して監視および管理する方法について説明しています。さらに、単一ノードの Hadoop クラスターをインストールして構成する方法を学び、MapReduce アプリケーションの詳細を探ってください。
  • Hadoop による分散データ処理: 第 2 回 拡張編」(M. Tim Jones 著、developerWorks、2010年5月): Hadoop を複数のノードからなるクラスターで使用して、並列処理を行うための高度なセットアップを構成する方法を学んでください。この記事では、並列環境で MapReduce 機能を操作し、Hadoop の管理について、コマンドラインによる管理と Web ベースの管理の両面で調べます。
  • Hadoop による分散データ処理: 第 3 回 拡張編」(M. Tim Jones 著、developerWorks、2010年5月): Hadoop の API とデータ・フローを詳しく探り、その使い方について、マッパー (mapper) とリデューサー (reducer) からなる単純なアプリケーションを例に学んでください。
  • Apache Pig でデータを処理する」(M. Tim Jones 著、developerWorks、2012年2月): ブタは、食べられるあらゆるものをあさり回って掘り出すことで知られています。Apache Pig は、それと同じことをビッグ・データで行います。このツールの詳細、そしてアプリケーションに組み込んで役立てる方法を学んでください。
  • Writing a Hadoop MapReduce Program in Python」(Michael G. Noll著、2011年10月更新、2007年9月公開): このチュートリアルで、Hadoop 対応の単純なプログラムを Python プログラミング言語で作成する方法を学んでください。
  • developerWorks Open source ゾーンには、オープソースのツールおよびオープンソース技術の使用に関する情報が豊富に揃っています。
  • developerWorks Web development に、多種多様な Web ベースのソリューションを話題にした記事が揃っています。
  • さまざまな IBM 製品や IT 業界のトピックに焦点を絞った developerWorks の Technical events and webcasts で最新情報を入手してください。
  • 無料の developerWorks Live! briefing に参加して、IBM の製品およびツールについての情報や IT 業界の動向についての情報を迅速に把握してください。
  • developerWorks の on-demand demos で、初心者向けの製品のインストールとセットアップから、熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。
  • Twitter で developerWorks をフォローするか、developerWorks で Linux に関するツイートのフィードに登録してください。

製品や技術を入手するために

  • Cloudera's Hadoop Demo VM (2012年5月): Linux イメージと事前構成された Hadoop インスタンスが含まれる一連の仮想マシンで Apache Hadoop を使い始めてください。
  • ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Linux
ArticleID=822574
ArticleTitle=演習: Apache Hadoop でログを処理する
publish-date=06282012