10分(嘘)でできるHadoop build環境

# まとめ

* vagrant,virtualboxでお手軽Hadoop build 環境構築を目指した
* ダウンロードとかが遅いのでelapseタイムは絶対に10分に収まりません。
* この手順をやった人にvagrantのboxを分けてもらうのが一番早い。
* 驚愕のオチ

# 今回の方針

## 過去の失敗と目指すべき姿

* 色気を出して、公式が言っているのと違う環境をビルド環境にしようとしてど嵌る
* デスクトップ環境自体に色々と make install とかしちゃってカオス

という展開はもうおなかいっぱいである。

というわけで、極力公式ページにある情報にそった環境を仮想マシンとしてさくっと作って、綺麗さっぱりビルドできるようにするんだ..。
そして、この作業がおわったら俺コミッターを目指すんだ（志望フラグ）

# 前提条件

* [Vagrant]と[VirtualBox]がインストールされていること。
* ネットワーク通信が快適な環境であること。（大量の通信があるためテザリングとかでやると死にます。）
* この手順を真似して何が起きても動じない精神。
* ``D:\>`` は windowsの操作。``$`` はゲストOSのvagrantユーザの操作。

[VirtualBox]:https://www.virtualbox.org/wiki/Downloads
[Vagrant]:https://www.vagrantup.com/downloads.html

# ゲストOSの用意

とりあえず会社で使い慣れてるCentOS6系で～、とか言わない。
HadoopのwikiのBuiliding.txtに従うとUbuntu14.04とのことなのでそのOSを準備しとく。
あと、環境のスクラップビルドに備えて box add しとく。[^1]

[^1]: `実の所、boxのイメージより最初のapt-get update とかの方がめちゃ重いことがすぐに判明する。`

```console:vagrantでUbuntu14.04をbox登録
D:\> mkdir vag_ubuntu1404
D:\> cd vag_ubuntu1404
D:\vag_ubuntu1404> vagrant box add Ubuntu1404 https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box
```

ここの vagrant box add コマンドに渡すURLとしては色々なものが出回っているのだが、VirtualBox 向けの特殊なパッケージ(VirtualBox Guest Additions)が入っていないものを使うと問題が起きる。
具体的には、下記でVagrantfileに追記する apt-get スクリプトが vagrant によるVM生成時に動いてくれない。

VM構成情報を初期化する。

```console:VM構成情報の初期化
D:\vag_ubuntu1404> vagrant init Ubuntu1404
```

これで、 Vagrantfileというファイルができているはずなので、このファイルに以下のような変更を施す。

```ruby:Vagrantfileへの編集
(略)
  config.vm.network "private_network", ip: "192.168.33.10"
  #この設定をしとくとホストOS側からこのアドレスにsshで入れるので便利。
(略)
  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    #vb.gui = true
  
    # Customize the amount of memory on the VM:
    vb.memory = "1524"
  end
  #ちょっと多めのメモリをVMにつけないとbuildでOOMを出すことが。
(略)
  config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get -y update
    sudo apt-get -y install git
    sudo apt-get -y install software-properties-common
    sudo apt-get -y purge openjdk*
    sudo apt-get -y install software-properties-common
    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get -y update
    sudo apt-get -y install maven
    sudo apt-get -y install build-essential autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev
    sudo apt-get -y install protobuf-compiler
    sudo apt-get -y install snappy libsnappy-dev
    ease refer to https://01.org/intel%C2%AE-storage-acceleration-library-open-source-version
    sudo apt-get -y install bzip2 libbz2-dev
    sudo apt-get -y install libjansson-dev
    sudo apt-get -y install fuse libfuse-dev    
    sudo apt-get -y install ansible
  SHELL
  # この設定でほぼ全て片付いたかもしれない。
```

ここまで終わったらゲストVMを生成する。小一時間かかるのでご飯でも食べに行くとよいです。

```console:ゲストVMの作成
D:\vag_ubuntu1404> vagrant up
```

ログインして、oracle-java7-installerをインストールする。どうも、このパッケージは画面操作をしないと自動インストールできないようだ。調べると[色々技があるよう]だが本筋じゃないので無視。

```console:oracle-jdkの手動インストール
$ sudo apt-get -y install oracle-java7-installer
$ sudo apt-get -y install oracle-java7-set-default
```

[色々技があるよう]:http://askubuntu.com/questions/190582/installing-java-automatically-with-silent-option

# Hadoopのコードの取得

さっそくHadoopをダウンロードして適当リリースのタグを取り出してビルドしてみよう。

