[Hadoop]Hadoop上でMahoutを使って「このアイテムを見た人は、こちらのアイテムも見ています」というレコメンドをやってみる

前回はHadoopのインストールで、今回がいきなり実用的な内容で、ちょっと基礎を飛ばしてますが、気にしない。

レコメンドというと、パッと思いつくのはAmazonのレコメンドではないでしょうか。

商品を見ていると、「この商品を買った人はこれも一緒に買っています。」といった感じの物ですね。

今回はこのレコメンドを簡単に実装する方法を探ってみます。

まず、解析後に欲しいデータとして

あるアイテム(item1)に対して、関連するアイテム(item2,item3,item4)をひもづけるデータです。

データベースに入れて使える状態で言うと

(ユーザが今開いたアイテムのID), (ユーザが開いたアイテムに関連するアイテムのID)
item1, item2
item1, item3
item2, item4

というキーバリューのペアです。

この結果を得るために必要な情報ですが

ユーザ毎にアクセスしたアイテムの一覧を、解析にかける元データとします。

ユーザID, アイテムID
user1, item1
user1, item2
user1, item4
user2, item1
user2, item5
user3, item3

というキーバリューのペアです。

このデータから解析結果を導き出すのですが

Hadoop界隈には、便利な機械学習ライブラリがあります。

Mahoutというライブラリで、様々な解析をするジョブがたくさん入っています。

今回はこの中のItemSimilarityJobという機能を使います。

ItemSimilarityJobには解析方法として

SIMILARITY_COOCCURRENCE
SIMILARITY_LOGLIKELIHOOD
SIMILARITY_TANIMOTO_COEFFICIENT
SIMILARITY_CITY_BLOCK
SIMILARITY_COSINE
SIMILARITY_PEARSON_CORRELATION
SIMILARITY_EUCLIDEAN_DISTANCE

というオプションが指定できます。

今回はSIMILARITY_COSINEという、コサイン関数による類似アイテムの解析を実行します。

とりあえず、ItemSimilarityJobのオプションを見てみましょう。

とすれば、オプションの一覧が表示されます。

このオプションの中で今回設定する物は、

–input
–output
–similarityClassname
–booleanData

です。

inputは、解析する元データ

outputは解析結果の保存場所

similarityClassnameは解析方法

booleanDataは、元データにレートがあるかどうか

今回の元データには、レートがないので、booleanDataにはtrueを指定

similarityClassnameにはSIMILARITY_COSINEを指定します。

では、元データを準備してみましょう。

○user-item.tsv(実際に使った物はもっとでかい)

このファイルを、HadoopのHDFS上に送り込みます。

これでhadoopのHDFS上にファイルが送信されました。

このファイルをItemSimilarityJobで解析するようにコマンドオプションを組み立ててみます。

このコマンドを実行すると、outputに解析結果ファイルが作成されます。

という感じで、できあがります。

一つ目のアイテムIDに対して、二つ目が関連するアイテムID、最後にそのアイテムのレート(おすすめ度?)となります。より近いアイテムほど数値が高くなります。

なので、おすすめとして表示する時にはレートでソートして表示するのが良いかもしれません。

UbuntuにHadoopをインストールしてみる(1マシン上に)

そろそろHadoop入れてみようか。

ということで、例のごとくVMware PlayerにUbuntu11 64bitをインストールして、そこにHadoopを入れてみます。

Ubuntuのインストールなどは省略

Hadoopというのは、Apacheで開発されているオープンソースの大規模データの分散処理です。

詳しくはHadoop(http://hadoop.apache.org/)

ではさっそくインストール。

HadoopはJava上で動くので、まずはJavaを入れます。

本家(http://java.sun.com/)から、とりあえず最新版のJDKをダウンロードします。

/usr/localあたりに展開します。

パスを通します。

~$ java -version
java version “1.7.0_03”
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)

となれば、Javaのインストールは完了です。

続いて、Hadoopですが

Ubuntu では、サードパーティ(Cloudera社)が、簡単インストール用のパッケージを作っているので、それを使います。

aptパッケージ管理で入れられるので便利です。

まずは

/etc/apt/sources.list.d/cloudera.list

というファイルを作成し、このファイルの中身は
[text]deb http://archive.cloudera.com/debian <RELEASE>-cdh3 contrib
deb-src http://archive.cloudera.com/debian <RELEASE>-cdh3 contrib[/text]
とします。

は今回は「maverick」を設定。

リポジトリキーを設定
[shell]curl -s http://archive.cloudera.com/debian/archive.key | sudo apt-key add -[/shell]
パッケージリストの更新
[shell]sudo apt-get update[/shell]
hadoopの検索
[text]apt-cache search hadoop[/text]
[text]hadoop-0.20 – A software platform for processing vast amounts of data
hadoop-0.20-conf-pseudo – Pseudo-distributed Hadoop configuration
hadoop-0.20-datanode – Data Node for Hadoop
hadoop-0.20-doc – Documentation for Hadoop
hadoop-0.20-fuse – HDFS exposed over a Filesystem in Userspace
hadoop-0.20-jobtracker – Job Tracker for Hadoop
hadoop-0.20-namenode – Name Node for Hadoop
hadoop-0.20-native – Native libraries for Hadoop (e.g., compression)
hadoop-0.20-pipes – Interface to author Hadoop MapReduce jobs in C++
hadoop-0.20-sbin – Server-side binaries necessary for secured Hadoop clusters
hadoop-0.20-secondarynamenode – Secondary Name Node for Hadoop
hadoop-0.20-source – Source code for Hadoop
hadoop-0.20-tasktracker – Task Tracker for Hadoop[/text]
という一覧が含まれていれば、設定完了です。

続いて、Hadoopを入れます。
[shell]sudo apt-get install hadoop-0.20[/shell]
hadoopのコアしか入らないので、1マシンで全部入れる場合には、デーモン名を後ろに付けたパッケージも入れる必要があります。

が、今回は1マシンで全部入りとするので、
[shell]sudo apt-get install hadoop-0.20-conf-pseudo[/shell]
というパッケージで全部入ります。

次に、namenodeのファイルシステムを初期化する必要があります。
[shell]sudo su – hdfs[/shell]
として、hdfsユーザにログインします。

namenodeを初期化します。
[text]hadoop namenode -format[/text]
Hadoopの各種デーモンを再起動する。

WebUIにアクセスしてみる。

http://localhost:50070/

これで、Hadoop NameNodeのWebUIが表示されれば、インストール成功です。