VagrantでCDH擬似分散環境構築

VagrantでCDHの擬似分散環境を構築するメモ

# 事前準備
* Virtual Boxのインストール: https://www.virtualbox.org/
* Vagrantのインストール: https://www.vagrantup.com/
* Vagrantの基本コマンド

```
vagrant box add <BOX_NAME> <URL>  # boxの追加
vagrant box remove <BOX_NAME>     # boxの削除
vagrant box list                  # boxのリスト
vagrant init <BOX_NAME>           # boxから仮想マシンを初期化（VagrantFile作成）
vagrant up                        # 仮想マシンの起動
vagrant status                    # 仮想マシンの状態確認
vagrant halt                      # 仮想マシンの停止
vagrant destroy                   # 仮想マシンの削除
vagrant ssh                       # 仮想マシンにSSHでログイン
```

* Vagrant box
    * box search page(official): https://atlas.hashicorp.com/boxes/search
    * box url list: http://www.vagrantbox.es/

# 仮想マシンの作成
仮想マシン用のディレクトリを作成し、仮想マシンを初期化(Vagrantfile作成)

```
$ mkdir test
$ cd test
$ vagrant init
```

Vagrantfileの編集

```:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "nrel/CentOS-6.5-x86_64"
  config.vm.hostname = "test"

  config.vm.provider "virtualbox" do |vb|
    vb.name = "test"
    vb.memory = "2048"
  end
end
```

仮想マシン起動、SSHログイン

```
$ vagrant up
$ vagrant ssh
```

# OS基本設定
アップデート

```
$ sudo yum check-update
$ sudo yum -y update
```

不要サービス無効化

```
$ sudo chkconfig iscsi off
$ sudo chkconfig iscsid off
$ sudo chkconfig iptables off
$ sudo chkconfig ip6tables off
$ sudo chkconfig mdmonitor off
$ sudo chkconfig netfs off
$ sudo chkconfig nfslock off
$ sudo chkconfig postfix off
$ sudo chkconfig udev-post off
```

# 時刻設定
ハードウェアクロックの設定

```
$ echo 'zone="Japan"' > ./tmp_clock
$ sudo mv ./tmp_clock /etc/sysconfig/clock
```
タイムゾーンをJSTに変更

```
$ sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
```

ntpdインストール

```
$ sudo yum install ntp
```

ntp.nict.jpに同期するよう設定

```bash:/etc/ntp.conf
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp.nict.jp iburst
```

いったん同期

```
$ sudo ntpdate ntp.nict.jp
```

サービス起動

```
$ sudo service ntpd start
```

状態確認（*がついていればOK）

```
$ sudo ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp-b3.nict.go. .NICT.           1 u    2   64    1   39.534   68.611   0.000
```

自動起動設定

```
$ sudo chkconfig ntpd on
```

# ツールのインストール
screen

```
$ sudo yum install screen
```

git

```
$ sudo yum install git
```

# EPEL
epel-releaseというパッケージをインストールすると、拡張パッケージがインストールできるようになる。以下で最新版を確認して使用する。
http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/repoview/epel-release.html

```
$ wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum localinstall epel-release-6-8.noarch.rpm
```


# Java
OracleのJDKを入れたほうがいいという風潮があるようなので個別に入れる
Oracleのダウンロードページでは"Accept License Agreement"にチェックしないとダウンロードできないので、いったんローカルにダウンロードしてvagrantの仮想マシンとの共有フォルダに配置する

Oracle ダウンロードページ
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Linux x64向けRPMを取得（今回は jdk-8u60-linux-x64.rpm）

ホストマシンでvagrantの共有フォルダにダウンロードしたRPMを配置
（デフォルトではホストマシンでVagrantfileを格納しているディレクトリが仮想マシンの/vagrantとして共有されている）

仮想マシン上でrpmパッケージをインストール

```
$ sudo yum localinstall /vagrant/share/jdk-8u60-linux-x64.rpm 
```

確認

```
$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
```

# Scala
CentOSのレポジトリに含まれていないので、公式サイトからrpmをダウンロードしてインストールする
http://www.scala-lang.org/index.html

```
$ wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.rpm
$ sudo yum localinstall scala-2.11.7.rpm
```

