適当に・・・

何の目的も無くブログを立ち上げてみました。更新は不定期ですね。

Mahout インストール

2010年04月21日 16時00分18秒 | Weblog
Mahout インストール

Mahout とは 機械学習に関するライブラリのセット・・・

難しい事が色々書いてあるが割愛

レコメンドができると言う事で導入する感じ。

前、HadoopをインストールしたのはこのMahoutが
使いたいがための設定。

Hadoop自体も結構面白そうだけど。
(Hadoop プログラムは後で学習)

必要なもの
apache-maven-2.2.1-bin.tar.gz
jdk-6u20-linux-i586-rpm.bin
mahout-0.3-src.tar.gz

jdkのインストールは割愛

Maven
(Java用プロジェクト管理ツール Mahoutをビルドするために必要)
http://maven.apache.org/download.html ここから最新版をダウンロード

apache-maven-2.2.1-bin.tar.gz

mkdir -p /home/maven

mv apache-maven-2.2.1-bin.tar.gz

tar xvzf apache-maven-2.2.1-bin.tar.gz

vi ~/.bashrc

MAVEN_HOME=/home/maven/apache-maven-2.2.1/
JAVA_HOME=/usr/java/jdk1.6.0_20/

export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH

を追加して保存

次 Mahoutのダウンロード
http://ftp.kddilabs.jp/infosystems/apache/lucene/mahout/0.3/mahout-0.3-src.tar.gz

tar xvzf mahout-0.3-src.tar.gz

cd mahout-0.3

mvn install

Warning: JAVA_HOME environment variable is not set.
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] Mahout Common Maven Parent
[INFO] Maven Mojo to generate code for collections
[INFO] Mahout Collections
[INFO] Mahout Math
[INFO] Mahout Core
[INFO] Mahout Taste Webapp
[INFO] Mahout Utilities
[INFO] Mahout Examples
[INFO] Apache Lucene Mahout ・・・

とずらずらとビルドログが出てる・・・・
なんとなく1行目のWarningが気になる。。。

ビルド中にテストしてるらしくちょっと時間がかかる。

