Home > Archives > 2009-04

2009-04

WordPressにキャッシュ導入 & モバイル対応

前のAmazon Elastic MapReduceの記事でアクセス集中し、サーバーの負荷が微妙に高そうだったので、WordPress用のキャッシュプラグイン “WP Super Cache” を導入しました。

ついでに、携帯でもブログを見れるように “Ktai Style” も導入しました。WP Super Cacheとの相性が悪かったようなのですが、Ktai Style 1.70 から、WP Super Cache 0.6.8 以降を利用していれば大丈夫になったようです。

それに合わせてGoogle Sitemaps Generatorを少し改変して、モバイルサイトマップ対応にしました。

モバイルサイトマップを登録したら次の日にGoogle Mobilebotが大体クロールしてくれたようです。Google Sitemapsのヘルプが古くて登録時に少し迷いましたが、サイトマップを普通に登録すればボット側でモバイル対応かどうか判定してくれるようです。

しかしWord Pressは何でもPluginが有って便利ですね!

Amazon Elastic MapReduceを使ってみた

連日のEC2ネタです。本日、AmazonからElastic MapReduceというサービスがリリースされました。大規模データ処理技術が一気に民間の手に下りてくる、まさに革命的なサービスだと思います。

Elastic MapReduceは、Googleの基盤技術の一つであるMapReduceを時間単位課金で実行できるサービスです。MapReduceについては以下のエントリが参考になります。

Elastic MapReduce自体についての技術情報は以下に有ります。

概要はGettingStartedGuideでもつかめますが、ようはEC2の上にMapReduceのオープンソース実装であるHadoopを走らせ、さらに入出力としてAmazon S3を使用するサービスです。

なんと言っても値段が安く、EC2のインスタンス代 ($0.10/h per Small Instance) + MapReduce使用代 ($0.015/h per Small Instance)がコストになります。

軽く計算してみると100台を1時間使用しても、100 * ($0.10 + $0.015) = $11.5 なので、大体1000円程度で済んでしまいます。今までは大企業に入って強大なクラスタを構築してやっと使える台数が、この値段で使えてしまうのは、本当に凄いと思います。

Elastic MapReduceの中核に使われているHadoopについては僕がいくつか記事をCodeZineに寄稿させて頂いております。最近ではYahoo, Facebookはもちろん、国内では楽天さんやはてなさんも使用されているようです。

また、2009/4/23発売の「クラウド大全」という本にHadoopについての記事を書かせて頂きました。概要~使用方法までを解説した内容になっておりますので、もしよろしければ参考にして頂ければと思います。

実は、これまでもEC2上に自前でHadoopクラスタを構築する事で、Elastic MapReduceと同じ事ができました。

しかしそれと異なる点はWeb GUIからジョブを投げて必要な数のマシンを自動的に起動できたりコマンド一発で同じ事が行える点です。

# MapReduceジョブを実行するためのコマンド
elastic-mapreduce \
  --create \
  --stream \
  --input s3n://elasticmapreduce/samples/wordcount/input \
  --mapper s3://elasticmapreduce/samples/wordcount/wordSplitter.py \
  --output s3n://mybucket/output_path

僕も簡単にですが使用してみたので、スクリーンショットと共にお届けします。以下、MapReduce・Hadoop・EC2についてのある程度の知識を前提とします。

具体的なイメージがつきやすいように、Apacheのログファイルを処理し、あるIPが何回アクセスして来たかをElastic MapReduceを使用してカウントしてみます。

まず、ApacheのログファイルをAmazon S3にアップロードします。アップロードしたS3のパスは、kazuki.ohta-bucket/hadoop/input/access.logとします。形式は以下のようになります。

114.48.132.12 - - [29/Mar/2009:06:52:59 +0900] "GET /books.html HTTP/1.1" 304 - "http://kzk9.net/blog/" "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"
114.48.132.12 - - [29/Mar/2009:06:53:00 +0900] "GET /public/javascript/prototype-1.4.0.js HTTP/1.1" 304 - "http://kzk9.net/books.html" "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"

次に、以下のようなスクリプトもS3にアップロードします。パスはkazuki.ohta-bucket/programs/ipCounter.pyとします。これがMapフェーズ用のスクリプトになります。


#!/usr/bin/python
import sys
import re
def main(argv):
  line = sys.stdin.readline()
  try:
    while line:
      print "LongValueSum:" + line.split()[0] + "\t" + "1"
      line = sys.stdin.readline()
  except "end of file":
    return None
if __name__ == "__main__":
  main(sys.argv)

HadoopはJavaで記述されているのですが、Hadoop Streamingという拡張を使用すると標準入出力が使える言語で有ればMapReduceプログラムを書く事が出来ます。

Elastic MapReduceではStreamingを使用するのが推奨されているようです。この例では、標準入力から与えられるログを一行一行処理し、以下のような出力を行います。

LongValueSum:114.48.132.12    1
LongValueSum:114.48.132.12    1
LongValueSum:127.0.0.1    1

今回はReducerにHadoop Aggregate Packageというものを用います。

このパッケージを使用すると、単純に足し合わせる・Maxを取る・Minを取るようなreducerなら、自分でスクリプトを書く必要が無くなります。ただし足すために、キーの前に”LongValueSum:”という識別子を付ける必要があるので、上のスクリプトではそうなっています。Reduce後のデータは以下のようになります。

114.48.132.12    2
127.0.0.1    1

