2009年11月17日火曜日

Hive楽だわ~

MapReduce用のテストデータを実データから抽出しようとしているのですが、Windows環境に持ってきて秀丸でgrepとかやってると、PC全体が重くなって使い物になりません。
ちょうどテスト環境に実験的にHiveを入れて、実験データにテストの実データを入れていたので、それを試しに使ってみた。
検索結果の件数が少ない条件を抽出したいな~なんて時は、何度も検索を実行する訳なんですが、CD-ROM一枚分くらいのデータを1分~2分足らずで抽出してくれるので楽です。(VMWare4台構成)
お試しあれ

2009年11月14日土曜日

Hadoop The Definitive Guide の邦訳版

昨日のHadoop カンファレンス Japan 2009の懇親会中
「『Hadoop The Definitive Guide』の邦訳が1月に出ます!」
というアナウンスがありました!

ようやく日本語のアナログ情報がでる~♪

Hadoop カンファレンス Japan 2009

こんにちは。yoshitsuguです。

昨日、HadoopカンファレンスJapan 2009に参加してきました。

ちょっとレポートできるほど時間の余裕がないのですが、Hadoopが、今、米国ですごくホットな技術であり、日本でもだいぶホットになってきたんだというのを実感できました。

だいたい、みなさん1年くらい前からテスト的に使い出し、今年に入って本格的に運用に持って行っている所という感じでした。

今、キャズムの一歩手前かな。キャズムを超えられるかはこれからのシステムの安定性・信頼性の確保にかかっていると思う。

詳しくはのちほど。

ではでは

2009年11月10日火曜日

SafeModeのちょいワザ

こんにちは、yoshitsuguです。

HDFS上のデータが壊れたりして、HDFSがSafeModeに入りっぱなしになり
困ったことはありませんか?
(Safe Modeだとファイルの追加・削除ができないうえ、fsck -deleteも使えません)

そんな時に一時的にSafe Modeを抜けるワザです。
(Hadoopのドキュメントに普通に書いてあるので裏技ではありません)


$HADOOP_HOME/bin/hadoop dfsadmin -safemode leave


SafeModeを抜ける必要のある作業が終わったら


$HADOOP_HOME/bin/hadoop dfsadmin -safemode enter


コマンドでSafeModeに戻すことも可能です。

※なお、-safemode enterは手動でSafeModeに入るため、SafeModeから抜けるためにはもう一度-safemode leaveコマンドを実行する必要があります。

参考資料:Apache Hadoop コマンドガイド(英語です)

2009年10月16日金曜日

Hadoopで何ができるのか

こんにちは、yoshitsuguです。

仕事でHadoopのプログラムをゴリゴリやっているわけなんですが、例えば「何か簡単なサンプルアプリを書け。word count以外で、だ。」と言われると結構困ってしまいます。

HadoopというよりMap/Reduceというアルゴリズムでできることとは、一体なんでしょうか?

ある程度DBのシステムを組んだことがある人には、
  • Map≒WHERE + GROUP BY(※集約キー指定のみ)
  • Reduce≒GROUP BY(※キーでデータが集約されてくる), COUNT(), SUM(), MAX(), MIN()などの集約関数
であるという説明が案外わかりやすい気がします。
(私の業務では、DBに近い使い方が結構多いからかもしれません)

具体例で示します。
次のプログラムはApacheのアクセスログから404アクセスしたクライアントのIPアドレスとリクエストURLを抜き出してカウントする処理です。

------- Map処理(クラス定義等は省略) ---------------
/**
 * mapメソッドです。<BR>条件を絞って key, valueの組を作ります。
 */
public void map(LongWritable key, Text value, Context context) {
    String code = getCode(value); //
    if (code.matches("404")) {
        // URLを抜き出してvalueとする。
        String url = getURL(value);
        String ip = getIP(value);
        // 出力する
        context.write(new Text(ip), new Text(url));
    }
}

