Amazon Elastic MapReduceを使う:SSHでマスタノードにログインする。sftpでファイルを転送する。

Amazon Elastic MapReduceはEC2インスタンスで構成されている。ということは、SSHなどでログインが可能だし、クライアントから直接データやプログラムが配備できる。
AWSのサイトにも書いてあるし、(日付が古いが)「Amazon Elastic MapReduce ドキュメント」にも書いてある。

1年前の記事を参考に、現在の環境でテストしてみる。

マネージメント・コンソールでEC2を選択して、Instancesをみる。以下が、Runningしているインスタンスだけ表示した画面。

この中にマスタノードがいるわけだが、(1年前と比べて)見つけるのが簡単になっている。
以下は、Elastic MapReduceのコンソール画面だが、画面上にMaster Public DNS(Name)が表示されていて、これがマスタノードのPublic Nameとなっている。

接続する先はこのインスタンスなので、先の3つのEC2インスタンスから選択して、どんなポートが開いているか、Security Groupを調べる。

Security Groupを調べるには、上の画面の右下にある「Security Group」の「view rules」をクリックする。

(不用心な話だが)22番と80番が開いていることが分かる。9100はJobTracker、9101はHDFSの管理画面のため。

試しに、

https://[your public DNS of Master Node]:9100

としてみると、以下のようにJobTrackerが表示される。

次に、

https://[your public DNS of Master Node]:9101

とすると、HDFSの操作画面が表示される。

ただし、「Browse the filesystem」は、リンクの差し先がInternal IPを指していて、ブラウザーで表示できない。普通は、この画面からHDFS上のファイルの操作ができるが、HDFSを操作するには、SSHでログイン後行うことになる(1年前も同じだったように記憶している)。

さて、SSHでマスタノードにログインしてみる。
クライアント・マシンは、Mac Book Pro(OS X 10.9.3)を用いた。
ターミナルを開き、キーペアを指定して、以下のようにマスタノードに接続する。見ての通り、ログインにはhadoopユーザーを使用する。

ssh -i ~/.ssh/[your key-pair name] hadoop@[your public DNS of Master Node]

以下が、ログイン直後の画面。

ログインできたら、環境を軽く見ておく。
Javaは、1.7.0.40。

hadoop@ip-XX-XX-XX-XX:~$ java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

Hadoop関連のバージョンは起動時に指定するが、hadoopのホームディレクトリ/.versionsで調べることができる。

hadoop 1.0.3
hbase 0.92
hive 0.11.0
pig 0.11.1.1

である。

ちなみに、rubyは1.8.7がインストされている。

hadoop@ip-XX-XX-XX-XX:~$ ruby -version
ruby 1.8.7 (2010-08-16 patchlevel 302)

hadoopのホームディレクトリには、hadoopの本体が入っているので、モンテカルロ法による円周率の近似計算を行ってみる。

