2012年02月28日

[hadoop][AWS] hadoopを始めてみる(7) 〜EC2×MapR×Eclipseで開発環境を作ってみる〜はてなブックマーク - [hadoop][AWS] hadoopを始めてみる(7) 〜EC2×MapR×Eclipseで開発環境を作ってみる〜

EC2上にMapRサーバが用意できたので、次はクライアントWindows上に開発環境を構築する。
まずは、王道でMapReduceをJavaで開発してみることにした。

JavaといえばEclipse!!!

ってことで、EC2×MapR×Eclipseで開発環境を作ってみることにした。
試行錯誤をした結果の手順をメモしておく。

@Javaのインストール


開発担当のWindows環境にJDKをインストールする。
MapRが中で持つhadoopが0.20.2なので、そのhadoopが動くJavaなら何でも良いと思うが、MapRの動作要件がJava SE 1.6.0_24以降なので、念のため、その要件は満たしておいた方が良いだろう。

AEclipseのダウンロード&解凍


依存関係が面倒なので、私はいつも日本語化されたAll in One Eclipseを使っている。
ここでも、以下からダウンロードして使うことにする。
http://mergedoc.sourceforge.jp/
なお、MapRに含まれるHadoop 0.20.2のプラグインは、Eclipse 3.7には対応していないので、
あえてEclipse 3.6のJava開発版をダウンロードして使うことにした。

Bプラグイン入手のためにHadoop本体のダウンロード


MapRにもHadoop 0.20.2は含まれているが、contribディレクトリ内に存在するはずの
Eclipseプラグインは消えている。
サポート対象外のものはパッケージンングしない方針なのだろう。

なので、Eclipseプラグイン入手のために、ApacheからApache Hadoopをダウンロードする。
Hadoopのダウンロードページには以下から遷移でき、
tarでまとめられている0.20.2のセットをダウンロードする。
http://www.apache.org/dyn/closer.cgi/hadoop/common/
近くのミラーサイトを選べば良いのだが、例えば、
http://ftp.jaist.ac.jp/pub/apache//hadoop/common/hadoop-0.20.2/
とか。

CEclipseプラグインの配置


ダウンロードした、hadoop-0.20.2.tar.gzを展開する。
解凍レンジ等のツールを使えば、Windowsでもtar.gzは問題なく解凍できる。

展開したものの中にある、
hadoop-0.20.2\contrib\eclipse-plugin\hadoop-0.20.2-eclipse-plugin.jar
を、Eclipseのプラグインフォルダである、
pleiades-e3.6-java_20110326\eclipse\plugins\
以下にコピーする。

Dプラグインの動作確認


Eclipseを起動後、
「ウインドウ」→「パースペクティブを開く」→「その他」
を選び、立ち上がったパースペクティブ一覧ウインドウに、以下のように「Map/Reduce」があればOK。
Eclipse_1.jpg

EHadoopインストールディレクトリの設定


Hadoopの展開フォルダをEclipseに設定する必要がある。
「ウインドウ」→「設定」
にて設定ウインドウを立ち上げ、↓のように、Cで展開したHadoopの場所を指定する。
Eclipse_2.jpg

FEclipseからHadoopクラスタへの接続


右下の象さんをクリックし、サーバ名とポートを指定してHadoopクラスタに接続する。

・・・が、ここで問題発生!

MapRでは、NameNode→CLDB、DFS→MFSに置き換わっているんだから、Eclipse-Pluginから接続する先が存在しないんじゃん!!!

念のため、50020ポートや50060ポートに接続を試みてみたが、繋がるはずもなくorz

とりあえず、Eclipse上でデバッグすることは断念・・・。

GMapReduceプロジェクトの作成


気を取り直して、Eclipse上からのデバックは諦め、JARを作って配布する方針に切り替えることにした。

まずは、新規作成から、MapReduceプロジェクトを作成する。

