Hadoop 2.7.1を擬似分散モードで動かす

# インストール

以前、ソースコードからビルドした2.7.1を使います。[ソースコードからのビルド手順はこちら](http://qiita.com/bwtakacy/items/a057753152306d24d927)

hadoop-dist/target配下にあるtar ballを使います。

```
$ mv hadoop-dist/target/hadoop-2.7.1.tar.gz /usr/loca/
# cd /usr/local
# tar zxf hadoop-2.7.1.tar.gz
# ln -s /usr/local/hadoop-2.7.1/ /usr/local/hadoop
# chown -R hadoop:hadoop /usr/local/hadoop
```
# 環境変数の設定

hadoopを動かすユーザ（今回はhadoopユーザ）の環境変数を設定します。

```bashrc
export JAVA_HOME=/usr/java/latest
export HADOOP_PREFIX=/usr/local/hadoop
export PATH=$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin:$PATH
```

# SSHの設定

自分自身(localhost)にパスワードなしでログインできるようにします。Hadoopを立ち上げる際にstart-dfs.shといったスクリプトを使えるようにするためです。

```
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```

# HDFSの設定

/usr/local/hadoop/etc/hadoop配下の設定ファイルに、擬似分散モードで動かすための設定をします。

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

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

# NameNodeの初期化

```
$ hdfs namenode -format
```

メッセージがいっぱい出ますが、

```
15/08/29 11:00:41 INFO common.Storage: Storage directory /tmp/hadoop-hadoop/dfs/name has been successfully formatted.
```

というようにあれば成功してます。このあたり、もう少し見やすくならないかな。。。

# HDFSの起動

NameNodeプロセスとDataNodeプロセスを立ち上げます。付属のstart-dfs.shスクリプトを使います。

```
$ start-dfs.sh
$ jps
13888 SecondaryNameNode
13553 DataNode
13331 NameNode
14084 Jps
```

dfsadminでちゃんとDataNodeが認識されていること、およびNameNodeがSafe modeになっていないことをチェック。

```
$ hdfs dfsadmin -report
Configured Capacity: 18746441728 (17.46 GB)
Present Capacity: 4078813184 (3.80 GB)
DFS Remaining: 4078809088 (3.80 GB)
DFS Used: 4096 (4 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0

-------------------------------------------------
Live datanodes (1):

Name: 127.0.0.1:50010 (localhost)
Hostname: localhost
Decommission Status : Normal
Configured Capacity: 18746441728 (17.46 GB)
DFS Used: 4096 (4 KB)
Non DFS Used: 14667628544 (13.66 GB)
DFS Remaining: 4078809088 (3.80 GB)
DFS Used%: 0.00%
DFS Remaining%: 21.76%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Sat Aug 29 11:03:58 JST 2015
```

# YARNの設定

/usr/local/hadoop/etc/hadoop配下のファイルにYARN上でMapReduceフレームワークを動かす設定をします。

```yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
</configuration>
```

NodeManagerが利用するメモリ量がデフォルトで最大8GBになっているので非力なノートPCで動作させる場合にはスワップを避けるために下げておいたほうがいいのですが、めんどいので省略。

```mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.job.ubertask.enable</name>
        <value>true</value>
    </property>
</configuration>
```

`mapreduce.job.ubertask.enable`は、軽いMapReduceジョブの実行をApplicationMaster内で完結させる機能を有効化するために記載しておきます。擬似分散モードで動かすようなジョブだと、uberモードの恩恵を受けやすいはず。

# YARNの起動

```
$ start-yarn.sh
$ jps
13888 SecondaryNameNode
13553 DataNode
13331 NameNode
15204 ResourceManager
15352 NodeManager
15465 Jps
```

NodeManagerがResourceManagerから認識されているかチェック。

```
$ yarn node -list
15/08/29 11:11:38 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
Total Nodes:1
         Node-Id	     Node-State	Node-Http-Address	Number-of-Running-Containers
 localhost:40945	        RUNNING	   localhost:8042
```

# MapReduce用のJobHistoryServerの起動

MapReduceジョブのhistory情報をWeb UIから見るためにJobHistoryServerを起動しておきます。これを立てておかないと、ResoruceManagerのWebUIから各アプリケーションの「history」リンクを踏んでもNot Foundになっていまいます。

```
$ mr-jobhistory-daemon.sh start historyserver
$ jps
13888 SecondaryNameNode
13553 DataNode
13331 NameNode
15204 ResourceManager
18183 JobHistoryServer
15352 NodeManager
18217 Jps
```

# サンプルジョブの実行

とりあえずのPI計算ジョブを。

```
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar pi 2 100
Number of Maps  = 2
Samples per Map = 100
Wrote input for Map #0
Wrote input for Map #1
Starting Job
（略）
Job Finished in 20.804 seconds
Estimated value of Pi is 3.12000000000000000000
```

ちなみに、まじめに計測はしていませんが、uberモードのありとなしでは、平均40秒くらいから平均20秒くらいになるくらいの効果がありました。


# WebUIを見る

Webブラウザで以下にアクセス。

* NameNode : localhost:50070
* ResourceManager : localhost:8088
* JobHistoryServer : localhost:19888

バージョンが上がるとちょいちょい見た目や表示項目が変わりますねー

以上。