このブログでは、MapReduceプログラムを実行する方法を紹介します。 MapReduceはApacheHadoopのコア部分の1つであり、ApacheHadoopの処理レイヤーです。したがって、MapReduceプログラムの実行方法を説明する前に、MapReduceについて簡単に説明します。
MapReduceは、大規模なデータセットを並列処理するためのシステムです。 MapReduceはデータを結果に還元し、データの要約を作成します。 mapreduceプログラムには、マッパーとレデューサーの2つの部分があります。マッパーが作業を終了すると、レデューサーのみが開始します。
マッパー: 入力キー/値ペアを一連の中間キー/値ペアにマップします。
レデューサー: キーを共有する中間値のセットを、より小さな値のセットに減らします。
基本的に、wordcount mapreduceプログラムでは、入力ファイル(任意のテキストファイル)を入力として提供します。 mapreduceプログラムが起動すると、実行されるプロセスは次のとおりです。
分割: 入力ファイルの各行を単語に分割します。
マッピング: これはキーと値のペアを形成します。ここで、wordはキーで、1は各キーに割り当てられた値です。
シャッフル: 共通のキーと値のペアがグループ化されます。
削減: 類似のキーの値が合計されます。
MapReduceプログラムの実行
MapReduceプログラムはJavaで書かれています。そして、ほとんどの場合、EclipseIDEは開発者によるプログラミングに使用されます。そのため、このブログでは、mapreduceプログラムをEclipse IDEからjarファイルにエクスポートし、Hadoopクラスターで実行する方法を紹介します。
MapReduceプログラムはEclipseIDEにあります。
このMapReduceプログラムをhadoopクラスターで実行するために、プロジェクトをjarファイルとしてエクスポートします。 Eclipse ideで[ファイル]オプションを選択し、[エクスポート]をクリックします。 Javaオプションで、Jarファイルを選択し、「次へ」をクリックします。
Wordcountプロジェクトを選択し、jarファイルのパスと名前を指定します。wordcount.jarを保持しています。[次へ]を2回クリックします。
次に、[参照]をクリックしてメインクラスを選択し、最後に[完了]をクリックしてjarファイルを作成します。以下のような警告が表示された場合は、[OK]をクリックしてください。
Hadoopクラスターが稼働しているかどうかを確認します。
コマンド: jps
hadoop@hadoop-VirtualBox:~$ jps
3008 NodeManager
3924 Jps
2885 ResourceManager
2505 DataNode
3082 JobHistoryServer
2716 SecondaryNameNode
2383 NameNode
hadoop@hadoop-VirtualBox:~$
単語数プログラム用のHDFSへの入力ファイルがあります。
hadoop@hadoop-VirtualBox:~$ hdfs dfs -put input /
hadoop@hadoop-VirtualBox:~$ hdfs dfs -cat /input
This is my first mapreduce test
This is wordcount program
hadoop@hadoop-VirtualBox:~$
次に、以下のコマンドを使用してwordcount.jarファイルを実行します。
注: wordcount.jarをエクスポートするときにメインクラスを選択したので、コマンドでメインクラスについて言及する必要はありません。
コマンド: hadoop jar wordcount.jar / input / output
hadoop@hadoop-VirtualBox:~$ hadoop jar wordcount.jar /input /output
16/11/27 22:52:20 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:
8032
16/11/27 22:52:22 WARN mapreduce.JobResourceUploader: Hadoop command-line option
parsing not performed. Implement the Tool interface and execute your application
with ToolRunner to remedy this.
16/11/27 22:52:27 INFO input.FileInputFormat: Total input paths to process : 1
16/11/27 22:52:28 INFO mapreduce.JobSubmitter: number of splits:1
16/11/27 22:52:29 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_14802
67251741_0001
16/11/27 22:52:32 INFO impl.YarnClientImpl: Submitted application application_14802
67251741_0001
16/11/27 22:52:33 INFO mapreduce.Job: The url to track the job: http://hadoop-Virtu
alBox:8088/proxy/application_1480267251741_0001/
16/11/27 22:52:33 INFO mapreduce.Job: Running job: job_1480267251741_0001
16/11/27 22:53:20 INFO mapreduce.Job: Job job_1480267251741_0001 running in uber mo
de : false
16/11/27 22:53:20 INFO mapreduce.Job: map 0% reduce 0%
16/11/27 22:53:45 INFO mapreduce.Job: map 100% reduce 0%
16/11/27 22:54:13 INFO mapreduce.Job: map 100% reduce 100%
16/11/27 22:54:15 INFO mapreduce.Job: Job job_1480267251741_0001 completed
successfully
16/11/27 22:54:16 INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read=124
FILE: Number of bytes written=237911
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=150
HDFS: Number of bytes written=66
HDFS: Number of read operations=6
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=21062
Total time spent by all reduces in occupied slots (ms)=25271
Total time spent by all map tasks (ms)=21062
Total time spent by all reduce tasks (ms)=25271
Total vcore-milliseconds taken by all map tasks=21062
Total vcore-milliseconds taken by all reduce tasks=25271
Total megabyte-milliseconds taken by all map tasks=21567488
Total megabyte-milliseconds taken by all reduce tasks=25877504
Map-Reduce Framework
Map input records=2
Map output records=10
Map output bytes=98
Map output materialized bytes=124
Input split bytes=92
Combine input records=0
Combine output records=0
Reduce input groups=8
Reduce shuffle bytes=124
Reduce input records=10
Reduce output records=8
Spilled Records=20
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=564
CPU time spent (ms)=4300
Physical memory (bytes) snapshot=330784768
Virtual memory (bytes) snapshot=3804205056
Total committed heap usage (bytes)=211812352
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=58
File Output Format Counters
Bytes Written=66
hadoop@hadoop-VirtualBox:~$
プログラムが正常に実行されたら、HDFSに移動し、出力ディレクトリ内のパーツファイルを確認します。
以下は単語数プログラムの出力です。
hadoop@hadoop-VirtualBox:~$ hdfs dfs -cat /output/part-r-00000
This 2
first 1
is 2
mapreduce 1
my 1
program 1
test 1
wordcount 1
hadoop@hadoop-VirtualBox:~$
結論
この例はJavaであり、PythonでMapReduceプログラムを作成することもできます。 Ubuntu16.04のHadoopクラスターでHadoopMapReduceプログラムを正常に実行しました。他のLinux環境でMapreduceプログラムを実行する手順は同じです。プログラムを実行する前に、Hadoopクラスターが稼働していること、および入力ファイルがHDFSに存在していることを確認してください。