そして、そのプロジェクトのsrcに、BにてダウンロードしたHadoopに含まれている
サンプルプログラムを一つ、例えば、
hadoop-0.20.2\src\examples\org\apache\hadoop\examples\WordCount.java
をsrc以下にコピーする。

そして、エクスポートからjarを選択して保存する。

HJARを配布して実行


作成したJARをEC2上に転送する。
私は、自分のDropboxのpublicにJARを置いて、サーバからそれをwgetした。
JARの吐き出し先をDropBoxにしておけば、1ステップ減らせるのでこの方法は結構便利。

WinSCPを用いて、scpでサーバに送ることも試みたが、EC2の秘密鍵ファイルを
Putty系の鍵ファイルに変換する必要があったので、面倒なので断念。
(EC2とのファイルのやりとり方法は、ちゃんとブログに起こそうかな・・・。)

サーバ上にJARを転送できたなら、以下のように実行してみる。
(クラスパッケージは変更してある)
[root@hadoop01 ~]# hadoop dfs -copyFromLocal test.txt /sample/test.txt

[root@hadoop01 ~]# hadoop dfs -ls /sample
Found 1 items
-rwxrwxrwx 3 root root 158 2012-02-06 01:38 /sample/test.txt

[root@hadoop01 ~]# hadoop jar test.jar t.horumon.WordCount /sample/test.txt /sample_out
12/02/28 01:36:25 INFO fs.JobTrackerWatcher: Current running JobTracker is: hadoop01/xxx.xxx.xxx.xxx:9001
12/02/28 01:36:25 INFO input.FileInputFormat: Total input paths to process : 1
12/02/28 01:36:25 WARN snappy.LoadSnappy: Snappy native library is not available
12/02/28 01:36:25 INFO util.NativeCodeLoader: Loaded the native-hadoop library
12/02/28 01:36:25 WARN snappy.LoadSnappy: Snappy native library not loaded
12/02/28 01:36:26 INFO mapred.JobClient: Running job: job_201202280129_0001
12/02/28 01:36:27 INFO mapred.JobClient: map 0% reduce 0%
12/02/28 01:36:49 INFO mapred.JobClient: map 100% reduce 0%
12/02/28 01:36:57 INFO mapred.JobClient: map 100% reduce 100%
12/02/28 01:37:01 INFO mapred.JobClient: Job complete: job_201202280129_0001
  ・・・

うむ、Eclipseでコンパイルしたものが、MapRでも普通に動くことが確認できた!

JARにしなければいけないので多少は面倒だが、これでMapR用のプログラムも開発できる!
posted by ほるもん at 22:05 | Comment(0) | TrackBack(0) | hadoop | このブログの読者になる | 更新情報をチェックする

2012年02月21日

[hadoop][AWS] hadoopを始めてみる(6) 〜EC2に固定IPを振ってみる〜はてなブックマーク - [hadoop][AWS] hadoopを始めてみる(6) 〜EC2に固定IPを振ってみる〜

私は、遊ばないときはEC2インスタンスをstopさせている。
もちろん、40$/hをケチってだが・・・。

しかし、stopさせる毎にインスタンスのIPはリセットされてしまう。
IPをリセットされると、
・hostsファイルを書きかえる必要がある
・管理コンソール画面、JobTracker画面のURLブックマークを変更する必要がある
と、多少面倒くさい。

なので、EC2インスタンスのIPを固定させることにしたので、
その手順をメモしておく。


Management Consoleから、「Elastic IPs」を選択。
「Allocate New Address」をクリックする。
EIP_1_1.jpg

EC2を選択。
EIP_2.jpg

これでIPが一つもらえる。
このIPをEC2インスタンスを紐付けるため、「Associate Address」をクリック。
EIP_3_2.jpg

紐付けるインスタンスを選択。
EIP_4.jpg

これで、EC2に固定IPが割り振られた!
EIP_5.jpg

