Hadoopのドキュメントを読む

## 要約

* **コミュニティ版** Hadoopのドキュメントを読むためのノウハウを紹介する

## なぜコミュニティか?

* 本家で起こるバグは、別のDistributionでも(大抵は)起こる。だから本家もウォッチしておきたい

  * (些細な)例: ドキュメントのトップページにある謎のタイポ "Äôs"
  * 本家のサイト: http://hadoop.apache.org/docs/r2.2.0/
  * CDH5 beta1: http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.2.0-cdh5.0.0-beta-1/
  * 2 (これを引用するのは妥当じゃないかも) : http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.0.6.0/ds_Hadoop/index.html
  * https://issues.apache.org/jira/browse/HADOOP-9830 で報告されているが、手付かずのまま放置されている -> (追記) 2.3で修正予定

* 開発中の最新機能を試したい

  * HDFS cache management (HDFS-4949)
  * heterogenious storage support (HDFS-2832)
  * etc...

## 最近、Hadoop-MLで流れた話題

 * 「ドキュメントの通りに設定したけど全然動作しないんだけど」
 * 「Hadoop2系のドキュメントって **オワコン** じゃね?」

注: 原文はもっとひどい言葉遣いである

## なぜオワコン扱いされるのか

あげていけばいろいろあるけど、おおまかに以下の3点

* Hadoop2系でJobTracker, TaskTrackerは廃止されて、YARNに切り替わったが、ドキュメントにはJobTracker, TaskTrackerの表記が残ったまま
* コマンド表記やプロパティ名も1系のものが残ったまま
* MapReduceのドキュメントは、1系から2系に移行されていない

## オワコン扱いされないために

だめなものは、直すしかない

* MapReduceのドキュメントの移行 (ほぼパッチ書いた)

  * https://issues.apache.org/jira/browse/MAPREDUCE-4282

* デッドリンクの修正 (パッチ書いた)

  * https://issues.apache.org/jira/browse/HADOOP-9982
  * https://issues.apache.org/jira/browse/HDFS-5297
  * (追記) 2.3で修正予定

* [Single Cluster Setup](http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-common/SingleCluster.html)を読みやすくする (これから頑張る)

  * https://issues.apache.org/jira/browse/HADOOP-10139
  * (追記) 2.4で修正予定

Reviewer WANTED!!!

  * (追記) MLで募ったらレビュー & コミットしてもらえました。

## 本題に戻って

* この記事を見てる方々が、本家Hadoopのドキュメントを読んで(おかしいな、と思ったらJIRAにチケットを作成して)くれると嬉しい
* いきなり読むだけだと大変なので、読むためのノウハウ的なものを書いていく

## 今回のお題

[Single Cluster Setup](http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-common/SingleCluster.html)

* 何もわからない人がまず初めに読むドキュメント、のはず
* しかし、これを読むだけではきっとHadoopは動作しない

  * 突然の"mvn"コマンド
  * You will need protoc 2.5.0 installed. (protocって何)
  * The following instructions assume you have hdfs running. (HDFSの動作方法が書かれていない)
  * Good luck. (なにこれ)

* 大幅な書き直しが必要!

## マニュアルをざっくり書き直す (30分くらいで！)

### 動作環境

(まず、本家ドキュメントにはこの内容がきれいさっぱり抜けてる)

* RHEL、もしくはCentOSの6.4+を推奨

  * 最新版、と言いたいけど最近6.5が出ちゃった & 6.5を試してないので6.4+と書いてる

* Windows対応とは書いてあるものの、気軽に動かせるような代物ではない、はず

  * 少なくとも、ここからの説明はあまり役に立たない

* iptables, ip6tables, SELinuxはオフにする。

  * 石川さんごめんなさい。

* 適切なJavaをインストールする

  * コミュニティの推奨バージョン: http://wiki.apache.org/hadoop/HadoopJavaVersions
  * 私はOracle JDK7の最新版使ってるけど、問題なく動作してます (個人的な見解)

### Hadoopのダウンロード

(詳細なビルド手順はここでは書かない)

* http://www.apache.org/dyn/closer.cgi/hadoop/common/ から、hadoop-2.2.0.tar.gzをダウンロードする
* ソースからビルドしたい人は、http://svn.apache.org/repos/asf/hadoop/common/trunk/BUILDING.txt を熟読すること

### Hadoopの設定

* ダウンロード、もしくはビルドしたファイルを解凍して、解凍したフォルダごと適切なファイルパス上に置く
* 私の場合は、こんなコマンドを実行して /usr/local/hadoop でアクセスできるようにしている