以上でデータとプログラムが用意できたので、次はこの処理をAmazon EC2上で行ってみます。まずAWS Management Consoleにアクセスし、Amazon Elastic MapReduceのタブをクリックします。

Create New JobFlowというボタンが有るのでクリックします。ジョブ名(FlowJobName)を入力します。Typeは、今回は自分で作成したスクリプトを使用するので”Streaming”を選択します。

次に、入出力を行うS3のパスと、プログラムのパスを指定します。今回は以下のように指定しました。

  • Input Location: kazuki.ohta-bucket/hadoop/input
  • Output Location: kazuki.ohta-bucket/apacheloganalysis/ipcount-0421
  • Mapper: kazuki.ohta-bucket/programs/ipCounter.py
  • Reducer: aggregate

Output Locationは予め作成しておかなくても、自動で作成されます。Reducerにaggregateを使用しているのは、前に触れたようにHadoop Aggregate Packageを利用するためです。

次に使用するインスタンス数、インスタンスタイプを指定します。

確認画面が出るのでokを押します。

するとジョブがリストに追加され、実行が開始されます。

実際にジョブがRUNNINGの状態になるまでには、約3-5分かかります(VM、Hadoopの起動時間)。気長に終了まで待ちます。

正常に処理が終わると、kazuki.ohta-bucket/apacheloganalysis/ipcount-0421/part-0000というファイルが出来ています。これをダウンロードしてみてみると、以下のようなアウトプットが得られます。

110.0.37.132    2
113.32.139.66    21
113.32.170.52    8
113.32.65.194    4
113.33.116.81    27
114.111.35.23    2
114.111.36.31    2
114.144.157.247    5
...

今回は比較的小さめのログファイルを使用しましたが、これが数百Gになっても、それ相応のマシンを一時的に借りる事で、1時間程度でも処理する事が可能です。大量にアクセスのあるようなサービスのログ解析では早速役に立つのではないでしょうか。

また最先端の実験は必然的に大規模化するという話もありますが、大量のデータを扱う研究というのはElastic MapReduceの出現によって完全にコモディティ化してしまう可能性が有ります。アカデミックの分野でも非常に革命的だと思います。

ただ、いくつか問題も有って現状ではカウント以上の事をしようとするとHadoopの内部的な知識が必要になる事や、またジョブが失敗した時に何が悪かったのかが全く表示されないので、非常に苦心します。30回ぐらいJob Failedさせちゃいましたよ…(しかも1回5分かかるし)

この辺りが改善していけば非常に使い勝手の良いものになるのではないかと思います。Hadoopにはジョブの実行状況を見るためのWeb Interfaceが有るので、せめてここへのリンクぐらいは欲しいですね。

またストレージにS3を利用しているので、GoogleFileSystem + MapReduceの本来の良さで有るデータのローカリティを考慮したコンピューテーションが行えません。入力と出力に必ずネットワーク転送が挟まってしまいます。システムのパフォーマンスという面ではベストでは無いです。ただしS3を運用しているクラスタとElastic MapReduceを運用しているクラスタが将来的に一緒になるので有れば、性能が高まる可能性が有ると思います。

以下、EC2を色々と触って見ての所感 & 怪しい未来予想です。Elastic MapReduceには関係有りません。

7~8年前、高校生の頃にインターネットを始めて以来、Amazonは本屋さんだと思っていました。それがITインフラサービス事業会社になろうとしているのをひしひしと実感しています。価格もこれからどんどん安くなるだろうし、もうデータセンターに自前でサーバーを用意する必要性が無くなって来ているのかもしれません。

これは完全に個人的な予想ですが、Amazonの次のロードマップはAWS自体のプラットフォーム化です。これが起こると、今回のElastic MapReduceのようなアプリケーションを、個人開発者が自由に追加しユーザーに提供できるようになります。Management Consoleのタブが自由に増やせるイメージです。

開発者は、AWSアプリケーション(ec2, s3, simpledb, 3rd party, etc)をコンポーネントとして組み込んで、新しいAWSアプリケーションを提供できるようになります。その上に現在の課金の仕組みが乗っかり、開発者が利益を得られるような仕組みが登場します。

例えばSQLクエリからMapReduceが使えるアプリケーションを書いてインスタンス単位で課金できるようになったり、独自のKey-Value StoreをAWSユーザーに提供してPUT/GETオペレーション単位で課金出来たり。他にもロックサービス、分散DB、検索エンジン、分散共有メモリ、HPCシステム、Single System Image。

もっと上位レイヤを言うと、ERP・CRM・DWH・ECサイト構築パッケージ・SNS構築パッケージ・動画配信(CDN)。Windows Azure, Google AppEngine, SalesForce互換アプリなんかも登場するかもしれません。AmazonのDCが世界中に構築されれば、世界中に拠点が有るようなシステムも簡単に作れる (Akamaiみたいな)。

全てのシステムソフトウェアがAWSというプラットフォーム上で提供できる、そんな世の中になると、楽しそうですね。妄想ですけどね。しかしAmazon…恐ろしい子!今月何万円払ったんや。

Hadoop 0.19.1 disabled the APPEND API

Hadoop 0.19.1がリリースされています。

しかし0.19.0で実装されたAppendが実はバグ持ちであることが発覚したので、UnsupportedExceptionを投げるような変更が行われました。Appendは0.20系に持ち越しな予感ですね。

# エイプリルフールネタじゃないですよ:-(

Home > Archives > 2009-04

お薦め本
広告
Archives
Categories

Return to page top