R&Dトレンドレポート

第10回 MapReduce処理をやってみよう![実践編]

この記事を読むのに必要な時間:およそ 10.5 分

注意

前回までに構築したhadoop0.21ですが,dfsコマンドに不具合があり,現在対応中0.22でフィックスされるということです。今回からの連載では環境を0.20に戻して行っています。ご了承ください。

0.20にする手順は以下のとおりです。

  • 0.20をダウンロード,展開
  • hadoopを0.20にリンク
  • 0.21で作成したconf/* をコピー。
  • 各サーバの/usr/local/hdfs/*を削除
  • hadoop namenode -formatでフォーマットする
  • start-all.shで起動

これで0.20.2の環境になると思います。

もう一点。2ちゃんねるデータの取得プログラム,およびフォーマットでcsv形式と書きましたが,データ中のカンマによりデータの区切りが判別できなくなるため,tsv(タブセパレータ)とします。

修正前:
print $time,",",$resid,",", $name, ",",  $id2,",", $be, ",", $mail,",", $body, "\n";

修正後:
print join("\t", ($time, $resid, $name, $id2, $be, $mail, $body)), "\n";

今回は2ちゃんねるデータを処理するという実践を行ってみます。

品詞解析ライブラリの導入

品詞解析にはいくつかのツールがありますが,今回はMeCabというツールを使用します。

MeCabのサイト
URL:http://mecab.sourceforge.net/

MeCab本体と,CMeCabというMeCabをJNIで使用するライブラリを導入します。

MeCab本体のセットアップ

mecab-0.98.tar.gzをダウンロード&展開します。

$ ./configure
$ make
$ make check
# make install

/usr/local/libにlibmecab.so.1が入ります。

辞書のセットアップ

MeCabの動作には辞書が必要ですので,辞書のセットアップを行います。

mecab-ipadic-2.7.0-20070801.tar.gzをダウンロード&展開します。

$ ./configure --with-charset=utf8
$ make
# make install

以上でMeCabの導入が終わりました。

CMeCabの導入にはprotocol bufferとsconsが必要となります。

protocol buffer

URL:http://code.google.com/p/protobuf/downloads/list

このページから最新版をダウンロードします。

protobuf-2.3.0.tar.bz2 をダウンロード&展開

$ ./configure
$ make
# make install

scons

ダウンロード&インストール

$ wget http://prdownloads.sourceforge.net/scons/scons-1.2.0-1.noarch.rpm
# rpm -Uhv scons.rpm

CMeCab

CMeCabのサイトで公開されている。cmecab-1.7.tar.gzをダウンロード&展開

jarファイルの生成

$ cd cmecab-1.7
$ ant

bin/cmecab-1.7.jarが生成されるので,任意のクラスパスにコピーします。ここでは,/usr/local/apache_proj/myproj/lib/を作成しそこにコピーしました。

ライブラリの生成

続いてネイティブライブラリの生成です。sconsを使用してコンパイルしますが,javahomeのパスが間違っている場合は,jni/SConstructファイルを次のように編集します。

37     javahome = '/usr/lib/jvm/java' ←適切なパスに置き換える

sconsを実行します。

$ cd jni
$ scons
# cp libCMeCab_protobuf.so libCMeCab.so /usr/local/lib

環境変数の設定

今回jarファイルを/usr/local/apache_proj/myproj/libにおきましたが,hadoopはこのパスのことを知りません。hadoopの環境変数に設定してあげる必要があります。$HADOOP_HOME/conf/hadoop-env.shを編集します。13行目がコメントになっていると思いますので,コメントを外し,cmecab-1.7.jarへのパスを記述します。

12 # Extra Java CLASSPATH elements.  Optional.
13 export HADOOP_CLASSPATH=/usr/local/apache_proj/myproj/lib/cmecab-1.7.jar

cmecab-1.7.jarからJNIによりCMeCabライブラリが呼び出されますが,下記の設定が必要です。MapReduceの処理はJVMのプロセスが新規で起こされますが,そのJVMにパラメータを渡すことができます。cmecab-1.7.jarで使用されるCMeCabのライブラリへのパスを記述する必要があります。

$HADOOP_HOME/conf/mapred-site.xmlに追記(赤字部分)⁠

 1 <?xml version="1.0"?>
 2 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 3 <!-- Put site-specific property overrides in this file. -->
 4 <configuration>
 5   <property>
 6     <name>mapred.child.java.opts</name>
 7     <value>-Djava.library.path=/usr/local/lib</value>
 8   </property>
 9   <property>
10     <name>mapred.job.tracker</name>
11     <value>hadoop1:9001</value>
12   </property>
13 </configuration>

また,上記CMeCabライブラリがMeCabのライブラリを使用しているため,全てのサーバのhユーザの.bashrcファイルに環境変数を設定します。~h/.bashrcに下記を追記します。

export LD_LIBRARY_PATH=/usr/local/lib

ここでhadoopを再起動します。

$ stop-all.sh
$ start-all.sh

これで準備が整いました!

著者プロフィール

脇本武士(わきもとたけし)

都内中小IT企業(メイサンソフト(株))に所属。某大手自動車会社でのシステム開発,運用を経て,現在は研究開発部署に席をお借りしています。DB周りの保守サポート,ウェブ技術開発を主に手がけてきました。現在は大規模計算フレームワークの活用とKVSに注目しています。普段はOS Xを使用していますが一番よく使うアプリはTerminalです(笑)。

R&Dトレンドレポート(てくらぼ)

コメント

コメントの記入