hadoop@ip-XX-XX-XX-XX:~$ hadoop jar hadoop-examples-1.0.3.jar pi 10 10000
Number of Maps  = 10
Samples per Map = 10000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
Wrote input for Map #5
Wrote input for Map #6
Wrote input for Map #7
Wrote input for Map #8
Wrote input for Map #9
Starting Job
14/06/03 01:55:51 INFO mapred.JobClient: Default number of map tasks: 10
14/06/03 01:55:51 INFO mapred.JobClient: Default number of reduce tasks: 1
14/06/03 01:55:52 INFO security.ShellBasedUnixGroupsMapping: add hadoop to shell userGroupsCache
14/06/03 01:55:52 INFO mapred.JobClient: Setting group to hadoop
14/06/03 01:55:52 INFO mapred.FileInputFormat: Total input paths to process : 10
14/06/03 01:55:53 INFO mapred.JobClient: Running job: job_201406030041_0002
14/06/03 01:55:54 INFO mapred.JobClient:  map 0% reduce 0%
14/06/03 01:56:18 INFO mapred.JobClient:  map 10% reduce 0%
14/06/03 01:56:24 INFO mapred.JobClient:  map 20% reduce 0%
14/06/03 01:56:30 INFO mapred.JobClient:  map 30% reduce 0%
14/06/03 01:56:36 INFO mapred.JobClient:  map 50% reduce 0%
14/06/03 01:56:39 INFO mapred.JobClient:  map 70% reduce 0%
14/06/03 01:56:42 INFO mapred.JobClient:  map 90% reduce 0%
14/06/03 01:56:45 INFO mapred.JobClient:  map 100% reduce 0%
14/06/03 01:56:51 INFO mapred.JobClient:  map 100% reduce 30%
14/06/03 01:56:57 INFO mapred.JobClient:  map 100% reduce 100%
14/06/03 01:57:02 INFO mapred.JobClient: Job complete: job_201406030041_0002
14/06/03 01:57:02 INFO mapred.JobClient: Counters: 31
14/06/03 01:57:02 INFO mapred.JobClient:   Job Counters 
14/06/03 01:57:02 INFO mapred.JobClient:     Launched reduce tasks=1
14/06/03 01:57:02 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=115362
14/06/03 01:57:02 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
14/06/03 01:57:02 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
14/06/03 01:57:02 INFO mapred.JobClient:     Rack-local map tasks=2
14/06/03 01:57:02 INFO mapred.JobClient:     Launched map tasks=10
14/06/03 01:57:02 INFO mapred.JobClient:     Data-local map tasks=8
14/06/03 01:57:02 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=37673
14/06/03 01:57:02 INFO mapred.JobClient:   File Input Format Counters 
14/06/03 01:57:02 INFO mapred.JobClient:     Bytes Read=1180
14/06/03 01:57:02 INFO mapred.JobClient:   File Output Format Counters 
14/06/03 01:57:02 INFO mapred.JobClient:     Bytes Written=97
14/06/03 01:57:02 INFO mapred.JobClient:   FileSystemCounters
14/06/03 01:57:02 INFO mapred.JobClient:     FILE_BYTES_READ=113
14/06/03 01:57:02 INFO mapred.JobClient:     HDFS_BYTES_READ=2450
14/06/03 01:57:02 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=275211
14/06/03 01:57:02 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=215
14/06/03 01:57:02 INFO mapred.JobClient:   Map-Reduce Framework
14/06/03 01:57:02 INFO mapred.JobClient:     Map output materialized bytes=360
14/06/03 01:57:02 INFO mapred.JobClient:     Map input records=10
14/06/03 01:57:02 INFO mapred.JobClient:     Reduce shuffle bytes=360
14/06/03 01:57:02 INFO mapred.JobClient:     Spilled Records=40
14/06/03 01:57:02 INFO mapred.JobClient:     Map output bytes=180
14/06/03 01:57:02 INFO mapred.JobClient:     Total committed heap usage (bytes)=1529450496
14/06/03 01:57:02 INFO mapred.JobClient:     CPU time spent (ms)=10500
14/06/03 01:57:02 INFO mapred.JobClient:     Map input bytes=240
14/06/03 01:57:02 INFO mapred.JobClient:     SPLIT_RAW_BYTES=1270
14/06/03 01:57:02 INFO mapred.JobClient:     Combine input records=0
14/06/03 01:57:02 INFO mapred.JobClient:     Reduce input records=20
14/06/03 01:57:02 INFO mapred.JobClient:     Reduce input groups=20
14/06/03 01:57:02 INFO mapred.JobClient:     Combine output records=0
14/06/03 01:57:02 INFO mapred.JobClient:     Physical memory (bytes) snapshot=1891930112
14/06/03 01:57:02 INFO mapred.JobClient:     Reduce output records=0
14/06/03 01:57:02 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=6932238336
14/06/03 01:57:02 INFO mapred.JobClient:     Map output records=20
Job Finished in 71.073 seconds
Estimated value of Pi is 3.14120000000000000000

このとき、ブラウザーからJob Trackerを見たものが以下。PiEstimaterが実行されていることが確認できる。

