Amazon Elastic MapReduce : Hadoop2.4環境でワードカウントのプログラムを実行する(Ruby Client & SSH)。

前回の記事では、前々回に作成したワードカウントのサンプルをAWSマネージメントコンソールから実行した。
GUIから実行するのは簡単なのだが、回数が多くなってくると面倒くさい。なので、Elactic MapReduce Client Rubyでの実行方法と、SSHでログインして(Hadoopを生で使う)実行方法を以下にメモしておく。

Elastic MapReduce Ruby Clientで、ワードカウントを実行する。

Elastic MapReduce Ruby Clientの使い方については、
先日の記事にかいた。

  • プログラム(jarファイル:hadoopsample.jar)はS3に保管。
  • 入力となるテキストファイルもS3に保管。
  • 出力もS3に書き出し

という、前回の記事と同じ条件で実行する。

この場合、クラスタが起動後、以下のコマンド1つでステップの追加と実行ができる。

elastic-mapreduce --jar s3n://[your bucket]/[your folder]/hadoopsample.jar --main-class com.tetsuyaodaka.WordCount --args s3n://[your bucket]/[your input folder],s3n://[your bucket]/[your input folder] --step-name WordCount --jobflow j-XXXXXXXXX

j-XXXXXXXXXは、Job Flow ID。
引数は、(ターミナルからの実行と違い)カンマ区切りとなす。
mainクラスも指定でき、(ターミナルから指定した場合と違って)実行中のGUIにMain Classが正確に表示される。

SSHでマスタノードにログインして、ワードカウントを実行する。

クラスタ起動後に、sftpでマスタノードにプログラムと入力テキストを送り、SSHでログインして実行する。
手続きとしては、

  1. sftpでhadoopsample.jarとinput.txt(入力テキスト)を送る(以前の記事)。
  2. SSHでログインする。
  3. HDFS上に入力用(出力用)ディレクトリを作成する。
  4. HDFSの入力用フォルダーにinput.txtをコピーする。
  5. hadoopsample.jar内のWordCountを実行する。
  6. 結果をHDFSからOS上に取り出す。

という流れになる。

HDFS上に入出力用のディレクトリを作成する。

sftpで、マスタノードに、プログラム(hadoopsample.jar)と入力ファイル(input.txt)を送ったら、SSHでログインする。
以下のコマンドで、HDFS上に入力用(出力用)フォルダーを作成する。hadoop fsコマンドではなくて、hdfsコマンド。

[hadoop@ip-10-91-156-75 ~]$ hdfs dfs -mkdir -p /input
[hadoop@ip-10-91-156-75 ~]$ hdfs dfs -mkdir -p /output

Hadoop2.4のAMIを使った場合、Web GUIHDFSブラウジングできる。

HDFSの入力用フォルダーにinput.txtをコピーする。

以下のコマンドで、HDFS上の/input/に入力テキストをコピーする。

[hadoop@ip-10-91-156-75 ~]$ hdfs dfs -put input.txt /input/

以下がinputフォルダーをブラウジングしたところ。

hadoopsample.jar内のWordCountを実行する。

ここまで準備ができたら、以下のコマンドでワードカウントを実行する。
(/output/の下に2014/0610フォルダーを作って、出力を書き込む)

hadoop jar hadoopsample.jar com.tetsuyaodaka.WordCount /input /output/2014/0610

以下のログが画面に流れる(必要に応じてリダイレクトする。)。

14/06/10 05:59:17 INFO client.RMProxy: Connecting to ResourceManager at /10.91.156.75:9022
14/06/10 05:59:18 INFO client.RMProxy: Connecting to ResourceManager at /10.91.156.75:9022
14/06/10 05:59:19 WARN mapreduce.JobSubmitter: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
14/06/10 05:59:19 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library from the embedded binaries
14/06/10 05:59:19 INFO lzo.LzoCodec: Successfully loaded & initialized native-lzo library [hadoop-lzo rev 77cfa96225d62546008ca339b7c2076a3da91578]
14/06/10 05:59:19 INFO mapred.FileInputFormat: Total input paths to process : 1
14/06/10 05:59:20 INFO mapreduce.JobSubmitter: number of splits:2
14/06/10 05:59:20 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1402369340436_0003
14/06/10 05:59:20 INFO impl.YarnClientImpl: Submitted application application_1402369340436_0003
14/06/10 05:59:20 INFO mapreduce.Job: The url to track the job: http://10.91.156.75:9046/proxy/application_1402369340436_0003/
14/06/10 05:59:20 INFO mapreduce.Job: Running job: job_1402369340436_0003
14/06/10 05:59:34 INFO mapreduce.Job: Job job_1402369340436_0003 running in uber mode : false
14/06/10 05:59:34 INFO mapreduce.Job:  map 0% reduce 0%
14/06/10 05:59:49 INFO mapreduce.Job:  map 50% reduce 0%
14/06/10 06:00:00 INFO mapreduce.Job:  map 100% reduce 0%
14/06/10 06:00:17 INFO mapreduce.Job:  map 100% reduce 100%
14/06/10 06:00:18 INFO mapreduce.Job: Job job_1402369340436_0003 completed successfully
14/06/10 06:00:19 INFO mapreduce.Job: Counters: 49
	File System Counters
		FILE: Number of bytes read=1459
		FILE: Number of bytes written=296895
		FILE: Number of read operations=0
		FILE: Number of large read operations=0
		FILE: Number of write operations=0
		HDFS: Number of bytes read=2142
		HDFS: Number of bytes written=1329
		HDFS: Number of read operations=9
		HDFS: Number of large read operations=0
		HDFS: Number of write operations=2
	Job Counters 
		Launched map tasks=2
		Launched reduce tasks=1
		Data-local map tasks=2
		Total time spent by all maps in occupied slots (ms)=66351
		Total time spent by all reduces in occupied slots (ms)=65636
		Total time spent by all map tasks (ms)=22117
		Total time spent by all reduce tasks (ms)=16409
		Total vcore-seconds taken by all map tasks=22117
		Total vcore-seconds taken by all reduce tasks=32818
		Total megabyte-seconds taken by all map tasks=16985856
		Total megabyte-seconds taken by all reduce tasks=16802816
	Map-Reduce Framework
		Map input records=15
		Map output records=214
		Map output bytes=2155
		Map output materialized bytes=1644
		Input split bytes=184
		Combine input records=214
		Combine output records=165
		Reduce input groups=150
		Reduce shuffle bytes=1644
		Reduce input records=165
		Reduce output records=150
		Spilled Records=330
		Shuffled Maps =2
		Failed Shuffles=0
		Merged Map outputs=2
		GC time elapsed (ms)=427
		CPU time spent (ms)=3310
		Physical memory (bytes) snapshot=783855616
		Virtual memory (bytes) snapshot=3907485696
		Total committed heap usage (bytes)=598089728
	Shuffle Errors
		BAD_ID=0
		CONNECTION=0
		IO_ERROR=0
		WRONG_LENGTH=0
		WRONG_MAP=0
		WRONG_REDUCE=0
	File Input Format Counters 
		Bytes Read=1958
	File Output Format Counters 
		Bytes Written=1329
結果をHDFSからOS上に取り出す。

以下は、/output下をブラウズしたところ。

HDFSからOS上にファイルを取り出すには、以下のコマンドを実行すればいい。

hdfs dfs -get /output/2014/

上の画面を実行後、2014/06へ移動してlsを実行したところ。

[hadoop@ip-10-91-156-75 0610]$ ls
_SUCCESS  part-00000