2014年3月24日月曜日

CDH4を使ってのHadoop + HIVE インストール備忘録(Ubuntu 12.10)

新しいモジュールでDistributed Computingの授業があるので、UbuntuにHadoopとHiveを入れておこうと思って始めたのですが、不慣れでかなり手間取ってしまい、丸一日潰してしまいました。。。こういうインフラ系のことって本当に難しいんですね・・・

また同じことはできないと思うので、忘れないように残しておきます。

参考にしたブログや記事です。本当に助かりました。ありがとうございます。


  • https://gist.github.com/YoshihitoAso/9444292
  • http://kakakikikeke.blogspot.jp/search?q=hive



上記を見ながら、「動かない!!なぜだ!??」と試行錯誤しながら、ようやく動くまでに至った経緯です。正直、Hadoopがどうやって動いているのか、hiveがどうして動いているのかわかっていませんが、自分がやったことは以下のとおりです。


まず、インストールするOSですが、Ubuntu12.10の64bitです。

Javaのインストール
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer
インストールが済んだら、以下のコマンドを叩いてバージョンを確認します。
$ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
続いて、JAVA_HOMEを設定します。homeにある隠しファイル「.bashrc」を開いて、以下をファイルの末尾に入力し保存します。
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
export PATH=$PATH:$JAVA_HOME/bin
これをやったら、一度ログアウトして、JAVA_HOMEの変更を反映させるのを忘れないように!(それをやらずに、この後のCDHをインストールしたところ、エラー!って怒られました・・・)

CDH4をインストールします。
$ sudo dpkg -i cdh4-repository_1.0_all.deb
$ curl -s http://archive.cloudera.com/cdh4/ubuntu/precise/amd64/cdh/archive.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install hadoop-conf-pseudo
どうやら、インストールしたときに、hdfsユーザーというものが作られているようです。そこで、ここからはhdfsユーザーで作業をします。
$ sudo su hdfs
コマンドラインが、「hdfs@」で始まるようになります。
そして、以下のコマンドを叩いて、Namenodeをフォーマットします。
$hdfs namenode -format
そしたら、コマンドラインに「exit」と入力してhdfsユーザーから抜けます。
続いて、以下のコマンドをターミナルに入力して、HDFSを起動します。ちなみに止めるときはstartの代わりにstopです。
for service in /etc/init.d/hadoop-hdfs-*
do
sudo $service start (止めるときは、ここのstartをstopに変える)
done
startingほにゃららみたいなメッセージが何回か現れると思います。 それを見届けてから、何も考えずに以下を打ち込みます。
$ sudo su - hdfs
$ hadoop fs -mkdir /tmp 
$ hadoop fs -chmod -R 1777 /tmp
$ hadoop fs -mkdir /var/log/hadoop-yarn
$ hadoop fs -chown yarn:mapred /var/log/hadoop-yarn
$ hadoop fs -mkdir /tmp/hadoop-yarn/staging
$ hadoop fs -chmod -R 1777 /tmp/hadoop-yarn/staging
$ hadoop fs -mkdir /tmp/hadoop-yarn/staging/history/done_intermediate
$ hadoop fs -chmod -R 1777 /tmp/hadoop-yarn/staging/history/done_intermediate
$ hadoop fs -mkdir /user/$USER
$ hadoop fs -chown hdfs /user/$USER
そして、HIVEを使うために、/userの権限を変更します。(これをやらなかったために、HIVEを起動して、テーブル作ったときに、Permission Deniedのエラーが出てハマりました。。。。)
$sudo -u hdfs hadoop dfs -chmod 777 /user
上記がうまくの権限変更がうまく行っているか、確認します。
$sudo su hdfs (改めてhdfsでログイン)
$ hadoop fs -ls /
Found 3 items
drwxrwxrwt   - hdfs supergroup          0 2014-03-23 22:13 /tmp
drwxrwxrwx   - hdfs supergroup          0 2014-03-23 22:02 /user
drwxr-xr-x   - hdfs supergroup          0 2014-03-23 18:26 /var
続いて、YARNを起動してみます。
sudo service hadoop-yarn-resourcemanager start
sudo service hadoop-yarn-nodemanager start
sudo service hadoop-mapreduce-historyserver start