Elastic IPsも無料なので、是非とも活用してほしい。
タグ:Hadoop AWS ec2
posted by ほるもん at 00:58 | Comment(0) | TrackBack(0) | hadoop | このブログの読者になる | 更新情報をチェックする

2012年02月19日

[hadoop][AWS] hadoopを始めてみる(5) 〜EC2にMapRをインストールしてみる〜はてなブックマーク - [hadoop][AWS] hadoopを始めてみる(5) 〜EC2にMapRをインストールしてみる〜

前回までに、Redhut Enterprise Linux の EC2 を用意できたので、
ついにそこにHadoopをインストールしてみる。

Hadoopと一言で言っても、現在は、
Apache Hadoop
本家のオープンソースプロジェクト
CDH
Apache HadoopをベースにCloudera社がパッケージングし、サポートを行うもの
MapR
Apache Hadoopと互換を保ちつつ、米MapR社がHDFS層をC++で再実装したもの
と、いくつかのリビジョンが存在する。

それぞれ、CDHもMapRもCommunity版が存在するし、MapRも30日試用フル機能ライセンスも
あるので、どれを選んでもとりあえずは問題ない。

ここでは、私が使い慣れているっていうのと、CDHならブログとして面白くないって意味もあり、
MapRをインストールするものとする。

シングルノードのMapRのインストール方法は、
http://www.mapr.com/doc/display/MapR/M3+-+RHEL+or+CentOS
に書いてあり、ここでの記事の半分以上は上記の日本語訳になる。
MapRを知っているような人は、英語を苦にするような人ではないと思うけど、
EC2ならではの手順も少しあるので、省略しないで全手順を書いておく。

@専用ディスクを用意


MapRでは、OSがマウントしていないハードディスクが必須である。
なので、EC2にも専用ディスクを追加してあげる必要がある。

EC2でのハードディスクの追加は、Elastic Block Storeにて行う。
AWS Management Consoleの右メニューから「Elastic Block Store / Volumes」を選択し、
「Create Volume」をクリック。
EBS_1_2.jpg

現在は30GBまで無料なので、その範囲で必要な容量を選択すればよい。
(当然、お金を払うのであればそれ以上でも問題ありません。)
あとはそのまま。
EBS_2.jpg

Volumeができたので、それをEC2にアタッチさせる。
EBS_3_2.jpg

アタッチ先のインスタンス、アタッチ時のデバイス名を入力。
デバイス名は、「既に使われているよ」って拒否られる場合があるので、
その場合はデバイス名を変えて再度アタッチを実行。
EBS_4.jpg

インスタンスで、ディスクが追加されていることを確認。
(新しい方が追加したディスク)
[root@ip-10-162-xx-xxx ~]# ls -l /dev/xvd*
brw-rw----. 1 root disk 202, 432 Feb 14 11:07 /dev/xvdab
brw-rw----. 1 root disk 202, 65 Feb 14 10:17 /dev/xvde1

Aホスト名を設定


