Macのローカル環境でhadoopを1から勉強する

とりあえずローカルのmac上で試しにhadoopを動かしてみたいということで、
virtualboxをインストールして、vagrantでcentosを入れて疑似分散環境を作ってみました。

## homebrewをインストール
virtualboxやvagrantをコマンドラインからインストールするためこいつを入れます。
`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

## virtualboxのインストール

brew cask search /^virtualbox$/
brew cask install virtualbox

信じられないかもしれませんがこれで、アプリケーションフォルダにvirtualboxがインストールされます。

さくっとこのままvagrantを使っていきます

## vagrantのインストール
brew cask search vagrant
brew cask install vagrant
これでvagarantがインストールされました。

## vagrantを使ってcentosを立ててみる

### 立てたいOSのBOXを落としてくる
BOXというのは構築するサーバのOSイメージみたいなやつと思えばいいと思います。

ここからお好みのOSのURLをゲッチュする。
http://www.vagrantbox.es/
今回は僕はcentos6系のを選びました。

上でコピーしたOSのURLを下記コマンドの一番最後の引数に指定
vagrant box add ＜name＞ ＜boxのURL＞
といった具合

vagrant box add centos6 https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box
↑でcentos6のboxがDLできる。

DLが終わったら、
vagrant box list
で確認してみましょう。
＜name＞で指定した名前のBOXが表示されるはずです。

### 落としてきたBOXをもとにVMを起動させる

mkdir centosVM
cd centosVM
vagrant init centos6
と打ちます。
すると、
Vagrantfile
というものが出来上がります。
ちょこっと書き換えます。
vi Vagrantfile
で開き。
`#config.vm.network "forwarded_port", guest: 80, host: 80`
という行があると思うので、
コメントアウトを外して、
`config.vm.network "forwarded_port", guest: 50070, host: 50070`
と書き換えます。
何をしているかというと、
vagrantサーバ上でHDFSを起動させた後、ブラウザから管理画面をみるための設定です。
こうしておくことで、
Macのブラウザから、
localhost:50070
と打つことで、
vagrant上の50070ポートのプロセスにアクセスすることができるのです。便利。
もちろんvagrantのサーバにプライベートIPをつけることも可能ですがこれで事足ります。


Vagrantfileを編集し終わったら、
vagrant up
でVMが立ち上がります。

## SSHで接続してhadoopとして必要なものをインストールしていく
vagrant ssh
で立ち上げたVMに接続することができます。
※vagrant upを叩いたときに、127.0.0.1:2222で上がったよってログがでるので、
ssh vagrant@127.0.0.1 -p 2222
といった形でも接続可能です。
パスワードは「vagrant」です

### wgetのインストール
素の状態だとwgetが入っていないので入れます。
sudo su -
でrootになり。
yum install wget
で簡単に入ります

### JDKのインストール
`wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.rpm" -O jdk-8u45-linux-x64.rpm`
長いコマンドですがこれで引っ張ってこれます。
rootのまま作業しましょう。
yum -y localinstall jdk-8u45-linux-x64.rpm
でインストールされます。
java -version
でバージョン情報が表示されるのを確認できればOK

### CDHをインストール
wget http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm
yum -y --nogpgcheck localinstall cloudera-cdh-5-0.x86_64.rpm
でCDH5が入ります。

## 疑似分散環境の設定
yum -y install hadoop-conf-pseudo
詳しいことはわかりませんがこれが必要なそうです。（これからわかっていくのです）

ローカルからSSHする際に邪魔になりそうなのでfirewallを切っておきます。
service iptables stop
chkconfig iptables off

### HDFSのフォーマット
sudo -u hdfs hdfs namenode -format
注意点はhdfsユーザで実行するところです。
※CDHのパッケージをインストールすることで自動的にhdfsユーザ、mapredユーザは作られています。

上記コマンドを打つとどわーーっとでてきます。

最終的に、
```
17/04/11 09:57:01 INFO util.ExitUtil: Exiting with status 0
17/04/11 09:57:01 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1
************************************************************/
```
的なメッセージがでればOKかと。

### サービス起動
service hadoop-hdfs-namenode start
service hadoop-hdfs-datanode start
namenodeとdatanodeのプロセスを起動させます。

この状態でMacのブラウザから、
localhost:50070
にアクセスするとHDFSの管理画面が閲覧できるかと思います。

### HDFSに必要なディレクトリの作成
スクリプトが用意されています。
sudo /usr/lib/hadoop/libexec/init-hdfs.sh
これを実行しないとYARNがコケるそうです。よくわかっていません。

sudo -u hdfs hadoop fs -ls -R /
で、作成されたディレクトリなどを確認できます。

sudo service hadoop-yarn-resourcemanager start
sudo service hadoop-yarn-nodemanager start
sudo service hadoop-mapreduce-historyserver start

これでYARNが起動しました。
ResourceManager - http://192.168.33.100:8088/
NodeManager - http://192.168.33.100:8042/
JobHistory - http://192.168.33.100:19888/
にアクセスすると、webから管理画面が見えるそうです。
※VagrantFileに↑ポートへのフォワード設定が必要です。


## サンプルプログラムの実行
sudo su - hdfs
echo "hoge fuga bar foo hoge fuga" > wordcount.txt
hadoop fs -mkdir -p /user/hdfs/input
hadoop fs -put wordcount.txt /user/hdfs/input
hadoop fs -cat /user/hdfs/input/wordcount.txt

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount /user/hdfs/input/wordcount.txt /user/hdfs/output


実行結果の確認
hadoop fs -ls -R /user/hdfs/output
hadoop fs -cat /user/hdfs/output/part-r-00000


## これで一通りhadoopを動かす環境が整いました
疑似分散環境という形ですが、以上でhadoop環境の構築から実行までできたと思います。
ここからhiveだとかを投げて見たりしていきたいです。