そして、HIVEをインストールします。
※これはhdfsユーザーではなくrootユーザーでやります。
$ wget http://mirror.tcpdiag.net/apache/hive/stable/hive-0.11.0.tar.gz
$ tar xzf hive-0.11.0.tar.gz
$ mkdir /usr/local/hive
そしたら、hive-0.11.0の中身を新しく作った/usr/local/hiveに移します。
次に、環境変数を設定します。また、homeにある隠しファイル「.bashrc」を開いて以下をファイルの末尾に追加して保存します。
export HIVE_HOME=/usr/local/hive
export PATH=$HIVE_HOME/bin:$PATH
また、一度ログアウトし、再度ログイン。ターミナルで、$echo $HIVE_HOMEを叩いて、ちゃんと反映されているか確認。続いて、/hive/confに入っている各種テンプレートを本番用に変更します。
$cd $HIVE_HOME
$mkdir logs
$cd /usr/local/hive/conf
$mv hive-log4j.properties.template log4j.properties
$mv hive-env.sh.template hive-env.sh
$chmod 755 hive-env.sh
$mv hive-exec-log4j.properties.template hive-exec-log4j.properties
$mv hive-default.xml.template hive-site.xml
これで、最後にhiveが動くかどうか・・・・
$hive (これはrootユーザーです)
それで、hive>となったら、まずはshow databases;を叩いてみます。

hive> show databases;
OK
default
test
Time taken: 3.108 seconds, Fetched: 2 row(s)
で、create tableなど試してみて、きちんと動いているようであれば、無事インストール終了です。

2014年3月23日日曜日

サンフランシスコの花粉症

花粉症って日本だけだと思っていたら、アメリカにもあるんですね・・・。ゴールデンゲートパークの近くに住んでいるか、くしゃみが止まらない・・・

日本にいるときは、必ずマスクをして外出していたのですが、サンフランシスコではマスクをしている人を見かけないので、ちょっとマスクして出かけにくいなぁと。結構、バス乗っていても、くしゃみしたり、鼻すすっている人多いんですが、マスクはしていないんですよね。。。友達にこのこと言ったら、「怪しまれるからマスクはしない方がいい」って言われたので、しばらく我慢します。

うーん、早く花粉症の季節が終わらないかなぁ。

第4モジュール開始!

1週間の春休みも終了し、新しいモジュールが始まりました。本モジュールは、ソフトな授業が多かった先モジュールとは大きく異なり、統計&プログラミングのお祭りです。

Data and Information Visualization
字のごとく、Rのggplot2を使って、ひたすらグラフを書きまくるクラスの模様です。データの可視化は重要なテーマです。ただ、データの可視化ってかなり個人の嗜好が影響するので、どう教えるんだろうって気もしてします。ただ、先生はデータの可視化を研究している方なので、盗めるところは盗んでいきたいですね。

ただ、そもそも、これまでのビジネスの現場経験からすると、複雑なデータをどうやって折れ線と棒グラフに持ち込むかを考えるほうが重要だと個人的には思っています。

Multivariate Statistical Analysis
多変量解析の授業です。主成分分析、因子分析などなどやるようです。回帰分析、時系列分析から引き続き先生は同じで、数学をかっちりやりつつ、Rで動かすっていう感じになりそうです。

Distributed Computing
おまちかねのMapReduceです。先生は実際に働いている方なので、実務でどうやっているかを学べます。また、学生はAWSのクーポンを持っているので、AWS上でHadoopを動かします。が、AWSで遊んでいるとすぐクーポンがなくなってしまうので、好きな人は、自分のマシンにHadoop入れて遊んだりしています。

Practicum
引き続き、インターンですね!


上記の他に、Kaggleの生みの親でありデータサイエンティストのJeremy Howardのレクチャーがあります(来年はどうかわかりませんが・・・)。彼が実際にKaggleでどんなテクニックを使ってきたのかについて、説明してくれています。彼は本当にすごいです・・・。

とても楽しいモジュールになりそうです!

2014年3月17日月曜日

KAGGLE 備忘録

