White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

Hadoop on docker 前編

後半書きました( Hadoop on docker 後編 - White scenery @showyou, hatena )

書き忘れていましたが、この記事

Spark, SQL on Hadoop etc. Advent Calendar 2014 - Qiita の23日目になります。

 

はじめはPivotal社の商用SQL on HadoopであるHAWQの話でもしようかと思いましたが、先日掲載したスライドに大体書いているので読んで頂ければと思います。
今回はHadoop on Dockerについてでも話します。

最近はHadoopを動かすのにdockerを使う動きが出ています。

dockerで組み上げるメリットとしては、
1. VMに比べると速度が速い(と考えられる)
2. 各社配布しているVMと違いDockerfile辺りを見れば何やってるか理解できる
3. imageを管理すれば独自カスタマイズしたノードを容易に複製できる
等のメリットがあります。

実際日本ではあまり話が出てこないですが、sequenceiq(*1)(*2)とかferry(*3)とかプロジェクトが出てきています。
(*1)http://blog.sequenceiq.com/blog/2014/04/04/hadoop-docker-introduction/
(*2)http://blog.sequenceiq.com/blog/2014/12/02/hadoop-2-6-0-docker/
(*3)http://ferry.opencore.io/en/latest/

もちろんベアメタルにガチガチで作るのに比べると速度は多少低下します。随時Hadoop基盤を置いて共有ストレージとして使ってる環境には向かないと考えています。ただし一時的に大規模な計算ノードが必要になった場合には威力を発揮するでしょう。

 

ここでは最近出たHadoop 2.6のイメージをビルドする話をしていきます。

まずdockerコンテナのソースを入手して、ビルドします。
ここでgitdirはgitのソースを置くリポジトリとします。別に任意の名前で構いません。

gitdir$ git clone https://github.com/sequenceiq/hadoop-docker.git
gitdir$ cd hadoop-docker
gitdir/hadoop-docker$ docker build -t showyou/hadoop-docker:2.6.0 .

$ docker build -t showyou/hadoop-docker:2.6.0 .
Uploading context 214 kB
Uploading context
Step 0 : FROM sequenceiq/pam:centos-6.5
Pulling repository sequenceiq/pam
7b5528f018cf: Download complete
89b52f216c6c: Download complete
0dd5f7a357f5: Download complete
ae2537991743: Download complete
b38f87063c35: Download complete
36bf8ea12ad2: Download complete
c605a0ffb1d4: Download complete
0bd9464ce7fd: Download complete
---> 7b5528f018cf
Step 1 : MAINTAINER SequenceIQ
---> Using cache
---> 461f4086bb21
Step 2 : USER root
---> Running in fd63870d472f
---> e8c116080601
Step 3 : RUN yum install -y curl which tar sudo openssh-server openssh-clients rsync
---> Running in aab6affb5030
Loaded plugins: fastestmirror, keys, protect-packages, protectbase
Determining fastest mirrors
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
0 packages excluded due to repository protections
Setting up Install Process
Package 2:tar-1.23-11.el6.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package curl.x86_64 0:7.19.7-37.el6_4 will be updated
(以下省略)

勝手にrpmとか落としてインストールしてくれます。中で何やってるかはDockerfileを見て貰えればわかるかと。

また、次のコマンドでhadoop コンテナを立ち上げます。

docker run -i -t showyou/hadoop-docker:2.6.0 /etc/bootstrap.sh -bash
/hadoop-docker$ docker run -i -t showyou/hadoop-docker:2.6.0 /etc/bootstrap.sh -bash

Starting sshd: [ OK ]
Starting namenodes on [2e6612174160]
2e6612174160: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-2e6612174160.out
localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-2e6612174160.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-root-secondarynamenode-2e6612174160.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn--resourcemanager-2e6612174160.out
localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-2e6612174160.out
bash-4.1#

更にHadoopのサンプルjarファイルを実行して動かしてみます。