sbtは以下のページを参考にyumのレポジトリファイルを追加してインストール
http://www.scala-sbt.org/0.13/tutorial/Installing-sbt-on-Linux.html

```
$ curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo
$ sudo mv bintray-sbt-rpm.repo /etc/yum.repos.d/
$ sudo yum install sbt
```

```bash:/etc/yum.repos.d/bintray-sbt-rpm.repo
#bintray--sbt-rpm - packages by  from Bintray
[bintray--sbt-rpm]
name=bintray--sbt-rpm
baseurl=http://dl.bintray.com/sbt/rpm
gpgcheck=0
enabled=1
```

sbtの依存関係でopenjdkのjava(java-1.6.0-openjdk.x86_64)がインストールされてしまうので、alternativesでOracleのjavaが設定されていることを確認しておく

```
$ alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/java/jdk1.8.0_60/jre/bin/java
   2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
```

確認

```
$ scala -version
Scala code runner version 2.11.7 -- Copyright 2002-2013, LAMP/EPFL
```

# Python
CentOS6.5にはpython2.6が入っている。2.7以降は別途個別にインストールする必要があるのでいったんそのまま使う。

```
$ python --version
Python 2.6.6
```

pip
EPELからインストール

```
$ sudo yum install python-pip
```

# R

R本体
EPELからインストール

```
$ sudo yum install R
```

R Studio Server
RPMパッケージをダウンロードしてローカルインストール

```
$ wget https://download2.rstudio.org/rstudio-server-rhel-0.99.484-x86_64.rpm
$ sudo yum localinstall rstudio-server-rhel-0.99.484-x86_64.rpm
```

ポートフォワード設定 ※ホスト側で作業
Vagrantfile編集

```sh:Vagrantfile
# R Studio Server
config.vm.network "forwarded_port", guest: 8787, host: 8787
```

仮想マシンを再起動

```
$ vagrant reload
```


# CDH
## Hadoop(擬似分散)
yumレポジトリ追加

```
$ wget http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/cloudera-cdh5.repo
$ sudo mv cloudera-cdh5.repo /etc/yum.repos.d/
```

hadoop（擬似分散モード）インストール

```
$ sudo yum install hadoop-conf-pseudo
```

hdfsフォーマット

```
$ sudo su - hdfs
$ hdfs namenode -format
$ exit
```

hdfs起動

```
for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done
```

hdfs初期設定スクリプト実行

```
$ sudo /usr/lib/hadoop/libexec/init-hdfs.sh 
```

ファイルディスクリプタ:数の上限を増やす

```:/etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
```


## Hive
hiveインストール

```
$ sudo yum install hive
```

metastore関連パッケージインストール

```
$ sudo yum install hive-metastore mysql-server mysql-connector-java
```