ここ最近、KaggleのLoan Predictionのコンペに参加していました。結果はTop25%入りでした。(コンペの詳細は、http://www.kaggle.com/c/loan-default-prediction)

このコンペの目的は、名前のとおり債権のデフォルト予測なのですが、多くのデフォルト予測は「デフォルトする・しない」のクラス分類問題です。しかし、このコンペは、デフォルトする・しないの分類だけではなく、デフォルト後の回収率を予測するという数値予測の要素も入っています。

実は、開始当初の数週間は、全てデフォルトしないと予測する「ゼロベンチマーク」を超えられず、かなり苦戦しました。しかし、いくつかブレークスルーがあり、最終的にはTop25%で着地しました。最後の1週間、時間がなくてモデルをアップデートできなかったのが悔やまれますが、まぁ、いろいろと学びがあったので、良しとしましょう!

このコンペの最大の難関は、説明変数約700個の内容が隠されていることです。もし、「利子率」とか「満期までの時間」などがわかればもっと簡単なのでしょうが、データセットの変数のラベルは、f201やf355と付けられているので、どの列が何を意味しているのかわかりません。つまり、Feature Engineeringができないことになります。

また、コンペは、Mean Absolute Error(MAE)で競われることになります。この点も非常に重要なところです。

そして、私がとったアプローチは以下2段階です。

① デフォルトした、しないのフラグを作り、クラス分類のモデルを作る。
② デフォルトしたサブセットのみを対象に、回収率の予測モデルを作る。

①の問題は「どのアルゴリズムを使うか」ということよりも、変数選択です。また、データセット中、デフォルトした債権の本数は約10%なので、かなりアンバランスなデータセットです。

そこで、フォーワードステップワイズ式のロジスティック回帰で、説明変数の絞り込みを行いました。ここで意識したのは、「何」を最大化(最小化)させるようにステップワイズを組むかです。通常のステップワイズでは、新たな変数を加えた時にAICが改善、Devianceが改善するかどうかで行いますが、今回のコンペの目的はクラス分類の精度が重要なわけです。そこで、F1スコア(PrecisonとRecallの調和平均)が最大になる変数を選択するように関数を組みました。この結果、5つの説明変数が選ばれ、F1スコアが約0.85でした。

次に、選ばれた変数を実際にグラフで見てみて、傾向を探り、ある変数と別の変数の差が予測に貢献していそうなことがわかったので、それら2つの変数の差を取ったものを、新たな変数として加えました(元の2変数は削除)。

このうえで、アルゴリズムを変えることでF1スコアが上がるかどうかを試しました。直観的には、ロジスティック回帰で0.85いくのであれば、ランダムフォレスト、ニューラルネットワークでも同等かそれ以上になるだろうということで、この2つを試しました。最終的にはニューラルネットで、F1が0.91にまで上昇しました。これで、①のクラス分類モデルの作成は終了です。

②は、①のモデルを使って、デフォルトする「だろう」と予測されたサブセットを作ります。ここで注意したのは、元データのうち本当にデフォルトしたものだけを抽出するか、①の予測モデルで、デフォルトと予測されるものを抽出するかですが、私は後者を選んでいます。賛否両論あるかと思いますが、①のモデルには誤差があるので、その誤差も含めて、②のステージで予測しようというのが考え方です。

②では、回帰分析で予測モデルを考えました。問題は残差の仮定ですが、最終的にはポアソンで落ち着きました。単純な回帰分析の場合は、被説明変数が0~100と限定されているのに対し、予測値は0以下も100以上も出ますので、予測値を得た後で、丸めなくてはなりません。今回のデータは0~100の整数で、かつ0側に歪んでいる分布だったので、ポアソンにして、残差もチェックしたら悪くない感じでした。ただ、単純に全変数を突っ込んで予測していても、順位が上がらなくなっていたので、2変数の交互作用の全組み合わせを入れて、ステップワイズでMAEを最小化するモデルを選ぶようにしました。

②はえいやー!でやった感は否めず、もう少し時間があれば変数選択をちゃんとできたかもしれませんが、まぁ、結果は悪くないと思っています。

次回も頑張りたいと思います!