目次
- イントロダクション
- 概要
- 演習 1: 単純な Hadoop 環境を立ち上げる
- 演習 2: HDFS を操作する
- 演習 3: 単純な MapReduce アプリケーションを作成する
- 演習 4: 単純な Pig クエリーを作成する
- 演習 5: 集約を行う Pig クエリーを作成する
- 演習の解答
- 演習 1 の解答: 単純な Hadoop 環境を立ち上げる
- 演習 2 の解答: HDFS を操作する
- 演習 3 の解答: 単純な MapReduce アプリケーションを作成する
- 演習 4 の解答: 単純な Pig クエリーを作成する
- 演習 5 の解答: 集約を行う Pig クエリーを作成する
- ダウンロード可能なリソース
- 関連トピック
- コメント
演習: Apache Hadoop でログを処理する
標準的な Linux システムで Hadoop を使用してログから有用なデータを抽出する
ログにはさまざまな形がありますが、アプリケーションやインフラストラクチャーの規模が大きくなるにつれ、マイニングに適した分散データが大量に存在する結果となります。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 カーネル内のさまざまなソース (kernel
や dhclient
など) によって生成されます。この演習では、ログ・メッセージを生成する各種のソースと、ソースごとに生成されたログ・メッセージの数を調べます。
- ログ・ソースごとのログ・メッセージ数をカウントするスクリプトを作成します。
演習の解答
それぞれの演習の出力は、皆さんが使用している 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 ベースのソリューションを話題にした記事が揃っています。
- Twitter で developerWorks をフォローするか、developerWorks で Linux に関するツイートのフィードに登録してください。
- Cloudera's Hadoop Demo VM (2012年5月): Linux イメージと事前構成された Hadoop インスタンスが含まれる一連の仮想マシンで Apache Hadoop を使い始めてください。
- ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。