ジョブを監視するときは、このWeb画面が便利である。上の画面でジョブの内容をみると、以下のように実行中のMapプロセス、Reduceプロセスなどを調べることができる。

最後に、マスタノードにsftpでデータを送ってみる。
ローカルにtext.txt(空ファイル)を作成し、以下のようにログイン後に転送する。

MacBook-Pro:~ tetsuya$ sftp -i ~/.ssh/[your key-pair name] hadoop@[public DNS Name of Master Node]
sftp> put test.txt test.txt 
Uploading test.txt to /home/hadoop/test.txt
test.txt                                      100%    0     0.0KB/s   00:00

マスタノード側で確認すると、以下のように転送されていることが確認できる。

hadoop@ip-XX-XX-XX-XX:~$ ls -al
total 100
drwxr-xr-x 15 hadoop hadoop  4096 Jun  3 01:59 .
drwxr-xr-x  3 root   root    4096 Oct  3  2013 ..
-rwxrwxr--  1 hadoop hadoop    57 Oct  3  2013 .bash_profile
-rwxrwxr--  1 hadoop hadoop   321 Oct  3  2013 .bashrc
drwx------  2 hadoop hadoop  4096 Jun  3 00:34 .ssh
drwxr-xr-x  6 hadoop hadoop  4096 Jun  3 00:59 .versions
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 01:01 bin
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 00:41 conf
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 00:41 contrib
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 00:41 etc
lrwxrwxrwx  1 hadoop hadoop    62 Jun  3 00:41 hadoop-ant-1.0.3.jar -> /home/hadoop/.versions/1.0.3/share/hadoop/hadoop-ant-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    33 Jun  3 00:41 hadoop-ant.jar -> /home/hadoop/hadoop-ant-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    65 Jun  3 00:41 hadoop-client-1.0.3.jar -> /home/hadoop/.versions/1.0.3/share/hadoop/hadoop-client-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    63 Jun  3 00:41 hadoop-core-1.0.3.jar -> /home/hadoop/.versions/1.0.3/share/hadoop/hadoop-core-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    34 Jun  3 00:41 hadoop-core.jar -> /home/hadoop/hadoop-core-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    67 Jun  3 00:41 hadoop-examples-1.0.3.jar -> /home/hadoop/.versions/1.0.3/share/hadoop/hadoop-examples-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    38 Jun  3 00:41 hadoop-examples.jar -> /home/hadoop/hadoop-examples-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    70 Jun  3 00:41 hadoop-minicluster-1.0.3.jar -> /home/hadoop/.versions/1.0.3/share/hadoop/hadoop-minicluster-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    64 Jun  3 00:41 hadoop-tools-1.0.3.jar -> /home/hadoop/.versions/1.0.3/share/hadoop/hadoop-tools-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    35 Jun  3 00:41 hadoop-tools.jar -> /home/hadoop/hadoop-tools-1.0.3.jar
lrwxrwxrwx  1 hadoop hadoop    34 Jun  3 00:59 hive -> /home/hadoop/.versions/hive-0.11.0
drwxr-xr-x  3 hadoop hadoop 12288 Jun  3 01:01 lib
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 00:41 lib64
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 00:41 libexec
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 00:41 native
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 00:41 sbin
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 00:41 templates
-rw-r--r--  1 hadoop hadoop     0 Jun  3 01:59 test.txt
drwxr-xr-x  2 hadoop hadoop  4096 Jun  3 00:41 webapps

これをHDFS上にコピーし、HDFSのlsコマンドを使ってみる。

hadoop@ip-XX-XX-XX-XX:~$ hadoop fs -copyFromLocal test.txt .
hadoop@ip-XX-XX-XX-XX:~$ hadoop fs -ls .
Found 1 items
-rw-r--r--   1 hadoop supergroup          0 2014-06-03 02:01 /user/hadoop/test.txt

まとめると、

  • SSHは(一年前と同様)利用可能
  • sftpも利用可能
  • javaのバージョンはJava7

となっている。