bash-4.1# cd $HADOOP_PREFIX
bash-4.1# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
14/12/20 18:26:04 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
14/12/20 18:26:04 WARN mapreduce.JobSubmitter: No job jar file set. User classes may not be found. See Job or Job#setJar(String).
14/12/20 18:26:04 INFO input.FileInputFormat: Total input paths to process : 31
14/12/20 18:26:05 INFO mapreduce.JobSubmitter: number of splits:31
14/12/20 18:26:05 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1419117382790_0001
14/12/20 18:26:05 INFO mapred.YARNRunner: Job jar is not present. Not adding any jar to the list of resources.
14/12/20 18:26:05 INFO impl.YarnClientImpl: Submitted application application_1419117382790_0001
14/12/20 18:26:06 INFO mapreduce.Job: The url to track the job: http://2e6612174160:8088/proxy/application_1419117382790_0001/
14/12/20 18:26:06 INFO mapreduce.Job: Running job: job_1419117382790_0001
14/12/20 18:26:11 INFO mapreduce.Job: Job job_1419117382790_0001 running in uber mode : false
14/12/20 18:26:11 INFO mapreduce.Job: map 0% reduce 0%
14/12/20 18:26:18 INFO mapreduce.Job: map 10% reduce 0%
...

bash-4.1# bin/hdfs dfs -cat output/*
6 dfs.audit.logger
4 dfs.class
3 dfs.server.namenode.
2 dfs.period
2 dfs.audit.log.maxfilesize
2 dfs.audit.log.maxbackupindex
1 dfsmetrics.log
1 dfsadmin
1 dfs.servers
1 dfs.replication
1 dfs.file

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar pi 4 100
Number of Maps = 4
Samples per Map = 100
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Starting Job
14/12/20 18:30:43 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
14/12/20 18:30:43 INFO input.FileInputFormat: Total input paths to process : 4
(中略)
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=472
File Output Format Counters
Bytes Written=97
Job Finished in 16.146 seconds
Estimated value of Pi is 3.17000000000000000000

ctrl+Dとかでbashを抜けるとcontainerも自動的に止まります。戻る場合はdocker ps -aしてdocker start <ID>でも実行してください。

containerを消したくなったら、

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e6612174160 showyou/hadoop-docker:2.6.0 /etc/bootstrap.sh -b 47 minutes ago Exited (0) 18 seconds ago compassionate_bohr
...
$ docker rm 2e6612174160

で消えます。

 

次にferryを使ってみます。
なんか2014/12/23時点のferryはdockerの1.2.0以降が必要で、Ubuntu 14.04だとアウトなのでdocker社の最新入れます。https://docs.docker.com/installation/ubuntulinux/の「Docker-maintained Package Installation」に書かれてるものを実行してください。

ferryはpythonのパッケージ管理システムpipをインストールしておく必要があります。
sudo apt-get install python-pip(Ubuntu)なりsudo yum install python-pip(CentOS)なり実行しておいてください。Ubuntu14.04のpipはバグがあった気もするので、その場合はeasy_install経由で入れてみてください。
まずferryを入れます。

$ sudo pip install -U ferry
$ sudo ferry install
$ sudo ferry server

いろいろdocker イメージを落としてくるので容量を食うので注意して下さい。


インストールし終えたら、セットアップ用のyamlを作ります。

backend:
- storage:
personality: "hadoop"
instances: 2
layers:
- "hive"connectors:
- personality: "hadoop-client"

これで
$ ferry start hadoop
とやるとhadoopクラスタが起動するはずです。"はず"って書いてるのは手元の環境では"com error, trying again..."とか出ている為です。

 

今回は他のところにあるdockerイメージをビルドして使うのにとどまりました。
後半は初めに使ったsequenceiq/hadoop-dockerをいじって、2nodeにインストールすることを考えます。
ここでは
1. Namenode / Resourcemanager
2. Datanode / Nodemanager
くらいに分けます。
この構成で2のイメージを複数箇所でボンボン立てれば、性能はともかく大量のHadoopノードを作ることができます。NamenodeHA化しろよって感じですが、それは省くんで誰かやってください。

 

また、この辺りを作るのもダルい、Hadoopを社内サービス化として管理できないか? ・・といった話に対しては、Pivotal Cloud Foundry + Pivotal HD on PCFをお使いください(宣伝)。