------- Reduce処理(クラス定義等は省略) ---------------
/**
 * reduce処理。>br<クライアントIPアドレス毎に要求URLをカウントします。
*/
public void reduce(Text key, Iterable value, Context context) {
    Map urlMap = new HashMap();
    for (Iterator iter = value.iterator();         iter.hasNext();) {
        String url = iter.next().toString();
        Integer count = urlMap.get(url);
        if (count == null) {
            urlMap.put(url, new Integer(1));
        } else {
            urlMap.put(url, new Integer(count.intValue() + 1));
        }
    }
    StringBuilder sb = new StringBuilder();
    Iterator entries = .entrySet().iterator();
    for (Map.Entry entry : entries) {
        sb.append(entry.getKey()).append("\t").append(entry.getValue()).append("\t")
    }
    sb.setlength(sb.length - 1);
    context.write(key, sb.toString);
}


データベースの場合、集約によるCOUNT()ならば数値を加算するのみですが、Hadoopの場合は上記のように文字列を集約してさらに数えたり等いろいろな事ができるのです。

結構お客様から「データベースとの比較データを出せ」などと言われることが多いのですが、データベースの速度もIndexを張っていたりいなかったりやSQLのクエリの仕方次第で大きく変わるので、一概に比較することは難しいと思います。

やはりバッチ処理として、大量データに対するマッチング処理やキーワードを抽出して検索Index作成、ログデータ中のキーワードの頻度測定などの用途が向いていると思います。

2009年9月9日水曜日

Too many fetch-failures

こんばんは、yoshitsuguです。

Map処理は完了しているのに、Reduce処理がなかなか進みません。
で、ログを確認してみると、"Too many fetch-failures"というエラーが出ていました。

そこで、Google検索をかけて、あるページにたどり着きました。


以下、引用(邦訳:yoshitsugu)

ReducerがHDFS内でデータをコピーするのに失敗した。チェックすべきは、LinuxのネットワークとHadoopの設定だ。
(The Reducer was failed to copy data through the HDFS, what we should do is to double check your Linux network and Hadoop configuration :)
1.必要な全パラメータがhadoop-site.xmlに設定されているかどうか確認し、Hadoop内の全ノードが同じ設定であることを確認する。
(1. Make sure that all the needed parameters are configured in hadoop-site.xml, and all the worker nodes should have the same content of this file.)

2.TaskTrackerやHDFSのURIにはIPアドレスではなくホスト名を使用するべきだ。URIにIPアドレスを使用しているHadoopクラスターをいくつかみてきたが、それらはサービスを開始してJobの実行をすることはできても正常に終了したことがない。
(2. URI for TaskTracker and HDFS should use hostname instead of IP address. I saw some instances of Hadoop cluster using IP address for the URI, they can start all the services and execute the jobs, but the task never finished successfully.)

3.全ノードの/etc/hostsファイルを確認し、ホスト名とIPアドレスのバインドがなされていることを確認する(ローカルホストではない)とともに全ホストがお互いにホスト名で通信できることを確認する。
(3. Check the file /etc/hosts on all the nodes and make sure that you’re binding the host name to its network IP, not the local one (127.0.0.1), don’t forget to check that all the nodes are able to communicate to the others using their hostname.)

今回の私の環境は、見事に/etc/hostsの中身が間違っていてこれが原因だとわかりました。

2009年9月4日金曜日

HDFSがおかしいとき

こんにちは、yoshitsuguです。
hadoopを動かしていると稀にHDFSのファイルが壊れることがあります。
(特にPseudo-Distributed Operationで1台でテストしているとよく起こる)

そんなときのTipsです。

次のようなコマンドを実行すると、ファイルシステムのチェックができます。
$ $HADOOP_HOME/bin/hadoop fsck <チェック対象のpath> [-delete | -move]
# $HADOOP_HOME:hadoopのインストールディレクトリ
# -delete : 異常があるファイルを削除
# -move : 異常があるファイルを移動して隔離

それでも直らないようならば、
テンポラリファイルの削除
# rm -r /tmp/<ユーザー名>-hadoop*
と、HDFSの初期化
$ $HADOOP_HOME/bin/hadoop namenode -format

を行います。(この時、HDFSのファイルはすべて削除されてしまいます。)