MapRではホスト名が必須であるので、設定する。
[root@ip-10-162-xx-xxx ~]# hostname mapr001
[root@ip-10-162-xx-xxx ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=mapr001
[root@ip-10-162-xx-xxx ~]# echo "10.162.xx.xxx mapr001" >> /etc/hosts
[root@ip-10-162-xx-xxx ~]# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
10.162.xx.xxx mapr001

BJDKのインストール


MapRでは、RHEL標準のGNU Javaではなく、Sun Java JDK(1.6.0_24以降)が必要である。
EC2インスタンスへパッケージを持っていくのは面倒なので、
手元のブラウザでパッケージのURLを入手し、wgetでダウンロードする。
[root@mapr001 ~]# wget http://download.oracle.com/otn-pub/java/jdk/6u30-b12/jdk-6u30-linux-x64.bin

あとは、普通にインストール。
[root@mapr001 ~]# chmod +x jdk-6u30-linux-x64.bin
[root@mapr001 ~]# ./jdk-6u30-linux-x64.bin
[root@mapr001 ~]# mv jdk1.6.0_30/ /opt/

JAVA_HOMEとPATHも設定しておく。
[root@mapr001 ~]# echo "export JAVA_HOME=/opt/jdk1.6.0_30/" >> ~/.bashrc
[root@mapr001 ~]# echo "export PATH=${JAVA_HOME}/bin:${PATH}" >> ~/.bashrc
[root@mapr001 ~]# source ~/.bashrc
[root@mapr001 ~]# java -version
java version "1.6.0_30"
Java(TM) SE Runtime Environment (build 1.6.0_30-b12)
Java HotSpot(TM) 64-Bit Server VM (build 20.5-b03, mixed mode)

CMapRリポジトリへの接続


いよいよ、MapRのインストールに入る。
RHELなので、yumを使う。yumの設定は以下の通り。
[root@mapr001 ~]# cat /etc/yum.repos.d/maprtech.repo
[maprtech]
name=MapR Technologies
baseurl=http://package.mapr.com/releases/v1.2.2/redhat/
enabled=1
gpgcheck=0
protect=1
前述のURLのMapR公式手順書ではv1.2.0を見ていたが、最新のv1.2.2がリリースされていたので、
最新のリビジョン番号に変更して設定した。

ちゃんと接続されるか、searchをして確認してみる。
[root@mapr001 ~]# yum search mapr
Loaded plugins: amazon-id, rhui-lb, security
maprtech | 951 B 00:00
maprtech/primary | 5.8 kB 00:00
maprtech 31/31
rhui-ap-northeast-1-client-config-server-6 | 2.6 kB 00:00
rhui-ap-northeast-1-rhel-server-releases | 3.7 kB 00:00
rhui-ap-northeast-1-rhel-server-releases/primary_db | 11 MB 00:00
rhui-ap-northeast-1-rhel-server-releases-optional | 3.5 kB 00:00
rhui-ap-northeast-1-rhel-server-releases-optional/primary_db | 1.8 MB 00:00
=================================== N/S Matched: mapr ====================================
mapr-cldb.x86_64 : MapR
mapr-client.i386 : MapR Client
mapr-client.x86_64 : MapR Client
mapr-core.x86_64 : MapR Core
mapr-fileserver.x86_64 : MapR
mapr-flume.x86_64 : MapR
mapr-flume-internal.x86_64 : MapR Flume
mapr-hbase-internal.x86_64 : MapR Hbase
mapr-hbase-master.x86_64 : MapR
mapr-hbase-regionserver.x86_64 : MapR
mapr-hive.x86_64 : MapR
mapr-hive-internal.x86_64 : MapR Hbase
mapr-jobtracker.x86_64 : MapR
mapr-mahout.x86_64 : MapR Mahout
mapr-nfs.x86_64 : MapR
mapr-oozie.x86_64 : MapR
mapr-oozie-internal.x86_64 : MapR Oozie
mapr-pig.x86_64 : MapR
mapr-pig-internal.x86_64 : MapR Hbase
mapr-single-node.x86_64 : MapR Core
mapr-sqoop.x86_64 : MapR
mapr-sqoop-internal.x86_64 : MapR Sqoop
mapr-tasktracker.x86_64 : MapR
mapr-upgrade.x86_64 : MapR Upgrade
mapr-webserver.x86_64 : MapR
mapr-whirr.x86_64 : MapR Whirr
mapr-zk-internal.x86_64 : MapR
mapr-zookeeper.x86_64 : MapR
mapr-datameer.noarch : Datameer Analytics Solution
よし、いっぱい出てきてくれた!

DMapRパッケージのインストール


リポジトリに接続できたところで、実際にパッケージをインストールする。
複数台構成のときには、コンポーネントの配置を考えなければいけないのだが、
今回は1台で試しに使うだけなので、必須コンポーネントを全て1台にインストールする。
[root@mapr001 ~]# yum install mapr-cldb mapr-fileserver mapr-jobtracker mapr-nfs mapr-tasktracker mapr-webserver mapr-zookeeper

EMapRの初期設定


初回起動時(及び、環境変更時)のみに必要な設定を施す。
まずは、コンポーネントの配置を指定する。
配置設定が必要なコンポーネントは、MapRのMaster的な役割をするCLDBとZookeeperであり、
当然、1台しかないので自分のホスト名を指定する。
[root@mapr001 ~]# /opt/mapr/server/configure.sh -C mapr001 -Z mapr001
Node setup configuration: cldb fileserver jobtracker nfs tasktracker webserver zookeeper
Log can be found at: /opt/mapr/logs/configure.log

次に、MapRで使用するディスクを設定する。
MapRは、OSマウントされていないディスクをデータ領域として、独自形式でフォーマットして使用する。
ここでは、手順@にて追加したディスクを設定する。
[root@mapr001 ~]# echo "/dev/xvdab" > disks.txt
[root@mapr001 ~]# /opt/mapr/server/disksetup -F disks.txt
Added /dev/xvdab

なお、このディスクフォーマットは、ディスクキャッシュを確保するだけのメモリがない場合には失敗する。
具体的には、613MBのEC2マイクロインスタンスでは実行できなかった。

また、失敗時に /opt/mapr/hostname がリセットされる場合がある。
(hostnameを永続化せずにノード再起動したからか?)
その場合は、同ファイルを直接編集してホスト名を書いてあげると良い。

FMapRの起動


ついにMapRを起動させる。
まずは、クラスタ全体のプロセス管理をするZookeeperのサーバプロセスを起動する。
[root@mapr001 ~]# /etc/init.d/mapr-zookeeper start
JMX enabled by default
Using config: /opt/mapr/zookeeper/zookeeper-3.3.2/conf/zoo.cfg
Starting zookeeper ... Zookeeper is already running as process 991.

続いて、ノードのプロセス監視をするwardenを起動する。
wardenを起動させると、必要なプロセスをwardenがキックしてくれる。
[root@mapr001 ~]# /etc/init.d/mapr-warden start
Starting WARDEN, logging to /opt/mapr/logs/warden.log
For diagnostics look at /opt/mapr/logs/ for createsystemvolumes.log, warden.log and configured services log files

プロセスが立ち上がっているかを確認する。
[root@mapr001 ~]# jps
3644 CLIMainDriver
2465 CommandServer
1752 CLDB
2429 JobTracker
3819 Jps
1228 QuorumPeerMain
3346 TaskTracker
1318 WardenMain
これらは全てMapR関連のプロセスである。
まずは、ライセンス認証前はCLDBとCommandServerが立ち上がっていることが確認できれば良い。
CLDBはMapRの核となる管理プロセスであり、CDLBを通じてライセンス認証を行うので必須である。
また、Web認証はCLDBのWEB管理コンソールより行うのだが、
その管理コンソールのWEBサーバプロセスがCommandServerである。

GWeb管理コンソールのアクセス設定


ライセンス認証は、CLDBの管理Web画面にて設定する。
手元のマシンからEC2上のCLDBにアクセスするため、
外部からのHTTP通信を受け付けるように設定する。

まずは、面倒なのでOSファイアーウォールを停止する。
ちょい心配だけど、セキュリティは全てAWSのSecurity Groupで管理することにする
[root@mapr001 ~]# /etc/init.d/iptables stop
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: [ OK ]

次に、AWSのSecurity Groupの設定にて、操作端末からWeb画面を見えるようにする。
アクセスポートは、CLDBは8443、JobTrackerは50030と、複数存在するため、
ここでは簡単に、操作端末のIPに対しては全ポートを開放する。
IP制限を掛けているので、セキュリティ的にも大丈夫だろう。
MapR_2_2.jpg

また、管理コンソールはOSユーザでログインをするため、OSユーザにパスワードを設定しておく。
(最初に設定しておけって話ではあるが・・・。)
[root@mapr001 ~]# passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

Hライセンス認証


操作端末からEC2にアクセスできるようにしたので、MapRが立ち上がっている状態で、
以下のURLのMapR管理コンソールにアクセスする。
https://[Public DNS]:8443/

管理コンソールにはOSユーザでログインする。
このページの手順で進めた場合は、管理コンソールへのアクセス許可設定を変更していないので、
デフォルトで管理コンソールアクセスが許可されているrootユーザのOSパスワードでログインする。MapR_1.jpg

初回起動時にはライセンス規約への同意を求められるので、「Accept」を選択。
MapR_3_2.jpg

続いて、ライセンス登録ウインドウが立ち上がる。
Web経由で登録するため、「Add License via Web」をクリック。
(なお、この画面は、管理コンソールの右上の「Manage License」からいつでも立ち上げられる)
MapR_4_2.jpg

すると、MapR公式ページのログイン画面に飛ぶ。ここで、MapRアカウントにてログインする。
(アカウントがない場合は、ここで登録する。)
MapR_10.jpg

ログインできると、M3ライセンスと、M5・30日ライセンスが選べる。
ここではM3を選択して、「Register」を押下。
MapR_7.jpg

その後、登録完了画面に遷移するので、「return mapr web ui(曖昧(^^;))」を押下すると、
以下のようなMapR管理コンソールに遷移する。ここで、「Apply Licenses」を押下することで設定完了。
ちなみに、M5を選択していた場合は、この画面でM3とM5の両方がリストアップされる。
MapR_8.jpg

管理コンソールにて、ヒートマップが緑色になっていればOK。
ライセンス適用直後はオレンジのままの場合があるが、その際は、wardenをリスタートするか、
管理コンソールからNFS Serverを立ち上げれば緑になる。
(ライセンスを入れていない状態(baseライセンス)で立ち上げもできないのは、NFS Serverだけの模様)
MapR_9.jpg

I動作確認


これまでの作業で、MapRの設定は完了である。
最後に、hadoopのサンプルを動かして、動作確認を行う。
[root@mapr001 hadoop-0.20.2]# pwd
/opt/mapr/hadoop/hadoop-0.20.2
[root@mapr001 hadoop-0.20.2]# hadoop jar hadoop-0.20.2-dev-examples.jar pi 1 1
Number of Maps = 1
Samples per Map = 1
Wrote input for Map #0
Starting Job
12/02/19 00:56:41 INFO fs.JobTrackerWatcher: Current running JobTracker is: mapr001/10.160.9.94:9001
12/02/19 00:56:42 INFO mapred.FileInputFormat: Total input paths to process : 1
12/02/19 00:56:42 INFO mapred.JobClient: Running job: job_201202190013_0002
12/02/19 00:56:43 INFO mapred.JobClient: map 0% reduce 0%
12/02/19 00:56:48 INFO mapred.JobClient: map 100% reduce 0%
12/02/19 00:56:53 INFO mapred.JobClient: Job complete: job_201202190013_0002
   ・・・
Job Finished in 11.497 seconds
Estimated value of Pi is 4.00000000000000000000

問題なくMapReduceが動作していることが伺える!よっしゃ!
Apache Hadoopと同様のURLでJob Tackerの管理画面も表示されることができ、そちらでも正しく動作していることが確認できる。
http://[Public DNS]:50030/

無事にMapRが動いたので、ようやく、明日からアプリの開発を始められる。

ちなみに、ここまで結構試行錯誤をしたが、AWSの請求は$2.91なり。
円高万歳。

<参考>

MapRとはなんぞや?という方は、中の人が書いているこちらの記事が参考になります。
http://d.hatena.ne.jp/nagixx/20111216/1324006829
posted by ほるもん at 00:28 | Comment(0) | TrackBack(0) | hadoop | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。