hive metastoreをmysqlに設定([参考](http://edpflager.com/?p=2003))

```
$ sudo -u hive hdfs dfs -mkdir /user/hive/warehouse
$ sudo -u hive hdfs dfs -chmod 1777 /user/hive/warehouse
```
```
$ sudo cp /usr/share/java/mysql-connector-java.jar /usr/lib/hive/lib/.
$ sudo service mysqld start
$ sudo chkconfig mysqld on
```
```
$ sudo /usr/bin/mysql_secure_installation
Enter current password for root (enter for none):  <- 空のままENTER
Set root password? [Y/n] y
New password:                          <- mysqlのrootユーザのパスワード
Re-enter new password:                 <- 同上
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
```
```
$ cd /usr/lib/hive/scripts/metastore/upgrade/mysql
$ mysql -u root -p
mysql> create database metastore;
mysql> use metastore;
mysql> source hive-schema-1.1.0.mysql.sql;
mysql> create user 'hive'@'localhost' identified by 'mypassword';
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hive'@'localhost';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,LOCK TABLES,EXECUTE ON metastore.* TO 'hive'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit;
```
```
$ sudo vi /usr/lib/hive/conf/hive-site.xml
```
```xml:hive-site.xml
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value>
  <description>the URL of the MySQL database</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
</property>

<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hive</value>
</property>

<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>mypassword</value>
</property>
```

hive-server2インストール

```
$ sudo yum install hive-server2
```

beeline使い方

```
$ beeline
beeline> !connect jdbc:hive2://localhost:10000
scan complete in 3ms
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: user
Enter password for jdbc:hive2://localhost:10000: pass
Connected to: Apache Hive (version 1.1.0-cdh5.4.7)
Driver: Hive JDBC (version 1.1.0-cdh5.4.7)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
+----------------+--+
1 row selected (0.213 seconds)
0: jdbc:hive2://localhost:10000> !quit
$ 
```
## Spark
Sparkインストール

```
$ sudo yum install spark-core
$ sudo yum install spark-master
$ sudo yum install spark-worker
$ sudo yum install spark-history-server
$ sudo yum install spark-python
```

Sparkログレベル変更

```
$ sudo cp -p /etc/spark/conf/log4j.properties.template /etc/spark/conf/log4j.properties
```

```bash:/etc/spark/conf/log4j.properties
#log4j.rootCategory=INFO, console
log4j.rootCategory=WARN, console
```

## HBase
```
$ sudo yum install hbase
```

## Mahout
```
$ sudo yum install mahout
```

# Hue
```
$ sudo yum install hue
```

## 再起動
ポートフォワード設定 ※ホスト側で作業
Vagrantfile編集

```sh:Vagrantfile
  # YARN ResourceManager, NodeManager
  config.vm.network "forwarded_port", guest: 8088, host: 8088
  config.vm.network "forwarded_port", guest: 50060, host: 50060

  # HDFS NameNode, DataNode
  config.vm.network "forwarded_port", guest: 50070, host: 50070
  config.vm.network "forwarded_port", guest: 50075, host: 50075

  # Spark Master, Worker, Driver, HistoryServer
  config.vm.network "forwarded_port", guest: 8080, host: 8080
  config.vm.network "forwarded_port", guest: 8081, host: 8081
  config.vm.network "forwarded_port", guest: 4040, host: 4040
  config.vm.network "forwarded_port", guest: 18080, host: 18080

  # Hue
  config.vm.network "forwarded_port", guest: 8888, host: 8888
```

仮想マシンを再起動

```
$ vagrant reload
```

# box化
vagrantで再利用可能なboxファイルを作成しておく。

※仮想マシン上で作業

```
$ sudo yum clean all
$ exit
```

※ホストOS側で作業

```
$ vagrant halt
$ vagrant package --output test_cdh5.box
```

# boxの利用方法

vagrantにboxを追加

```
$ vagrant add test_cdh5 test_cdh5.box
```

仮想マシン用のディレクトリを作成して初期化

```
$ mkdir test_cdh5
$ cd test_cdh5
$ vagrant init
```

Vagrantfileを編集

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  # boxの指定
  config.vm.box = "tlab_cdh5"

  # hostnameの指定
  config.vm.hostname = "test2"

  # ポートフォワードの指定
  ## R Studio Server
  config.vm.network "forwarded_port", guest: 8787, host: 8787

  ## YARN ResourceManager, NodeManager
  config.vm.network "forwarded_port", guest: 8088, host: 8088
  config.vm.network "forwarded_port", guest: 50060, host: 50060

  ## HDFS NameNode, DataNode
  config.vm.network "forwarded_port", guest: 50070, host: 50070
  config.vm.network "forwarded_port", guest: 50075, host: 50075

  ## Spark Master, Worker, Driver, HistoryServer
  config.vm.network "forwarded_port", guest: 8080, host: 8080
  config.vm.network "forwarded_port", guest: 8081, host: 8081
  config.vm.network "forwarded_port", guest: 4040, host: 4040
  config.vm.network "forwarded_port", guest: 18080, host: 18080

  ## Hue
  config.vm.network "forwarded_port", guest: 8888, host: 8888

  # Virtualboxの設定
  config.vm.provider "virtualbox" do |vb|
    vb.name = "test2"
    vb.memory = "2048"
  end
end
```

仮想マシンの起動（初回起動時に仮想マシン作成）

```
$ vagrant up
```

SSHログイン

```
$ vagrant ssh
```

仮想マシン上で作業

```
[vagrant@test2 ~]$
```