Macでhadoopをちょっとだけ動かしてみる


# 環境
Mac OSX 10.9.2で試した。

```
$ java -version
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)
```

# インストール
homebrew使う。v2.4.0がインストールされた。

```
$ brew install hadoop
```

```
$ brew info hadoop
hadoop: stable 2.4.0
http://hadoop.apache.org/
/usr/local/Cellar/hadoop/2.4.0 (5592 files, 236M) *
  Built from source
From: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/hadoop.rb
==> Caveats
In Hadoop's config file:
  /usr/local/Cellar/hadoop/2.4.0/libexec/etc/hadoop/hadoop-env.sh,
  /usr/local/Cellar/hadoop/2.4.0/libexec/etc/hadoop/mapred-env.sh and
  /usr/local/Cellar/hadoop/2.4.0/libexec/etc/hadoop/yarn-env.sh
$JAVA_HOME has been set to be the output of:
  /usr/libexec/java_home
```

# スタンドアロンで動かす

[『Hadoopファーストガイド』](http://www.amazon.co.jp/Hadoop%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%82%AC%E3%82%A4%E3%83%89-%E4%BD%90%E3%80%85%E6%9C%A8-%E9%81%94%E4%B9%9F/dp/4798034940)読みながら進めてる。

hadoopがインストールされてるディレクトリまで移動

```
$ cd /usr/local/Cellar/hadoop/2.4.0
```

Hadoop組み込みの、ワードカウントを動かす。

入力ファイルを用意。

```
$ mkdir input
```

```input/a
a b c
```

```input/b
a a b c c c
```

計算を実行。

```
$ hadoop jar libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.0.jar wordcount input output
```

（出力用のoutputディレクトリは勝手にできる）

`output/part-r	-00000`というファイルが生成されている。

```output/part-r-00000
a	3
b	2
c	4
```

ちゃんとワードカウントが動いたことが分かる。

# 擬似分散モードで動かす

## localhostにSSHログインできるようにする

localhostにパスワード無しでSSHログインできるようにする必要があるらしい。

```
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```

```
$ ssh localhost
```

これでログインできればOK。
Macのシステム環境設定で、「共有」のリモートログインのところにチェックを入れておく必要がある。

## 設定ファイル追記、フォーマット

```
$ cd /usr/local/Cellar/hadoop/2.4.0
```

`core-site.xml`, `hdfs-site.xml`を編集。

```xml:libexec/etc/hadoop/core-site.xml
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>
```

```xml:libexec/etc/hadoop/hdfs-site.xml 
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>
```

Hadoopの分散ファイルシステム、HDFSのフォーマット。

```
$ hdfs namenode -format
```

これで、`/tmp/hadoop-<ユーザー名>/dfs/name`以下に、HDFSの管理ファイルが作られる。

## 起動

hadoopのパッケージに付いてるシェルスクリプトを使う。

```
$ sbin/start-dfs.sh
```

シェルが実行されると、Javaのプロセス (namenodeやdatanodeなど) が起動する。

起ち上がっているのは以下のプロセスたち。

```
$ jps
26353 Jps
26172 DataNode
26278 SecondaryNameNode
26084 NameNode
```

`http://localhost:50070`にアクセスすると、こんな感じの画面が見れる。

![スクリーンショット 2014-05-03 18.51.53.png](https://qiita-image-store.s3.amazonaws.com/0/1795/2e373cac-1dec-41bf-bc7a-6b3027b3d499.png "スクリーンショット 2014-05-03 18.51.53.png")

## YARN

YARN (Yet-Another-Resource-Negotiator) に関する設定。

```xml:libexec/etc/hadoop/yarn-site.xml
<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>
```

```xml:libexec/etc/hadoop/mapred-site.xml
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>
```

起動のシェルスクリプトを実行。

```
$ sbin/start-yarn.sh
```

先ほどのプロセスに加え、ResourceManager, NodeManagerが起動している。

```
$ jps
26172 DataNode
26609 ResourceManager
26278 SecondaryNameNode
26084 NameNode
26745 Jps
26703 NodeManager
```

`http://localhost:8088`にアクセスすると、こんな感じの画面が見れる。
まだ見方はよくわかってない。。

![スクリーンショット 2014-05-03 18.59.28.png](https://qiita-image-store.s3.amazonaws.com/0/1795/7749492c-e8d1-8a63-30af-8702a041d4a3.png "スクリーンショット 2014-05-03 18.59.28.png")

`sbin/stop-dfs.sh`, `sbin/stop-yarn.sh`で上記プロセスは停止できる。

## 処理の実行

```
$ hdfs dfs -mkdir /hadoop
```

HDFS上に（仮想）ディレクトリを作成。
`hdfs dfs`コマンドのオプションはLinuxぽい感じ。

スタンドアロンモードの時に使った`input`ディレクトリをHDFS上に置く。

```
$ hdfs dfs -put input /hadoop/input
```

先ほどと同様、wordcountの計算実行。

```
$ hadoop jar libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.0.jar wordcount /hadoop/input /hadoop/output
```

```
$ hdfs dfs -cat /hadoop/output/part-r-00000
(中略)
a	3
b	2
c	4
```

擬似分散モードでもちゃんと動いた。