[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] Mahout Common Maven Parent ............................ SUCCESS [2:10.181s]
[INFO] Maven Mojo to generate code for collections ........... SUCCESS [3:00.867s]
[INFO] Mahout Collections .................................... SUCCESS [35.321s]
[INFO] Mahout Math ........................................... SUCCESS [40.775s]
[INFO] Mahout Core ........................................... SUCCESS [12:22.625s]
[INFO] Mahout Taste Webapp ................................... SUCCESS [45.399s]
[INFO] Mahout Utilities ...................................... SUCCESS [17.021s]
[INFO] Mahout Examples ....................................... SUCCESS [52.285s]
[INFO] Apache Lucene Mahout .................................. SUCCESS [5.169s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20 minutes 50 seconds
[INFO] Finished at: Wed Apr 21 16:45:53 JST 2010
[INFO] Final Memory: 68M/162M
[INFO] ------------------------------------------------------------------------

と出てビルド終了。

でー動かす。

https://cwiki.apache.org/MAHOUT/syntheticcontroldata.html

データを

http://kdd.ics.uci.edu/databases/synthetic_control/synthetic_control.data

ここからダウンロードして
(数値の羅列・・・・)

hadoop fs -put synthetic_control.data testdata
(なぜtestdataと言う名前かと言うとquickstartに
All example jobs use testdata as input and output to directory output
と書かれていたからw

意味は上の簡単な英文ですら意味をわかっていないw)

kmeans
canopy
dirichlet
meanshift

分類方法があるみたい。

kmeans法は

hadoop jar mahout-examples-0.3.job org.apache.mahout.clustering.syntheticcontrol.kmeans.Job

とすると分類が始まる。

ログがずらずら出て処理が終わる

kmeans法なのでoutput/pointsの下に出力があるはず。

hadoop fs -get output output でログを持ってくる。

次はレコメンドを動かしたいけど~
Tasteってもしかして自分で実装する感じなのか?w

mahout/レコメンドサーブレットの作り方というページを
そのまま作業してみる。

http://www.pwv.co.jp/~take/TakeWiki/index.php?mahout%2F%E3%83%AC%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%89%E3%82%B5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9

なんの事だかさっぱりわからないが以下コマンドを打つ。

mvn archetype:create -DgroupId=sample.recommendWeb -Dartifac
tId=recommendWeb -DarchetypeArtifactId=maven-archetype-webapp -D=Version=0.0.1

必要なものを作ってくれてる感じ?

tree recommendWeb

recommendWeb/
|-- pom.xml
`-- src
  `-- main
    |-- resources
    `-- webapp
      |-- WEB-INF
      | `-- web.xml
      `-- index.jsp

5 directories, 3 files

ここまではOKだな。

pom.xmlに追加する。 pom.xmlは以下のようになった。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<modelVersion>4.0.0</modelVersion>
<groupId>sample.recommendWeb</groupId>
<artifactId>recommendWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>recommendWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.3</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.5.8</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>


</dependencies>
<build>
<finalName>recommendWeb</finalName>


<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
</plugin>
</plugins>


</build>
</project>

recommendWebのディレクトリで

mkdir -p mkdir src/main/java

今回はeclipse使わないのだけれど、書いてあるのでやります。
mvn eclipse:eclipse -DdownloadSources=true

参考のwikiに従うと次はjavaファイルの追加
でもどこに追加するのだろう?w
mvnがわかってないので不明だな。

mvn compileとすると
デフォルトではsrc/main/javaの下の.javaをコンパイルするらしい。

ということでsrc/main/javaに配置だな。

mvn compileエラー続出w

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;

先頭にインポート文を追加したら
ビルドが通ったw

mvn jetty:run ・・・ エラー 

でもjettyのエラーで悩んでてもしょうがない。

tomcatに変更w
(頭古いから知っているものでしか動かせないのよねぇ)

$TOMCAT_HOME/webapps/で

mkdir -p recommendWeb/WEB-INF/classes
mkdir -p recommendWeb/WEB-INF/lib



$TOMCAT_HOME/webapps/recommendWeb/で

vi web.xml



<web-app xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

<display-name>Recommend Web</display-name>

<servlet>
<servlet-name>web-recommender</servlet-name>
<servlet-class>RecommenderServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>web-recommender</servlet-name>
<url-pattern>/RecommenderServlet</url-pattern>
</servlet-mapping>

</web-app>

として保存

recommendWeb/WEB-INF/libの中には必要なjarを放り込む

mahout-0.3/examples/target/dependency/の配下のjar

わからないので上記を全部放り込んだ

recommendWeb/WEB-INF/classesには
mvn compileして出来上がったRecommenderServlet.class
を入れますの。

WEB-INFディレクトリ直下に
critics.csvに入れるのだけど、これは

http://www.grouplens.org/node/73の

100k Ratings Data Set (.tar.gz)ってリンクから拾って解凍して

解凍するとずらずら出てくるから

awk '{printf("%s,%s,%sn",$1,$2,$3);}' ua.base > critics.csv

として作る。

ちなみに

http://lucene.apache.org/mahout/taste.html#examplesをみると
データの並びは

First, create a DataModel of some kind. Here, we'll use a simple on based on data in a file. The file should be in CSV format, with lines of the form userID,itemID,prefValue (e.g. "39505,290002,3.5"):

とかいてあるので
ユーザID,アイテムID,評価値(なのか?)の
並びとしてるんだろうな、多分、読めないけど。

tomcatを起動して

http://hadoop:8080/recommendWeb/RecommenderServlet?userID=7

5.0 345
5.0 313
5.0 328

と表示されてOKだな。

u.itemの中を見ると

345=Deconstructing Harry
313=Titanic
328=Conspiracy Theory

って言う感じのお勧めなんだろうな。

http://hadoop:8080/recommendWeb/RecommenderServlet?userID=7&howMany=10
とhowManyパラメータもつけられるらしい。

5.0 328
5.0 313
5.0 302
5.0 345
4.0 295
4.0 751
4.0 315
4.0 321
4.0 340
4.0 319

サンプルなのでアレだが
問題が二つ

・起動時にデータを読み込む事
・データに評価値がついてる
(大抵の場合評価値はあまりついていないのではないかと・・・)

しかしgooブログ 10000文字の制限もう少し多くならないかい?
かなり編集苦労するんだけど。
作業を全部書きたいんだよね。わからなくなったことがわからなくなるから。

関係ないけど easyrec(http://easyrec.org/)
っていうレコメンドシステムを知った。

ボスに言われてからかなり長い時間がかかったケド
Mahout動かせて良かった。

レコメンドの種類
http://lucene.apache.org/mahout/javadoc/core/org/apache/mahout/cf/taste/impl/similarity/package-summary.html

hadoop インストール

2010年04月18日 23時20分42秒 | Weblog
大昔 Googleを支える技術

と言う本ではじめてhadoopと言う名前にであう。

月日が流れてインストールをすることになった。

※像の絵が描いてあるがこれは
開発者の子供が持っている
黄色い象のぬいぐるみの名前に由来しているそうだ

必要なもの
jdk-6u20-linux-i586-rpm.bin
hadoop-0.20.2.tar.gz
(yumでもClouderaってのが提供されているらしい。)

まずJDKをインストールするがこれは割愛。

useradd hadoop

mkdir -p /opt/hadoop/

chown -R hadoop:hadoop /opt/hadoop/

tar xvzf hadoop-0.20.2.tar.gz
mv hadoop-0.20.2 /opt/hadoop

hadoop ユーザで

vi ~/.bashrc

export JAVA_HOME=/usr/java/jdk1.6.0_20/
export HADOOP_INSTALL=/opt/hadoop/hadoop-0.20.2
export PATH=$HADOOP_INSTALL/bin:$JAVA_HOME/bin:$PATH

を追記して保存

source ~/.bashrc

ssh-keygen -t rsa
(何を聞かれてもEnter)

cd ~/.ssh/
cat id_rsa.pub >> authorized_keys

chmod 600 authorized_keys

(authorized_keysはスペルやパーミッションが
間違ってるとログインできないので要注意)

vi /opt/hadoop/hadoop-0.20.2/conf/core-site.xml

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://diamond:39399</value>
<description>primary NameNode configration</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/data</value>
<description>hadoop data dir</description>
</property>
</configuration>

を記述して保存

※<value>hdfs://diamond:39399</value>
の 39399 はport番号なので好きなように。(サンキューサンキュッキュー)

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
diamondはサーバ名で名前解決できるようにしておく
ハマッタ事hadoopには
スタンドアローンモード
疑似分散モード
完全分散モード
と3つのモードがあるが、解説は大体、疑似分散モードでやってる。

/etc/hostsに

127.0.0.1 diamondとかやってるからAmazon EC2で完全分散モードをやった時に

Slave側のログで
INFO org.apache.hadoop.ipc.Client: Retrying connect to server: dia
mond/xx.xxx.xx.xxx:39399. Already tried 0 time(s).
みたいなログがずっと出ている。

で書かなければならないのは待機するマスターIPを/etc/hostsに
書いて名前解決できるようにしないといけない罠。

xxx.xxx.xxx.xxx diamond
xxxは10.xxx.xxx.xxxのIPアドレス

ifconfigで確認して出てくる奴ですな

マスターの50030にアクセスしてnodeの数が一致してればOKかと。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

vi conf/hdfs-site.xml

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

として保存

※slaveサーバの台数をvalueに設定する。
今回はサーバ1台でmaster slaveを補うので1に指定
ちなみに master slave構成の時には
conf/master
conf/slave
のしたにマシンを登録しなくちゃいけない予感

$ vi conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>diamond:39400</value>
</property>
</configuration>

として保存

※0.20.0から、hadoop-site.xmlは3つのxmlファイルに分割された。
1つ目は、hadoop.tmp.dir, fs.default.nameを設定するcore-site.xml。
2つ目は、dfs.replicationを編集するhdfs-site.xml。
3つ目は、mapred.job.trackerを設定するmapred-site.xml
古い記事を読むとhadoop-site.xmlの設定が出てる。

マスターノードで

hadoop namenode -format
すると・・・

hadoop.tmp.dirで指定したディレクトリ配下に
(今回は/opt/hadoop/data)
dfsと言うディレクトリが作成されその配下にも
色々と作られている

dfs
`-- name
|-- current
| |-- VERSION
| |-- edits
| |-- fsimage
| `-- fstime
`-- image
`-- fsimage

3 directories, 5 files

マスターノードと
スレーブノードで起動するものが違うが今回は
1台にすべてをインストールしたので全部起動する。

bin/start-all.sh

呼ばれてるのは
hadoop namenode start
hadoop jobtracker start
(マスターノードで必要)

hadoop datanode start
hadoop tasktracker start
(スレーブノードで必要)

起動すると
$hadoop_installdir/logs/の配下に色々なログが出る。
エラーの場合ももちろん出る。

ちなみに
netstat -an | grep 39399

等でもListenしてるのが確認できる。

インストールはここまで。

次 分散ファイルシステム
HDFSを使ってみる。

hadoop fs

よくわからないなw

わかるのは ls mkdir とか
見慣れたコマンドぐらいだな。

hadoop fs -ls とかで使う

で HDFSとMapReduceは
それぞれ
50070番と50030番でブラウザで確認できる模様

hadoop fs -mkdir /log

で HDFS のファイルシステム上に
log ディレクトリ作成と言うふうな感じ

ローカルのファイルシステムから
HDFS上にファイルをコピーするのは

hadoop fs -copyFromLocal コピー元 コピー先

って言う感じ。

次 MapReduceのサンプルを動かす。

どこでもやってるのはHTTPの

ログを解析するって言う感じですなーw

まあ、サンプルにくっついてるからだな。

まずHTTPのログをHDFS上に配置する

さっきlogと言うのを作ったのはそのためw

hadoop fs -copyFromLocal /var/log/httpd/access_log /log/access_log

hadoop fs -ls /log

-rw-r--r-- 1 hadoop supergroup 157164610 2010-04-19 01:45 /log/access_log

こんな感じの出力が出るはず。

アクセスの多いページを見つけましょ。

hadoop jar /opt/hadoop/hadoop-0.20.2/hadoop-0.20.2-examples.jar grep /log/access_log /log/output "Get (S+)" 1

とかやると /log/outputに結果出力される。

10/04/19 10:14:55 INFO mapred.FileInputFormat: Total input paths to process : 1
10/04/19 10:14:56 INFO mapred.JobClient: Running job: job_201004190338_0001
10/04/19 10:14:57 INFO mapred.JobClient: map 0% reduce 0%
10/04/19 10:15:11 INFO mapred.JobClient: map 23% reduce 0%
10/04/19 10:15:14 INFO mapred.JobClient: map 31% reduce 0%
10/04/19 10:15:17 INFO mapred.JobClient: map 66% reduce 0%
10/04/19 10:15:23 INFO mapred.JobClient: map 100% reduce 0%
10/04/19 10:15:36 INFO mapred.JobClient: map 100% reduce 100%
10/04/19 10:15:38 INFO mapred.JobClient: Job complete: job_201004190338_0001
10/04/19 10:15:38 INFO mapred.JobClient: Counters: 18
10/04/19 10:15:38 INFO mapred.JobClient: Job Counters
10/04/19 10:15:38 INFO mapred.JobClient: Launched reduce tasks=1
10/04/19 10:15:38 INFO mapred.JobClient: Launched map tasks=3
10/04/19 10:15:38 INFO mapred.JobClient: Data-local map tasks=3
10/04/19 10:15:38 INFO mapred.JobClient: FileSystemCounters
10/04/19 10:15:38 INFO mapred.JobClient: FILE_BYTES_READ=6
10/04/19 10:15:38 INFO mapred.JobClient: HDFS_BYTES_READ=157172804
10/04/19 10:15:38 INFO mapred.JobClient: FILE_BYTES_WRITTEN=120
10/04/19 10:15:38 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=86
10/04/19 10:15:38 INFO mapred.JobClient: Map-Reduce Framework
10/04/19 10:15:38 INFO mapred.JobClient: Reduce input groups=0
10/04/19 10:15:38 INFO mapred.JobClient: Combine output records=0
10/04/19 10:15:38 INFO mapred.JobClient: Map input records=1455557
10/04/19 10:15:38 INFO mapred.JobClient: Reduce shuffle bytes=18
10/04/19 10:15:38 INFO mapred.JobClient: Reduce output records=0
10/04/19 10:15:38 INFO mapred.JobClient: Spilled Records=0
10/04/19 10:15:38 INFO mapred.JobClient: Map output bytes=0
10/04/19 10:15:38 INFO mapred.JobClient: Map input bytes=157164610
10/04/19 10:15:38 INFO mapred.JobClient: Combine input records=0
10/04/19 10:15:38 INFO mapred.JobClient: Map output records=0
10/04/19 10:15:38 INFO mapred.JobClient: Reduce input records=0
10/04/19 10:15:38 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
10/04/19 10:15:38 INFO mapred.FileInputFormat: Total input paths to process : 1
10/04/19 10:15:39 INFO mapred.JobClient: Running job: job_201004190338_0002
10/04/19 10:15:40 INFO mapred.JobClient: map 0% reduce 0%
10/04/19 10:15:49 INFO mapred.JobClient: map 100% reduce 0%
10/04/19 10:16:01 INFO mapred.JobClient: map 100% reduce 100%
10/04/19 10:16:03 INFO mapred.JobClient: Job complete: job_201004190338_0002
10/04/19 10:16:03 INFO mapred.JobClient: Counters: 17
10/04/19 10:16:03 INFO mapred.JobClient: Job Counters
10/04/19 10:16:03 INFO mapred.JobClient: Launched reduce tasks=1
10/04/19 10:16:03 INFO mapred.JobClient: Launched map tasks=1
10/04/19 10:16:03 INFO mapred.JobClient: Data-local map tasks=1
10/04/19 10:16:03 INFO mapred.JobClient: FileSystemCounters
10/04/19 10:16:03 INFO mapred.JobClient: FILE_BYTES_READ=6
10/04/19 10:16:03 INFO mapred.JobClient: HDFS_BYTES_READ=86
10/04/19 10:16:03 INFO mapred.JobClient: FILE_BYTES_WRITTEN=44
10/04/19 10:16:03 INFO mapred.JobClient: Map-Reduce Framework
10/04/19 10:16:03 INFO mapred.JobClient: Reduce input groups=0
10/04/19 10:16:03 INFO mapred.JobClient: Combine output records=0
10/04/19 10:16:03 INFO mapred.JobClient: Map input records=0
10/04/19 10:16:03 INFO mapred.JobClient: Reduce shuffle bytes=6
10/04/19 10:16:03 INFO mapred.JobClient: Reduce output records=0
10/04/19 10:16:03 INFO mapred.JobClient: Spilled Records=0
10/04/19 10:16:03 INFO mapred.JobClient: Map output bytes=0
10/04/19 10:16:03 INFO mapred.JobClient: Map input bytes=0
10/04/19 10:16:03 INFO mapred.JobClient: Combine input records=0
10/04/19 10:16:03 INFO mapred.JobClient: Map output records=0
10/04/19 10:16:03 INFO mapred.JobClient: Reduce input records=0

こんな感じの出力が出て終わった。

hadoop fs -ls /log

Found 2 items
-rw-r--r-- 1 hadoop supergroup 157164610 2010-04-19 01:45 /log/access_log
drwxr-xr-x - hadoop supergroup 0 2010-04-19 10:16 /log/output

で結果をローカルマシンに持ってくる

hadoop fs -copyToLocal /log/output ./output

cd output/

cat part-00000
(part-00000ってのが解析結果らしい。)

まあ1日分のログの解析なんか
AWStatsとかにやらせるからなw

テラ級のログを解析しろって言ったら早いのかも。

単純に分散処理のシステム部分を自分で考えなくて
良いという事はすごい事

だって考えられないものw

寿司屋

2010年04月18日 01時21分53秒 | Weblog

すごくおいしい寿司屋が

三田にある。

名前を朱雀と言って外観は高級だけど、

コース料理が5000円台からある。

ただし、そこらへんの寿司と訳がちがう。

多分ほかの店で出したら倍はとられるのでは

ないかというネタが出てくる。

もうひとつすごいと思った点は、包丁。

研いだ包丁の刃が

刀の波紋のようになってる。

刃先までしっかり研がれていて

刃先は鋭く薄い。

刃物の魅力。

道具の手入れを怠らないのは超一流の証。