簡単な例を使用して、MapReduceとは何かを説明できます。
各単語が大きなファイルに表示される回数をカウントしたいと考えています。ファイルが大きすぎるため。このファイルを小さなファイルに分割してから、複数の人をカウントするよう手配します。このプロセスは「マップ」です。次に、各人がカウントする数値をマージすると、これは「減少」です。
MapReduceで上記の例を実行する場合、ファイルをいくつかの独立したデータブロックに分割し、異なるマシンノードに分割するタスクジョブを作成する必要があります。次に、異なるノードに散在するマップタスクを介して完全に並行して処理します。 MapReduceはマップの出力ラインを収集し、結果出力を送信して処理の次のステップを削減します。
タスクの特定の実行プロセスには、MapReduceの実行プロセスのすべてのタスクを調整する責任のある「JobTracker」と呼ばれるプロセスがあります。いくつかのタスクトラッカープロセスを使用して、マップタスクを個別に実行し、タスクの実行をいつでもジョブトラッカーに報告します。タスクトラッカーがタスクを報告するか、長い間独自のタスクを報告しなかった場合、JobTrackerは別のタスクトラッカーを起動して、個別のマップタスクを再実行します。
(1)次のようにJARパッケージに依存して、Eclipseの下で関連するMavenプロジェクトを作成します(Hadoopソースコードパッケージの下でHadoop-Mapreduce-ExamplesプロジェクトのPOM構成を参照することもできます)
注:Mavenプラグインを構成するには、Maven-Jar-Pluginを指定し、Mainclassを指定します
<Dependencies> <Dependency> <groupId> junit </groupid> <artifactid> junit </artifactid> <version> 4.11 </version> </dependency> <expendency> org.apache.hadoop </groupid> <artifactid> hadoop-mapreduce-creient-core < <groupid> org.apache.hadoop </groupid> <artifactid> hadoop-common </artifactid> <version> 2.5.2 </version> </dependency> </dependencies> <build> <blubins> <blubin> <groupin> org.apache.maven.plugins </groupid> <artifactid> <artifactid> maven-jar-oppugin <Archive> <Manifest> <Mainclass> com.xxx.demo.hadoop.wordcount.wordcount </mainclass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
(2)MapReduceの操作メカニズムによると、ジョブは、マップロジック、ロジックを削減、ジョブスケジューリングの3つのことを完了するために、少なくとも3つのクラスを記述する必要があります。
MAPのコードは、org.apache.hadoop.mapreduce.mapperクラスを継承できます
public static class tokenizermapperは、mapper <object、text、text、intwritable> {private final static intwritable one = new intwritable(1);プライベートテキストword = new Text(); //この例はキーパラメーターを使用しないため、キーのタイプは、オブジェクトパブリックマップ(オブジェクトキー、テキスト値、コンテキストコンテキスト)として単純に指定されます。 while(itr.hasmoretokens()){word.set(itr.nexttoken()); context.write(word、one); }}}Reduceのコードは、org.apache.hadoop.mapreduce.ducerクラスを継承できます
Public Class Intsumreducerは、Reducer <Text、intwritable、Text、intwritable> {private intwritable result = new intwritable(); public void reduce(テキストキー、iterable <intwrita>値、コンテキストコンテキスト)がioexception、arturtedexception {int sum = 0; for(intwritable val:values){sum += val.get(); } result.set(sum); context.write(key、result); }}ジョブスケジューリングのメイン方法を記述します
public static void main(string [] args)throws exception {configuration conf = new Configuration();ジョブジョブ= job.getInstance(conf、 "word count"); job.setjarbyclass(wordcount.class); job.setmapperclass(tokenizermapper.class); job.setcombinerclass(intsumreducer.class); job.setReducerclass(intsumreducer.class); job.setOutputKeyclass(text.class); job.setOutputValueClass(intwritable.class); fileinputformat.addinputpath(job、new Path(args [0])); fileoutputformat.setOutputPath(job、new Path(args [1])); job.waitforcompletion(true); //system.exit(job.waitforcompletion(true)?0:1); }MVNインストールを実行して、プロジェクトをJARファイルに入力し、Linuxクラスター環境にアップロードします。 HDFS DFS -MKDIRコマンドを使用して、HDFSファイルシステムに対応するコマンドを作成します。 HDFS DFS -PUTを使用して、HDFSシステムに処理する必要があるデータファイルをアップロードします。例:HDFS DFS -put $ {linux_path/data file} $ {hdfs_path}
クラスター環境でコマンドを実行する:Hadoop Jar $ {linux_path} /wordcount.jar $ {hdfs_input_path} $ {hdfs_output_path}
HDFS DFS -CAT $ {HDFS_OUTPUT_PATH}/出力ファイル名
上記の方法は、Hadoopクラスター環境が開始されないときにローカルモードで実行されます。現時点では、HDFも糸も機能しません。以下は、擬似分散モードでMapReduceジョブを実行するときに行う必要がある作業です。まず、公式ウェブサイトにリストされている手順を抜粋します。
ホスト名を構成します
# vi /etc/sysconfig/network
例えば:
Networking = yeshostname = mastervi /etc /hosts
次のコンテンツを入力します
127.0.0.1 localhost
パスワードの相互通信なしでSSHを構成します
ssh-keygen -t rsa
# cat?~/.ssh/id_rsa.pub?>>?~/.ssh/authorized_keys
core-site.xmlファイル($ {hadoop_home}/etc/etc/hadoop/
<configuration> <property> <name> fs.defaultfs </name> <value> hdfs:// localhost:9000 </value> </property> </configuration>
hdfs-site.xmlファイルを構成します
<configuration> <property> <name> dfs.replication </name> <balue> 1 </value> </property> </configuration>
次のコマンドは、スタンドアロンの擬似分布モードでMapReduceジョブを実行できます
1.ファイルシステムを参照:
$ bin/hdfs namenode -format
2.NameNodeデーモンとDatAnodeデーモンを開始:
$ sbin/start-dfs.sh
3. Hadoopデーモンログ出力は、$ hadoop_log_dirディレクトリに書き込まれます(デフォルトは$ hadoop_home/logsになります)。4. NAMENODEのWebインターフェイスを閲覧します。デフォルトでは、以下で利用できます。
namenode -http:// localhost:50070/
MapReduceジョブを実行するために必要なHDFSディレクトリを作成します。
$ bin /hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir/user/<username>
5.入力ファイルを分散ファイルシステムにコピーします。
$ bin/hdfs dfs -putなど/hadoop入力
6.提供されている例のいくつかを実行します。
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.5.2.jar grep出力 'dfs [az。]+'
7.出力ファイルを編集します。
分散ファイルシステムからローカルファイルシステムに出力ファイルをコピーして、それらを調べます。$ bin/hdfs dfs-出力出力
$ cat output/*
または分散ファイルシステムで出力ファイルを表示します。
$ bin/hdfs dfs -cat output/*
8.完了したら、次のことでデーモンを止めます
$ sbin/stop-dfs.sh
上記は、この記事のWordCountインスタンスコードのコンテンツ全体です。誰にとっても役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!