Hadoop を 30 分で試す
ややチート気味ですが Hadoop を 30 分で試すことができたのでお知らせします。
経緯
先日のブログ に書いた通り、Cloudera QuickStart VM はとても便利なのですが、メモリをめちゃくちゃ喰うので一般的なご家庭にあるスペックのマシンではまともに動きません。
なんでそんなにメモリを喰うかと言うと、おそらく Hive やら何やらごっちゃり入っているからで、とりあえず MapReduce を動かしてみたいだけの人には、少々オーバースペックである感が否めません。
お仕着せの環境が肌に合わないからと言って自分で環境をこしらえようにも、初心者に疑似分散とか YARN とか言われてもどうしていいか分かりませんし、Oracle JDK のインストールが地味に面倒です。
このような実情を身に染みて感じたので、以下の内容を参考に Cent OS 上に疑似分散モードの YARN 環境を作る Ansible Playbook を書いて Ansible Galaxy にアップロードしてみました。
ご用意頂くもの
- メモリ 4GB 程度のマシン
- VirtualBox
- Vagrant
- Cent OS 6.4
一般的なご家庭に Linux 物理マシンなどあるわけがないので、以下では仮想マシンを使用します。
また、VirtualBox や Vagrant, Cent OS の box などを用意済みとしている点に若干キユーピー 3 分クッキング的な突っ込みどころを感じますが、意識の高いエンジニアであれば、これくらいの備えは常識の範囲内としても差し支えないでしょう。
手順
以下、実施する手順を掛かる時間の目安と併せて紹介します。
Mac OS で動かした際のログを紹介していますが、Windows でも動くと思います。プロキシの配慮は省略しているので、企業 LAN 内などで試す際はがんばってください。
仮想マシンの用意 (5 分)
適当なディレクトリを掘って Vagrant 仮想マシンを初期化します。box の名前は自身の環境に合わせて読み替えてください。
$ mkdir cdh5; cd cdh5 $ vagrant box list CentOS-6.4-x86_64 (virtualbox, 0) (snip) $ vagrant init CentOS-6.4-x86_64
Vagarnt が仮想マシンに割り当てるメモリ容量はデフォルトで 480 MB で、さすがにこれでは MapReduce が動きません。Vagrantfile には 1024 MB を割り当てる設定例が記載されているので、コメントアウトを外して設定を有効にします。
$ vi Vagrantfile $ grep -A 1 -B 9 modifyvm Vagrantfile # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # config.vm.provider "virtualbox" do |vb| # # Don't boot with headless mode # vb.gui = true # # Use VBoxManage to customize the VM. For example to change memory: vb.customize ["modifyvm", :id, "--memory", "1024"] end
設定が済んだら仮想マシンを起動します。2, 3 分あれば起動すると思います。
$ vagrant up (snip) ==> default: Machine booted and ready! ==> default: Checking for guest additions in VM... ==> default: Configuring and enabling network interfaces... ==> default: Mounting shared folders... default: /vagrant => /Users/garbagetown/dev/vagrants/cdh5
仮想マシンが起動したらログインしましょう。以降の手順はすべて Cent OS 上で実施します。
$ vagrant ssh Welcome to your Vagrant-built virtual machine.
Ansible のインストール (3 分)
残念なことに Ansible は Cent OS の標準リポジトリには含まれていないので、EPEL リポジトリを追加します。
[vagrant@localhost ~]$ sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm (snip) 1:epel-release ########################################### [100%]
詳細を理解していないのですが、このままだと Ansible のインストールに失敗するので baseurl と mirrorlist のコメントを入れ替えます。
[vagrant@localhost ~]$ sudo vi /etc/yum.repos.d/epel.repo [vagrant@localhost ~]$ sudo grep -n fedora /etc/yum.repos.d/epel.repo 3:baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch 4:#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch 12:baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch/debug 13:#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-6&arch=$basearch 21:baseurl=http://download.fedoraproject.org/pub/epel/6/SRPMS 22:#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-6&arch=$basearch
Ansible をインストールします。2, 3 分あればインストールできると思います。
[vagrant@localhost ~]$ sudo yum -y install ansible (snip) Installed: ansible.noarch 0:1.8.2-3.el6 Dependency Installed: PyYAML.x86_64 0:3.10-3.1.el6 libyaml.x86_64 0:0.1.3-4.el6_6 python-babel.noarch 0:0.9.4-5.1.el6 python-crypto.x86_64 0:2.0.1-22.el6 python-crypto2.6.x86_64 0:2.6.1-1.el6 python-httplib2.noarch 0:0.7.7-1.el6 python-jinja2.x86_64 0:2.2.1-2.el6_5 python-keyczar.noarch 0:0.71c-1.el6 python-paramiko.noarch 0:1.7.5-2.1.el6 python-pyasn1.noarch 0:0.0.12a-1.el6 python-setuptools.noarch 0:0.6.10-3.el6 python-simplejson.x86_64 0:2.0.9-3.1.el6 Complete!
CDH のインストール (20 分)
いよいよ CDH をインストールします。
と言っても、時間は掛かりますが手順は単純です。まず、ansible-galaxy
コマンドを使って playbook をダウンロードします。2, 3 分かかると思います。
[vagrant@localhost ~]$ sudo ansible-galaxy install garbagetown.cdh5_yarn_pseudo - downloading role 'cdh5_yarn_pseudo', owned by garbagetown - downloading role from https://github.com/garbagetown/cdh5_yarn_pseudo/archive/master.tar.gz - extracting garbagetown.cdh5_yarn_pseudo to /etc/ansible/roles/garbagetown.cdh5_yarn_pseudo - garbagetown.cdh5_yarn_pseudo was installed successfully - adding dependency: williamyeh.oracle-java - downloading role 'oracle-java', owned by williamyeh - downloading role from https://github.com/William-Yeh/ansible-oracle-java/archive/master.tar.gz - extracting williamyeh.oracle-java to /etc/ansible/roles/williamyeh.oracle-java - williamyeh.oracle-java was installed successfully
Ansible Galaxy の依存性解決の機能で Oracle JDK をインストールする playbook も落ちてきているのが分かると思います。便利ですね。
続いて localhost に対してプロビジョニングを行う playbook を書きます。CDH 5 は今のところ Oralce JDK 7 でないと動かないので、変数で指定します。
[vagrant@localhost ~]$ vi main.yml [vagrant@localhost ~]$ cat main.yml - hosts: 127.0.0.1 connection: local roles: - garbagetown.cdh5_yarn_pseudo vars: - java_version: 7
あとはこの playbook を実行するだけです。pycrypto に関する警告が出ますが、ひとまず無視してください。
JDK と CDH5 のインストール、Hadoop 周りのディレクトリ作成に少し時間が掛かりますが、15 分くらいで完了すると思います。
[vagrant@localhost ~]$ ansible-playbook main.yml [WARNING]: The version of gmp you have installed has a known issue regarding timing vulnerabilities when used with pycrypto. If possible, you should update it (i.e. yum update gmp). PLAY [127.0.0.1] ************************************************************** GATHERING FACTS *************************************************************** ok: [127.0.0.1] (snip) TASK: [williamyeh.oracle-java | get JDK 1.7 tarball (as RPM file)] ************ changed: [127.0.0.1] (snip) TASK: [garbagetown.cdh5_yarn_pseudo | Install CDH 5 with YARN on a Single Linux Node in Pseudo-distributed mode] *** changed: [127.0.0.1] (snip) TASK: [garbagetown.cdh5_yarn_pseudo | Create the directories needed for Hadoop processes] *** changed: [127.0.0.1] TASK: [garbagetown.cdh5_yarn_pseudo | Start YARN] ***************************** changed: [127.0.0.1] => (item=hadoop-yarn-resourcemanager) changed: [127.0.0.1] => (item=hadoop-yarn-nodemanager) changed: [127.0.0.1] => (item=hadoop-mapreduce-historyserver) PLAY RECAP ******************************************************************** 127.0.0.1 : ok=17 changed=15 unreachable=0 failed=0
サンプルの実行 (5分)
以上で疑似分散モードの YARN 環境ができたので、Installing CDH 5 with YARN on a Single Linux Node in Pseudo-distributed mode の "Running an example application with YARN" に従ってサンプルアプリケーションを実行してみましょう。
まず、HDFS 上にログインユーザがジョブを実行するためのディレクトリを作って権限を与えます。
[vagrant@localhost ~]$ sudo -u hdfs hadoop fs -mkdir /user/$USER [vagrant@localhost ~]$ sudo -u hdfs hadoop fs -chown $USER /user/$USER
続いて、サンプルアプリケーションで grep するために、ローカルファイルシステムから HDFS 上に適当なファイルをコピーします。ここでは Hadoop の設定ファイルを HDFS 上に put しています。
[vagrant@localhost ~]$ hadoop fs -mkdir input [vagrant@localhost ~]$ hadoop fs -put /etc/hadoop/conf/*.xml input
最後に、環境変数を設定してサンプルアプリケーションを実行します。
[vagrant@localhost ~]$ export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce [vagrant@localhost ~]$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar grep input output23 'dfs[a-z.]+' (snip) 15/02/22 13:51:39 INFO mapreduce.Job: map 0% reduce 0% 15/02/22 13:51:56 INFO mapreduce.Job: map 100% reduce 0% 15/02/22 13:52:18 INFO mapreduce.Job: map 100% reduce 100% 15/02/22 13:52:20 INFO mapreduce.Job: Job job_1424612668205_0002 completed successfully 15/02/22 13:52:20 INFO mapreduce.Job: Counters: 49 (snip) File Output Format Counters Bytes Written=244
MapReduce ジョブが終わってログがずらっと出たら、出力結果を確認します。
[vagrant@localhost ~]$ hadoop fs -ls output23 Found 2 items -rw-r--r-- 1 vagrant supergroup 0 2015-02-22 13:52 output23/_SUCCESS -rw-r--r-- 1 vagrant supergroup 244 2015-02-22 13:52 output23/part-r-00000 [vagrant@localhost ~]$ hadoop fs -cat output23/part-r-00000 1 dfs.safemode.min.datanodes 1 dfs.safemode.extension 1 dfs.replication 1 dfs.namenode.name.dir 1 dfs.namenode.checkpoint.dir 1 dfs.domain.socket.path 1 dfs.datanode.hdfs 1 dfs.datanode.data.dir 1 dfs.client.read.shortcircuit 1 dfs.client.file
HDFS 上にコピーした Hadoop の設定ファイルから、サンプルアプリケーションに渡した正規表現に合致する文字列を grep できていることが分かります。
まとめ
- Cloudera の QuickStart VM は、とても便利だが、一般的なご家庭にあるマシンでは動かすのは厳しい
- Cloudera の Quick Start Guide は、とても丁寧に書かれているが、動作モードや OS ごとに読むべき箇所が異なり、初心者が目的のドキュメントに辿り着くことは困難
- Hadoop を 30 分で試そうと思ったら Ansible にハマって三日くらい掛かったけど気にしない
- Ansible Galaxy の依存性解決は便利
以上です。