さくらのクラウドにAnsibleでhadoopを構築してみた

日付が変わり、さくらインターネットは20周年を迎えました。
これまでありがとうございました。これからもよろしくお願いします！！

と言うことで、さくらの聖夜から帰ってきて、日付が変わってしまい恐縮ですが、hadoopについて簡単に書こうと思います。

# はじめに

なぜ今になってhadoopの構築を書いてるのか、というところから。

先日、大量のデータに共通の処理をしないといけない事情が発生したため、急遽hadoopのクラスタを構築しました。

以前セットアップして使ったのは4年前の学生時代の時で、当時の記憶が全く残っておらず、ドキュメントを読みながらセットアップしました。

定常的に使うことはないのですが、突発的に必要になることがあるので、せっかくなのでAnsibleのPlaybookにしましたのでご紹介します。

(構築したものの、悲しいことに今回は案件がなくなり不要になってしまいました...)

# hadoopとは

簡単に言うと、複数のホストで、たくさんのデータを管理し、それらのデータに対し並列で処理を行うことができる大規模データ分散処理のフレームワークです。

データを管理するHDFS (hadoop File System) と、ジョブを管理するYARN (Yet Another Resource Negotiator) で構成されています。

並列で処理をする手法は色々ありますが、hadoopではMapReduceが使われることが多いです。

MapReduceは、一つ一つのファイルに対してある一定の処理を独立・分散して行い (Map) 、それらの結果を並べ替え (Shuffle) 、集計する (Reduce) というロジックになっています。

例えば、「大量のテキストファイルに対し、語彙ごとの発生数を数える」などに適しています。

この場合、Mapでは一つのファイルに対して、

1. テキストファイルを形態素に分解
2. 形態素ごとに発生頻度を数える

と言う処理を行い、Reduceで、

1. 各ファイルでの形態素ごとの発生頻度を合計する

という流れになります。

hadoopを使えば、MapとReduceの処理さえ自分で書けば、大量のテキストファイルの保管はHDFSが、MapReduceの並列実行はYARNが自動的に行ってくれます。

# サーバの準備

今回はさくらのクラウドに6台のサーバを構築用意します。
インターネットに直接つながず、VPCルーターを使い、各サーバにはローカルIPアドレスを付与しました。

OSはちょっと古いですがUbuntu 14.04を使っています。

| IP Address     | Hostname  | Roles                    |
|----------------|-----------|--------------------------|
| 192.168.11.101 | hadoop-01 | namenode, datanode, yarn |
| 192.168.11.102 | hadoop-02 | datanode, yarn           |
| 192.168.11.103 | hadoop-03 | datanode, yarn           |
| 192.168.11.104 | hadoop-04 | datanode, yarn           |
| 192.168.11.105 | hadoop-05 | datanode, yarn           |
| 192.168.11.106 | hadoop-06 | datanode, yarn           |

さくらのクラウドにサーバを用意するとこのようなマップになると思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/73788/d0909d22-8100-2480-427b-9d245afe4273.png)

VPCルーターにはL2TP/IPSecを使ったリモートアクセスの機能がありますので、VPNを通してこれらのサーバーにアクセスすることとします。

パスワードは、この後のPlaybookと合わせるために、`kotamagoH@doop` としておいてください。
（あるいはPlaybookの実行前に、 `group_vars/all` に記載のパスワードを変更してください)

# AnsibleのPlaybook

今回利用するPlaybookを [github.com/chibiegg/hadoop-ansible](https://github.com/chibiegg/hadoop-ansible) においておきました。

以下のようにすることで、AnsibleのPlaybookを適用することができると思います。

```bash
git clone https://github.com/chibiegg/hadoop-ansible.git
cd hadoop-ansible
ansible-playbook -i hosts -KkS -u ubuntu site.yml
```

# HDFSの確認

ブラウザから http://192.168.11.101:50070/ にアクセスすることで、HDFSのステータスを確認することができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/73788/d2ab81a8-5fc9-475e-5050-65817d114e55.png)

http://192.168.11.101:50070/dfshealth.html#tab-datanode では、各データノードの状態を確認することができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/73788/2f6c3222-8c4e-a5c5-1a4d-d42157d464c2.png)

正常に、6台のデータノードが稼働していることがわかります。

HDFSへのファイルの追加は、`hadoop`ユーザーで以下のコマンドを実行することにより行います。

```bash
/usr/src/hadoop-2.7.3/bin/hadoop fs -put [source] [destination]
```

# YARNの確認

YARNのステータスや、実行しているアプリケーションの情報は http://192.168.11.101:8088/ から参照することができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/73788/eff24e97-bb9b-b633-cc68-fc1a28949e06.png)

# アプリケーションの実行

今回は、サンプルとして入っている円周率を求めるアプリケーションを実行してみたいと思います。

```bash
cd /usr/src/hadoop-2.7.3
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar pi 30 100
```

円周率だけでなく、単語数のカウントやいろいろなサンプルが `hadoop-mapreduce-examples-2.7.3.jar` には入っていますので、色々試してみてください。