```
tar xf hadoop-2.2.0.tar.gz
mv hadoop-2.2.0/ /usr/local/
cd /usr/local
ln -s /usr/local/hadoop-2.2.0 hadoop
```

* こうしておくと、他のバージョンや、独自パッチを当てたバージョンなどいろいろ試すときにシンボリックリンクを差し替えるだけでよいので便利だったりする (マニア向け)

### 設定ファイルを書く

* 設定ファイルは、hadoop-2.2.0/etc/hadoop 配下に配置されている
* Hadoopを動かすために本当に **最低限** 必要な追記箇所は以下の通り

```xml:core-site.xml
<property>
    <name>fs.defaultFS</name>
    <value>localhost:9000</value>
    <comment>ここでlocalhostと指定することで、擬似分散モードで動作する</comment>
</property>
```

```xml:hdfs-site.xml
<property>
    <name>dfs.replication</name>
    <value>1</value>
    <comment>擬似分散モードのため、レプリカ数を1にする</comment>
</property>
```

```xml:yarn-site.xml
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    <comment>これ書かないとYARN上でMapReduceが動作しません！</comment>
</property>
```

* Hadoopのデーモン起動時に--configオプションで設定ファイルが配置されたディレクトリを指定する必要があるため、以下のようなコマンドを実行してシンボリックリンクを作成しておくと便利。自分の場合だとこうなる

```
ln -s /usr/local/hadoop/etc/hadoop /etc/hadoop/conf
```

### Hadoopを動かす

* hadoop, hdfs, mapred, yarnコマンドを実行できるように、hadoop-2.2.0/binにパスを通す

```
export PATH=$PATH:/usr/local/hadoop/bin
```

* javaも通す

```
export PATH=$PATH:/usr/java/latest/bin
```

* NameNode起動前に、NameNodeをフォーマットする (初回だけ!)

```
hdfs namenode -format
```

* daemon実行用のスクリプトは、hadoop-2.2.0/sbin 配下に配置されている

```python:
cd hadoop-2.2.0/sbin

## NameNodeの起動
./hadoop-daemon.sh --config /etc/hadoop/conf --script hdfs start namenode
## DataNodeの起動
./hadoop-daemon.sh --config /etc/hadoop/conf --script hdfs start datanode
## ResourceManagerの起動
./yarn-daemon.sh --config /etc/hadoop/conf start resourcemanager
## NodeManagerの起動
./yarn-daemon.sh --config /etc/hadoop/conf start nodemanager
## JobHistoryServerの起動
./mr-jobhistory-daemon.sh --config /etc/hadoop/conf start historyserver
```

* jpsコマンドを叩いて、各種デーモンが起動しているようならOK。

```
$ jps 
1956 JobHistoryServer
3001 Jps
1712 NodeManager
1466 ResourceManager
1346 DataNode
1256 NameNode
```

  * ダメならログを読んで原因を探る
    * ログは、hadoop-2.2.0/logs 配下に出力されている。
    * エラーメッセージで検索かけるのがよい
    * 大抵はディレクトリのパーミッションの設定ミス、もしくは各種ノードのホスト名、ポート設定ミス
    * iptableはオフにしている?
    * DNSはオフにして、/etc/hostsで名前解決したほうがいいよ

### Jobの動作確認

* MapReduceのサンプルジョブは、hadoop-2.2.0/share/hadoop/mapreduce 配下に配置されています
* 以下のようなコマンドで、サンプルジョブ(pi計算)が実行できる

```
hadoop jar hadoop-mapreduce-example-2.2.0.jar pi 10 1000
```

## 最後に

* すごい勢いで書いたのでいろいろ間違いとかあると思います。
* とりあえず動かすこと最優先なので、ユーザ、パーミッション設定とか(重要な事が)抜けてます
* この設定をうのみにして本番環境で使わないでください

  * 他にも設定すべき項目は沢山あります

* タイポなどなんでもいいので見つけたらコメントやtwitterでお知らせください。

* 次は、今回書ききれなかったMapReduce Tutorial (YARN版) の話でも書こうと思います。
* Hadoop Advent Calendar、明日はiwasakimsさんの番です。sqoop2に関する混みいった話か、htraceのcoolな話をしてくれると思います。
* Reviewer WANTED!!! (もちろんパッチ書く人も)

## 宣伝

12/20、Hadoop ソースコードリーディング 第15回でHDFSのキャッシュ機能についてしゃべります。こんなことにつっこんでしゃべってほしい、とかあればお知らせいただけると可能な限り対応します。

詳細 & 参加登録はこちら　: http://www.eventbrite.com/e/hadoop-15-tickets-9644265257