Chefで構築するHadoop環境


# 環境

- Mac OSX Mavericks
- Vagrant 1.6.3 (box: chef/centos-6.5)
- Chef-solo 11.14.0.alpha.4
- jdk: jdk-8u5-linux-x64
- hadoop: 0.18.3-14.cloudera.CH0_3(stable?)

# Hadoop導入の流れ

1. JDKをインストールする
2. Hadoopをインストールする
3. 試験する

今回は、chefを使用して1.と2.を実現します。3.は、Hadoopインストール時にサンプルとして導入されるプログラムをHadoop上で動かしてみます。

# レシピ

## レシピの中身

```ruby:recipes/default.rb
#
# making environment for hadoop
#

# 1. JDKをインストールする
jdk_file_name="jdk-8u5-linux-x64"

execute "download_jdk" do
	user "vagrant"
	group "vagrant"
	cwd "/home/vagrant"
	command "wget --no-check-certificate --no-cookies --header 'Cookie: oraclelicense=accept-securebackup-cookie' http://download.oracle.com/otn-pub/java/jdk/8u5-b13/#{jdk_file_name}.rpm -O #{jdk_file_name}.rpm"
	not_if { ::File.exists?("/home/vagrant/#{jdk_file_name}.rpm") }
end

package "install_jdk" do
	source "/home/vagrant/#{jdk_file_name}.rpm"
	provider Chef::Provider::Package::Rpm
	action :install
end

# 2. Hadoopをインストールする
execute "add_repo_for_cloudera" do
	user "root"
	group "root"
	command "wget http://archive-primary.cloudera.com/redhat/cdh/cloudera-stable.repo -O /etc/yum.repos.d/cloudera-stable.repo"
	not_if { ::File.exists?("/etc/yum.repos.d/cloudera-stable.repo") }
end

%w(
	hadoop
	hadoop-conf-pseudo
).each do |package_name|
	package package_name do
		action :install
	end
end

%w(
	hadoop-datanode
	hadoop-jobtracker
	hadoop-namenode
	hadoop-secondarynamenode
	hadoop-tasktracker
).each do |service_name|
	service service_name do
		action [ :enable, :start ]
		supports :start => true, :stop => true, :restart => true
	end
end
```

##　ポイント

- JDKをダウンロードする際には、ライセンス条項への同意が必要となるので、`wget`の引数に`--header 'Cookie: oraclelicense=accept-securebackup-cookie'`を与える必要がある
- JDKのダウンロードと、Clouderaのレポジトリファイルを追加する際には`not_if`を使用してべき等性を確保する

# インストール後の動作確認

インストールが上手くいっているかの確認をするために、サンプルプログラムをHadoop上で動作させてみます。

```bash:terminal
[vagrant@localhost ~]$ hadoop jar /usr/lib/hadoop/hadoop-0.18.3-14.cloudera.CH0_3-test.jar mrbench
MRBenchmark.0.0.2
14/07/05 12:50:07 INFO mapred.MRBench: creating control file: 1 numLines, ASCENDING sortOrder
14/07/05 12:50:07 INFO mapred.MRBench: created control file: /benchmarks/MRBench/mr_input/input_475033013.txt
14/07/05 12:50:07 INFO mapred.MRBench: Running job 0: input=hdfs://localhost/benchmarks/MRBench/mr_input output=hdfs://localhost/benchmarks/MRBench/mr_output/output_-320582194
14/07/05 12:50:07 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/07/05 12:50:07 INFO mapred.FileInputFormat: Total input paths to process : 1
14/07/05 12:50:07 INFO mapred.FileInputFormat: Total input paths to process : 1
14/07/05 12:50:08 INFO mapred.JobClient: Running job: job_201407051248_0001
14/07/05 12:50:09 INFO mapred.JobClient:  map 0% reduce 0%
14/07/05 12:50:18 INFO mapred.JobClient:  map 100% reduce 0%
14/07/05 12:50:23 INFO mapred.JobClient: Job complete: job_201407051248_0001
14/07/05 12:50:23 INFO mapred.JobClient: Counters: 16
14/07/05 12:50:23 INFO mapred.JobClient:   Map-Reduce Framework
14/07/05 12:50:23 INFO mapred.JobClient:     Combine output records=0
14/07/05 12:50:23 INFO mapred.JobClient:     Reduce input records=1
14/07/05 12:50:23 INFO mapred.JobClient:     Reduce output records=1
14/07/05 12:50:23 INFO mapred.JobClient:     Map input records=1
14/07/05 12:50:23 INFO mapred.JobClient:     Map output records=1
14/07/05 12:50:23 INFO mapred.JobClient:     Map output bytes=5
14/07/05 12:50:23 INFO mapred.JobClient:     Combine input records=0
14/07/05 12:50:23 INFO mapred.JobClient:     Map input bytes=2
14/07/05 12:50:23 INFO mapred.JobClient:     Reduce input groups=1
14/07/05 12:50:23 INFO mapred.JobClient:   File Systems
14/07/05 12:50:23 INFO mapred.JobClient:     HDFS bytes written=3
14/07/05 12:50:23 INFO mapred.JobClient:     Local bytes written=128
14/07/05 12:50:23 INFO mapred.JobClient:     HDFS bytes read=4
14/07/05 12:50:23 INFO mapred.JobClient:     Local bytes read=21
14/07/05 12:50:23 INFO mapred.JobClient:   Job Counters
14/07/05 12:50:23 INFO mapred.JobClient:     Launched map tasks=2
14/07/05 12:50:23 INFO mapred.JobClient:     Launched reduce tasks=1
14/07/05 12:50:23 INFO mapred.JobClient:     Data-local map tasks=2
DataLines	Maps	Reduces	AvgTime (milliseconds)
1		2	1	16407
```

うまく動作してるっぽいです。

# 今後に向けて

- Jenkins等を使ってインフラ試験も自動化したい
- Vagrantで複数ノード立ちあげて、本当の同時並列処理を試してみたい