```console:hadoopのソース入手とリリースタグのcheckout
$ git clone https://github.com/apache/hadoop.git ~/hadoop
$ cd ~/hadoop
$ git checkout -b rel-2.7.1 refs/tags/release-2.7.1
```

# Hadoopのビルド

ビルドしてみる。最初にhadoop-maven-pluginsをインストールしないといけない模様。

```console:hadoop-maven-pluginsのインストール
$ cd ~/hadoop/hadoop-maven-plugins
$ mvn install
```

何となく成功したので本体を一揆にcompile。

```console:hadoop本体をcompileしてみる
$ cd ~/hadoop
$ mvn compile -Pnative
```

ビルドが通るはず。

```console:
(略)
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Apache Hadoop Main ................................ SUCCESS [0.745s]
[INFO] Apache Hadoop Project POM ......................... SUCCESS [1.274s]
[INFO] Apache Hadoop Annotations ......................... SUCCESS [1.227s]
[INFO] Apache Hadoop Project Dist POM .................... SUCCESS [0.379s]
[INFO] Apache Hadoop Assemblies .......................... SUCCESS [0.279s]
[INFO] Apache Hadoop Maven Plugins ....................... SUCCESS [0.469s]
[INFO] Apache Hadoop MiniKDC ............................. SUCCESS [1.211s]
[INFO] Apache Hadoop Auth ................................ SUCCESS [0.782s]
[INFO] Apache Hadoop Auth Examples ....................... SUCCESS [0.278s]
[INFO] Apache Hadoop Common .............................. SUCCESS [36.178s]
[INFO] Apache Hadoop NFS ................................. SUCCESS [0.471s]
[INFO] Apache Hadoop KMS ................................. SUCCESS [0.573s]
[INFO] Apache Hadoop Common Project ...................... SUCCESS [0.167s]
[INFO] Apache Hadoop HDFS ................................ SUCCESS [1:21.287s]
(略)
[INFO] Apache Hadoop Tools ............................... SUCCESS [0.292s]
[INFO] Apache Hadoop Distribution ........................ SUCCESS [0.341s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9:45.838s
[INFO] Finished at: Thu Dec 17 15:21:14 UTC 2015
[INFO] Final Memory: 106M/359M
[INFO] ------------------------------------------------------------------------
```

やったー。次回はwindows側のIntelliJと無理やり連携させて開発をする方法を書くかも。

# ゲストOS改を保存

このVagrantfile からの vagrant up や各種資材のダウンロードはとてつもなく時間がかかるのでお好みのタイミングでゲストVMをvagrantのboxイメージとして登録して置くことをお勧めする。

詳しくは[このあたり]を見ていただくとして、以下をしとけばまあ何となくうまくいく。
(vagrant package コマンドを打つとVMが勝手に停止するので注意。)

[このあたり]:http://qiita.com/t_cyrill/items/ef9cb2b615bfb326f79c

```console:色々とインストールしたVMイメージをBox登録する
D:\vag_ubuntu1404> vagrant package
D:\vag_ubuntu1404> vagrant box add Ubuntu1404_ex package.box
```

これで、次にスクラップ＆ビルドするときは、

```console:保存したBoxからVM作成
D:\vag_dokoka> vagrant init Ubuntu1404_ex
D:\vag_dokoka> vagrant up
```

とやるだけでＯＫ。あ、Vagrantfilesのvb.memoryや ``config.vm.network "private_network", ip: "192.168.33.10"`` の設定は変わらず必要なので注意。(SHELLの設定は追加不要。)
なお、このpackage.boxは数GBになっていた。。。box add が終わったら消しましょう。

いつboxを作成するかはディスク容量とかにもよるが、一度ビルドが通ってからいいのではないだろうか。mvnによる依存のダウンロードとか時間かかるので...。

# オチ

がんばって手塩にかけて作ったビルド環境。感動も一塩である。
しかし、よくよく最新の BUILDING.txt を見てみると...、

```
On Linux:
    Install Docker and run this command:

    $ ./start-build-env.sh
```

ファッ？要は上記コマンドを一発うつだけでビルド用環境が固められたDockerイメージでお手軽ビルドできちゃうそうです。まあ、tags 2.7.1 のBUILDING.txtには書いてありませんでしたが。

# 各ツールのバージョン

ホストOS: Windows 7 64bit
vagrant: 1.7.4 (最初昔インストールしていたvagrant1.4では起動することができず、1.7.4にアップデートを行った。)
VirtualBox: 5.0.10
ゲストOS: Ubuntu 14.04 x86_64