(AWS/EC2) Cloudera のインストールの時はセキュリティグループに VPC default を追加するといい感じ。
どうも!今日も、EC2 とイチャイチャしていました。
先日から、EC2 に Cloudera Search をインストールしようとトライしているところです。が、Qiita の記事やマニュアル通りにやると、なぜかインストールウィザードのハートビートを確認するところでエラー(ハートビートが受けられない)となっていました。結論を先に書くと、セキュリティグループでポートを開いておけば良いという話です。
環境
あらかじめ、インスタンスを2つ起動しました。先日の反省も活かし、m1.large を使用します。
- Ubuntu Server 12.04 LTS (PV) - ami-59a4a230 (64-bit)
- m1.large
- Cloudera Enterprise 5 Beta 2
セキュリティグループの設定
セキュリティグループは、インスタンス単位で設定されます。また、同一 VPC 内のインスタンス間の通信であってもセキュリティグループが効くようになっています。なので、クライアントからSSH接続が出来て、ブラウザが見れてという、作業だけを考えたセキュリティグループになっていたので、インスタンス間で通信ができない状態になっていたと考えられます。
とは言え、いちいちポートを調べるのは正直面倒くさい。特に Cloudera のように一度にいろんなミドルウェアを入れる場合は特に大変です。そこで、インスタンス間の通信だけフルオープンにしたいのですが、実は元々簡単な方法が EC2 には用意されています。
具体的には、2台のセキュリティグループに作業をしているクライアントからアクセスできる設定のほかに、VPC のデフォルトセキュリティグループを割り当てます。Group Name が default という名前のセキュリティグループがあると思います。スクリーンショットを貼りましたが、ソースが自分のGroupIDになっています。つまり、このセキュリティIDが割り当てられたインスタンス間の通信はフルオープンになります。
参考:VPC のセキュリティグループ - Amazon Virtual Private Cloud
Hadoop や CDH のように、サーバー同士でいろんなポートで会話するミドルウェアをインストールする場合は、default の設定を割りつけておくと楽です。
セキュリティグループ vs iptables
そこで、疑問になってくるのは iptables でいいんじゃないかと?何が違うんだという点です。ググったところ良い答えを見つけました。以下、引用、というか意訳です。
iptables とセキュリティグループの大きな違いは、トラフィックがサーバーまでリーチするかどうかです。セキュリティグループでフィルターする場合はサーバーまで届きません。このため、DDoS 攻撃からインスタンスを守ることを想定した場合、セキュリティグループでフィルターすることは大きな効果があります。一方で、セキュリティグループには出来ない細かな設定を iptables では可能です。
なるほどねー!
おまけ
インストール後に、MapReduce のサンプルを実行して動作確認をしました。JobTracker のインストールされているノードでなくても実行が出来ました。
ちなみになぜか、ドキュメントや Qiita に書いてある example.jar の場所が違っていました。出たばっかりのバージョンだからかな?
$ sudo -u hdfs hadoop jar /opt/cloudera/parcels/CDH-4.6.0-1.cdh4.6.0.p0.26/lib/hadoop-0.20-mapreduce/hadoop-examples.jar pi 4 1000 Number of Maps = 4 Samples per Map = 1000 Wrote input for Map #0 Wrote input for Map #1 Wrote input for Map #2 Wrote input for Map #3 Starting Job 14/03/11 02:56:58 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 14/03/11 02:56:58 INFO mapred.FileInputFormat: Total input paths to process : 4 14/03/11 02:56:59 INFO mapred.JobClient: Running job: job_201403110157_0001 14/03/11 02:57:00 INFO mapred.JobClient: map 0% reduce 0% 14/03/11 02:57:12 INFO mapred.JobClient: map 25% reduce 0% 14/03/11 02:57:16 INFO mapred.JobClient: map 50% reduce 0% 14/03/11 02:57:20 INFO mapred.JobClient: map 75% reduce 0% 14/03/11 02:57:25 INFO mapred.JobClient: map 100% reduce 0% 14/03/11 02:57:32 INFO mapred.JobClient: map 100% reduce 100% 14/03/11 02:57:34 INFO mapred.JobClient: Job complete: job_201403110157_0001 14/03/11 02:57:34 INFO mapred.JobClient: Counters: 33 14/03/11 02:57:34 INFO mapred.JobClient: File System Counters 14/03/11 02:57:34 INFO mapred.JobClient: FILE: Number of bytes read=65 14/03/11 02:57:34 INFO mapred.JobClient: FILE: Number of bytes written=796472 14/03/11 02:57:34 INFO mapred.JobClient: FILE: Number of read operations=0 14/03/11 02:57:34 INFO mapred.JobClient: FILE: Number of large read operations=0 14/03/11 02:57:34 INFO mapred.JobClient: FILE: Number of write operations=0 14/03/11 02:57:34 INFO mapred.JobClient: HDFS: Number of bytes read=1032 14/03/11 02:57:34 INFO mapred.JobClient: HDFS: Number of bytes written=215 14/03/11 02:57:34 INFO mapred.JobClient: HDFS: Number of read operations=13 14/03/11 02:57:34 INFO mapred.JobClient: HDFS: Number of large read operations=0 14/03/11 02:57:34 INFO mapred.JobClient: HDFS: Number of write operations=3 14/03/11 02:57:34 INFO mapred.JobClient: Job Counters 14/03/11 02:57:34 INFO mapred.JobClient: Launched map tasks=4 14/03/11 02:57:34 INFO mapred.JobClient: Launched reduce tasks=1 14/03/11 02:57:34 INFO mapred.JobClient: Data-local map tasks=4 14/03/11 02:57:34 INFO mapred.JobClient: Total time spent by all maps in occupied slots (ms)=22420 14/03/11 02:57:34 INFO mapred.JobClient: Total time spent by all reduces in occupied slots (ms)=5507 14/03/11 02:57:34 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 14/03/11 02:57:34 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 14/03/11 02:57:34 INFO mapred.JobClient: Map-Reduce Framework 14/03/11 02:57:34 INFO mapred.JobClient: Map input records=4 14/03/11 02:57:34 INFO mapred.JobClient: Map output records=8 14/03/11 02:57:34 INFO mapred.JobClient: Map output bytes=72 14/03/11 02:57:34 INFO mapred.JobClient: Input split bytes=560 14/03/11 02:57:34 INFO mapred.JobClient: Combine input records=0 14/03/11 02:57:34 INFO mapred.JobClient: Combine output records=0 14/03/11 02:57:34 INFO mapred.JobClient: Reduce input groups=2 14/03/11 02:57:34 INFO mapred.JobClient: Reduce shuffle bytes=136 14/03/11 02:57:34 INFO mapred.JobClient: Reduce input records=8 14/03/11 02:57:34 INFO mapred.JobClient: Reduce output records=0 14/03/11 02:57:34 INFO mapred.JobClient: Spilled Records=16 14/03/11 02:57:34 INFO mapred.JobClient: CPU time spent (ms)=6200 14/03/11 02:57:34 INFO mapred.JobClient: Physical memory (bytes) snapshot=1717841920 14/03/11 02:57:34 INFO mapred.JobClient: Virtual memory (bytes) snapshot=9329647616 14/03/11 02:57:34 INFO mapred.JobClient: Total committed heap usage (bytes)=1605500928 14/03/11 02:57:34 INFO mapred.JobClient: org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter 14/03/11 02:57:34 INFO mapred.JobClient: BYTES_READ=96 Job Finished in 36.201 seconds Estimated value of Pi is 3.14000000000000000000
ちゃんと動いたみたいです!デフォルトだと2台構成でもMapperが4つも上がるのね。