「とりあえず動く」Hadoop環境構築手順

細かい設定は無視して、とりあえず並列分散処理環境を作ってアプリを動かしてみたい人用まとめ。という名の自分用メモ。
インフラ屋さんよりアプリ屋さん向けです。

# 想定
- Linux上で分散処理環境を実現するHadoopを導入する。
- 分散処理フレームワークであるMapReduceのサンプルアプリが動くことを確認する。
- 1台のPCで擬似的に分散処理する「擬似分散モード」で構築します。

注）今回はHadoopのバージョン1系です

# 準備
Windows8.1付属のHyper-Vにて[CentOS7](http://ftp.riken.jp/Linux/centos/7/isos/x86_64/)を構築して試します。
（参考までに）最小限インストールで互換性ライブラリと開発ツールを追加しました。
![centos1.min.png](https://qiita-image-store.s3.amazonaws.com/0/83530/2b306521-b812-c80f-bc8f-02044476c711.png)


以下の２つのrpmをダウンロードしておきます。

- [JavaSDK8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
- [Hadoop1.2.1](https://www.apache.org/dist/hadoop/core/hadoop-1.2.1/)

# ユーザの設定
CentOS7インストール時にrootと一般ユーザ(userとする)が設定できるので設定。
sudoしたいのでuserをwheelグループへ。

```
usermod -G wheel user
id user #確認
```

# JDKのインストール
おもむろにrpmでインストールします。

```
sudo rpm -ivh jdk-8u25-linux-x64.rpm

java -version #動作の確認
```

# Hadoopのインストール
またもrpmでインストールします。

```
 sudo rpm -ivh hadoop-1.2.1-1.x86_64.rpm --force
```

非常に楽。

# Hadoop各種XML設定
## core-site.xml
ファイル分散のためのファイルシステムHDFS関連の設定を記述

```bash:/etc/hadoop/core-site.xml
<configuration>
 <property>
    <name>hadoop.tmp.dir</name>
    <value>/hadoop</value>
  </property>
　<property>
 　<name>fs.default.name</name>
 　<value>hdfs://localhost:9000</value>
 </property>
</configuration>
```

`hadoop.tmp.dir`でデータ保存領域を指定します。デフォルトだと`/tmp`の下に作られるので注意。
`fs.default.name`ではNameNodeを設定するところですが、1台で構築擬似分散なのでlocalhostで大丈夫。

## hdfs-site.xml

レプリケーションの設定。１で。

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

## mapred-site.xml

```bash:/etc/hadoop/mapred-site.xml
<configuration>
 <property>
  <name>mapred.job.tracker</name>
  <value>localhost:9001</value>
 </property>
</configuration>

```
# Hadoop起動

HDFS領域のフォーマットを行って、読み書きの準備をします。
まずhadoopのrpmをインストールすると`hdfs`ユーザが作られています。このユーザでフォーマットを行います。（rootではフォーマット実行できないので注意）

```
sudo passwd hdfs #パスワード設定
・・・
su - hdfs
/etc/init.d/hadoop-namenode format #フォーマット実行
```

必要なデーモンを起動します。１つずつ確認。

```
/etc/init.d/hadoop-namenode start
/etc/init.d/hadoop-datanode start
/etc/init.d/hadoop-jobtracker start
/etc/init.d/hadoop-tasktracker start
```

HDFS領域をだれでも書き込めるようにしておきます。これも`hdfs`ユーザで。

```
hadoop fs -chmod 777 /
```


# サンプルアプリ実行
今回、wordcountというサンプルを動かします。名前の通り単語の数カウントです。
テスト用の入力ファイルを作ります。

```text:input.txt
aaa aaa bbb a vbbbb dccc aa baa aaa
ddd gg bbb aaa aaa bbb a vbbbb dccc aa baa aaa ddd gg bbb
```

こんな感じ。準備出来たら早速実行。

```
hadoop fs -put input.txt .  #HDFS上にファイルをコピー
hadoop fs -rmr output #出力先をクリア
hadoop jar /usr/share/hadoop/hadoop-examples-1.2.1.jar wordcount input.txt output
hadoop fs -cat output/part-r-00* | sort -t $'\t' -n -k2,2 -r > out.csv
```

`hadoop-examples-1.2.1.jar wordcount [入力ファイルorディレクトリ] [出力先]`
です。
最終行は出力結果を結合して単語数順にソートして持ってきているだけです。

![log.png](https://qiita-image-store.s3.amazonaws.com/0/83530/94ae7144-652e-7873-8a1c-c35856a84134.png)

こんな感じにmapとreduceが100%になると正常動作しています。

最後のout.csvはこんな感じに出力されています。

```text
[user@localhost ~]$ cat out.csv
aaa     6
bbb     4
vbbbb   2
gg      2
```

よーし、動いた。

# 設定おまけ
mapとreduceの並列処理数を設定したい場合以下の項目で設定できます。

```bash:/etc/hadoop/mapred-site.xml
<configuration>
 <property>
  <name>mapred.tasktracker.map.tasks.maximum</name>
  <value>2</value>
 </property>
 <property>
  <name>mapred.tasktracker.reduce.tasks.maximum</name>
  <value>2</value>
 </property>
 <property>
   <name>mapred.map.tasks</name>
   <value>10</value>
  </property>
 <property>
   <name>mapred.reduce.tasks</name>
   <value>10</value>
 </property>
</configuration>

```