euphonictechnologies’s diary

Haskell超初心者の日記です。OCamlが好きです。

follow us in feedly

ClojureなSparkでオーディオレコメンデーション - HDFSをセットアップしてデータの準備

前回は

Javaを見下したり、ClojureとかHadoopとかSparkの環境を整えたり、簡単なSparkのプログラムを動かしました。

blog.euphonictech.com

Javaは好き好き大好きです。休日に書きたくないだけで。

レコメンデーションは機械学習の花

機械学習の商用の応用といえばランキングとレコメンデーションです。

ランキングは検索をした結果をいい感じにならべかえるタスクです。検索をした時だけじゃなくて広告を表示するときとかいろんな時に使えます。競馬予想もランキング学習の一つですね。私はいまとある会社でなにかのランキングのために働いています。

レコメンデーションは「これを買っている人は他にもこれを買っています」みたいなやつですね。YouTubeでオススメ動画を表示したり、Twitterでフォローしたら良さげな人を表示するのもレコメンデーションです。

今日は音楽のレコメンデーションにチャレンジしてみます。iTunesの画面に表示されるアレの感じです。今まで聴いた音楽から今まで聞いたことはないんだけどこれお前きっと気に入るやろ、っていうやつをオススメするアレです。

今回の内容は

本格的なSparklingの前にデータをHDFSにアップロードしましょう。

HDFSをセットアップ

必要な手順は

  • Macでlocalhostにsshできるようにする
  • Hadoop namenodeをセットアップする
  • HDFSにディレクトリを掘る
  • HDFSにファイルをアップロードする

です。

私はここを参考にセットアップしました。

qiita.com

Macでlocalhostにsshできるようにする

まずはシステム環境設定でリモートアクセスを許可します。

f:id:euphonictechnologies:20190804215717p:plain

共有の中の

f:id:euphonictechnologies:20190804215759p:plain

ここをチェック。

次にパスワードなしログインができるようにlocalhost上でsshキーを発行して登録します。

$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ ssh-add -K ~/.ssh/id_rsa

これで

$ ssh localhost

としたときにパスワードなしでログインできれば大丈夫です。

Hadoop namenodeをセットアップする

まずはHadoopの関連データを置くフォルダを掘ります。

$ cd ~
$ mkdir -p hadoop/cache

/Users/username/hadoop/cacheとかいう感じにしましょうか。

core-site.xmlとhdfs-site.xmlを編集しましょう。

$ cd $(brew --prefix hadoop)/libexec/etc/hadoop/
$ vi core-site.xml
$ vi hdfs-site.xml

それぞれファイルにプロパティを追加します。

core-site.xmlを

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  <property>
  </property>
    <name>hadoop.tmp.dir</name>
    <value>/Users/username/hadoop/cache</value>
  </property>
</configuration>

とします。hadoop.tmp.dirを設定しないと/tmp以下にデータを置くので再起動のたびにデータが消えます。(参考: HadoopTips - Meta Search)

そして、hdfs-site.xmlの中身を

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

とします。ローカルに一台だけのホストでHadoopするのでdfsのreplicationは1(冗長性なし)で大丈夫です。

YARNの設定もします。yarn-site.xmlとmapred-site.xmlにそれぞれ

yarn-site.xml:

<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>

mapred-site.xml:

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

とします。

HDFSを初期化する

まずはhadoopのnamenodeを初期化します。

$ hdfs namenode -format
WARNING: /usr/local/Cellar/hadoop/3.1.2/libexec/logs does not exist. Creating.
2019-08-04 21:43:05,527 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
...
2019-08-04 21:43:06,991 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at XXXXX
************************************************************/

で初期化完了です。

HDFSを起動

$ cd $(brew --prefix hadoop)/sbin/
$ ./start-dfs.sh

起動スクリプトを使って起動しましょう。起動したら早速HDFS上でlsしてみましょう。

$ hadoop fs -ls /
2019-08-04 21:49:49,321 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

何もないですね。mkdirしましょう。

mkdirする

$ hadoop fs -ls /
2019-08-04 21:48:48,623 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
$ hadoop fs -mkdir /user
2019-08-04 21:49:10,167 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
$ hadoop fs -mkdir /user/ds
2019-08-04 21:49:14,162 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

作った中身を見てみましょう。

$ hadoop fs -ls /
2019-08-04 21:49:49,321 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxr-xr-x   - username supergroup          0 2019-08-04 21:49 /user

OKですね。

HDFSにファイルをアップロードする

さっそくオーディオレコメンデーション実験で使うファイルをダウンロードして、それをHDFSにアップロードしましょう。ファイルはhttp://www.iro.umontreal.ca/~lisa/datasets/profiledata_06-May-2005.tar.gzにあります。

$ curl -O http://www.iro.umontreal.ca/~lisa/datasets/profiledata_06-May-2005.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  129M  100  129M    0     0  3032k      0  0:00:43  0:00:43 --:--:-- 2858k
$ tar xvzf profiledata_06-May-2005.tar.gz
x profiledata_06-May-2005/
x profiledata_06-May-2005/artist_data.txt
x profiledata_06-May-2005/README.txt
x profiledata_06-May-2005/user_artist_data.txt
x profiledata_06-May-2005/artist_alias.txt
$ cd profiledata_06-May-2005

ダウンロードできたのでアップロードしましょう。

$ hadoop fs -put * /user/ds/
2019-08-04 21:50:16,102 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
$ hadoop fs -ls /user/ds/
2019-08-04 22:11:02,607 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 4 items
-rw-r--r--   1 username supergroup       1273 2019-08-04 21:50 /user/ds/README.txt
-rw-r--r--   1 username supergroup    2932731 2019-08-04 21:50 /user/ds/artist_alias.txt
-rw-r--r--   1 username supergroup   55963575 2019-08-04 21:50 /user/ds/artist_data.txt
-rw-r--r--   1 username supergroup  426761761 2019-08-04 21:50 /user/ds/user_artist_data.txt

アップロードできてますね。

YARNも起動

$ cd $(brew --prefix hadoop)/sbin/
$ ./start-yarn.sh

まとめ

今回は疲れたのでここまで。次回は実際にこのHDFS上のファイルを使ってREPLでSparkをつかってこねくり回してみます。