実験の目的
設計原理のMapReduceの1.正確な理解
2.マスタコード書き込まWORDCOUNT
3.独自のプログラムWORDCOUNT単語頻度統計を書くことを学びます
原則
MapReduceのは、「分割統治」の考え方を使用して、管理下ノードに分散大きなデータセットの操作は、各ノードの中間結果の統合により、最終的な結果をマスタノードを完了しました。簡単に言えば、MapReduceは「分解の概要とタスクの結果」です。
1.MapReduceの作品
分散コンピューティング、分散ストレージに並列プログラミングに対処するためのMapReduceフレームワーク、ジョブスケジューリング、複雑な問題、フォールトトレランスとネットワーク通信の負荷分散、そして今、我々は二つの部分に抽象度の高いプロセスに対処詳しく説明し、地図と削減でまとめると、複数のサブタスクの分解処理結果を削減する部分を担当する複数のサブタスクに前記地図セクション責任タスク、次のように、特定の設計アイデアがあります。
(1)地図org.apache.hadoop.mapreduce継承プロセスは、パッケージマッパークラス、メソッドを必要とし、そのマップをオーバーライドします。キー値と、コンソールのコード値に2つの値を加算することにより、地図出力処理は、テキストファイルの行(行は改行マークで終了)に入力されたマップ値価値保存方法で発見することができキー値記憶された入力線は、テキストファイルへの最初のオフセットアドレスに対しての最初の文字です。StringTokenizerはクラスとフィールドの行に各分割、フィールドカットを必要とする(この実験で買い手IDフィールドである)キーを設定し、マップ方式として結果を出力します。
(2)プロセスを削減継承クラスorg.apache.hadoop.mapreduce減速パッケージを必要とし、そのオーバーライドメソッドを減らします。マッププロセス出力<キー、値>の値でグループ化キー値の同じ値のすべての値を介して、最初のキー処理シャッフルの対は、この場合は、その後<キー、値、構成キーフィールドのカウント値に対応する値のリストであります>入力方法は、低減方法は、値を横断した回数の合計ワードを得るために合計する限り低減します。
()主な新ジョブオブジェクトの主な機能は、ジョブオブジェクトによってコンピューティングタスクは、MapReduceの管理・運用を担当し、そして仕事の方法により、タスクに関連するパラメータを設定します。この実験は、取り扱い中地図完了を継承したクラスの仕上げ加工工程を削減doReducerを使用しますdoMapperマッパークラスを使用して設定しました。また、出力タイプマップを提供し、処理手順を削減:Text型、タイプIntWritableの値のキーを。入力パス文字列で指定された出力タスク、およびFileInputFormat FileOutputFormatによっては設定されています。タスクは、パラメータの設定が完了したら、タスクを実行するためにjob.waitForCompletion()メソッドを呼び出すことができ、残りの作業は、MapReduceのフレームワークプロセスに引き渡されます。
2.MapReduce プロセスフレームワークを実行するジョブ
(1)のResourceManager:糸リソースを一元管理し、クラスタ内のすべてのリソースの割り当てを担当する中央モジュール制御フレームワークです。それはNM(ノードマネージャ)、AMの設立からの報告を受け、資源AM(ApplicationMaster)に送信されます。
(2)ノードマネージャ:短いNMは、ノードマネージャは、コンテナ管理に責任を各マシン上のResourceManager剤である、とリソース(CPU、メモリ、ディスク、ネットワークなど)の使用を監視し、このResourceManagerに報告するこれらのリソースを使用します。
(3)ApplicationMaster:以下、AMと呼びます。YARN各アプリケーションは、AMを開始します、RMは、コンテナ、コンテナと何かをするように言わを開始するNM要求資金を申請する責任があります。
(4)コンテナ:コンテナ・リソース。YARNすべてのアプリケーションは、コンテナで実行されています。AMはまた、コンテナで実行されているが、AMはコンテナRMアプリケーションです。コンテナは、リソース(CPUおよびメモリリソースカテゴリ)の一定量にノードをカプセル化し、リソース糸の抽象化です。コンテナApplicationMaster ApplicationMasterに非同期ResouceManagerにリソーススケジューラによって割り当てられるのResourceManagerアプリケーション、へ。ノードマネージャ内部タスクのコマンドを提供する必要性によって開始されたリソースが必要な環境を実行するためにコンテナランタイム(C ++のコマンドは、プロセスを開始することができ、そのようなJavaの、Pythonのように、任意のコマンドすることができます)などのコマンドを実行しApplicationMasterによって運営コンテナ変数と(例えば辞書ファイル、実行可能ファイル、jarファイルのパッケージなど)外部リソース。
次のように、さらに、所望のアプリケーションコンテナは、2つのカテゴリに分けます。
①コンテナの実行ApplicationMaster:これはこのResourceManager(リソーススケジューラの内部)であり、ユーザーがアプリケーションを提出する際に、アプリケーションを起動し、あなただけのApplicationMaster必要なリソースを指定することができます。
②タスクコンテナのすべての種類を実行します。これは、このResourceManager ApplicationMasterアプリケーションによるもので、起動にノードマネージャApplicationMasterと通信します。
コンテナのカテゴリは、上記の任意のノードであってもよく、それらの一般的な位置は、それがノード上で実行されているApplicationMaster管理タスクに関連することができること、ランダムです。
実験環境
Ubuntu Linuxの14.0
JDK-7u75-linuxの - のx64
Hadoopの-2.6.0-cdh5.4.5
Hadoopの-2.6.0-日食-cdh5.4.5.jar
EclipseベースのJava-JUNO-SR2-のlinux-gtkの-x86_64版
ウェブテスト
商品のための電気の供給業者のウェブサイトにユーザーデータの収集を既存のユーザIDと商品回収日のコレクションと呼ばれるbuyer_favorite1を記録します。
buyer_favorite1あって、次のように買い手ID、製品ID、これらの三つのフィールド、データ「\ tの」スプリットの採取日、およびサンプルデータ形式は、次のとおりです。
- 商品の回収日のID IDバイヤー
- 10181 1000481 2010-04-04 16時54分31秒
- 20001 1001597 2010-04-07午後三時07分52秒
- 20001 1001560 2010-04-07 15時08分27秒
- 20042 1001368 2010-04-08 8時20分30秒
- 20067 1002061 2010-04-08午前16時45分33秒
- 20056 1003289 2010年4月12日午前10時50分55秒
- 20056 1003290 2010年4月12日午前11時57分35秒
- 20056 1003292 2010年4月12日午前12時05分29秒
- 20054 1002420 2010年4月14日15時24分12秒
- 20055 1001679 2010年4月14日夜07時46分04秒
- 20054 1010675 2010年4月14日午後03時23分53秒
- 20054 1002429 2010年4月14日午後05時52分45秒
- 20076 1002427 2010年4月14日午後7時35分39秒
- 20054 1003326 2010年4月20日12時54分44秒
- 20056 1002420 2010年4月15日11時24分49秒
- 20064 1002422 2010年4月15日11時35分54秒
- 20056 1003066 2010年4月15日午前11時43分01秒
- 20056 1003055 2010年4月15日11時43分06秒
- 20056 1010183 2010年4月15日午前11時45分24秒
- 20056 1002422 2010年4月15日11時45分四十九秒
- 20056 1003100 2010年4月15日11時45分54秒
- 20056 1003094 2010年4月15日午前11時45分57秒
- 20056 1003064 2010年4月15日11時46分04秒
- 20056 1010178 2010年4月15日16時15分20秒
- 20076 1003101 2010年4月15日16時37分27秒
- 20076 1003103 2010年4月15日夜04時37分05秒
- 20076 1003100 2010年4月15日夜四時37分18秒
- 20076 1003066 2010年4月15日16時37分31秒
- 20054 1003103 2010年4月15日16時40分14秒
- 20054 1003100 2010年4月15日16時40分16秒
要件のMapReduceプログラム、各買い手のための物品の統計的なコレクションの数を書きます。
次のように統計データは以下のとおりです。
- イド量のバイヤー
- 10181 1
- 20001 2
- 20042 1
- 20054 6
- 20055 1
- 20056 12
- 20064 1
- 20067 1
- 20076 5
実験手順
/アプリケーション/ Hadoopの/ sbinに、スタートのHadoop 1.ディレクトリに移動します。
- CD /アプリケーション/ Hadoopの/ sbinに
- ./start-dfs.sh
Linux上で2.ディレクトリ/データ/ mapreduce1を作成します。
- ます。mkdir -p /データ/ mapreduce1
3.次/データ/ mapreduce1ディレクトリに切り替え、テキストファイルbuyer_favorite1の地位を確立。
それでも/データ/ mapreduce1ディレクトリに、から、wgetのコマンドを使用します。
ネットワーク・ダウンロード・hadoop2lib.tar.gz、ダウンロード用のプロジェクトの依存関係。
カレントディレクトリにhadoop2lib.tar.gzエキス。
- タール-xzvf hadoop2lib.tar.gz
4.ローカルのLinux /データ/ mapreduce1 / buyer_favorite1、ディレクトリに/ HDFS上の/ mymapreduce1にアップロード。HDFSのディレクトリが存在しない場合は、事前に作成します。
- FS -mkdir -p / mymapreduce1 / Hadoopの中
- HadoopのFS -put /データ/ mapreduce1 / buyer_favorite1 / mymapreduce1 / 中
5. Eclipseを開き、mapreduce1に新しいJavaプロジェクトプロジェクトとプロジェクト名。
プロジェクト名mapreduce1、およびMapReduceの名前の新しいパッケージパッケージパッケージの下6
作成したパッケージのMapReduce、新しいクラスとクラス名WORDCOUNT 7.。
8.プロジェクトに必要な依存JARパッケージを追加し、右クリックして、プロジェクト名を項目のjarパッケージを格納するために必要な新しいディレクトリhadoop2libを作成します。
上位のlinux / / mapreduce1ディレクトリの下のデータ、ディレクトリhadoop2libすべての日食、hadoop2libのmapreduce1プロジェクトディレクトリにコピー瓶、。
hadoop2libディレクトリの下にあるすべてのjarパッケージを選択し、右クリックして、ビルド・パスを選択=>ビルドパスに追加
9. Javaコードを記述し、そのデザインのアイデアを説明します。
次の図は、MapReduceのの実行を示しています
一般的な考え方は、テキストとして、テキストのInputFormatうMapReduceのを通してスライスへの入力としてHDFSテキスト、およびキーと値のペアの入力キーとしてテキストファイルの最初のアドレスに対してオフセット各行の最初の文字でありますキーと値のペアを入力し、処理されたマップ機能で、中間結果<ワード、1>フォーム、および軽減機能の各単語のための完全な周波数の統計情報を出力します。マッパー部分と部分の減速:全体のプログラムコードは、2つの部分から構成されています。
マッパーコード
- パブリック 静的 クラス doMapperが 延びている マッパーを<オブジェクト、テキスト、テキスト、IntWritable> {
- //オブジェクトは、キー入力の第一のタイプを表し、入力の第二のタイプは、テキストの値を示し、テキストは第3の出力は、結合の種類を示す表す第4の出力値型IntWritableを表します
- パブリック 静的 最終 IntWritable 1 = 新しい IntWritable(1)。
- 公共の 静的な テキスト・ワード= 新しい テキスト();
- @オーバーライド
- 保護された 無効 マップ(オブジェクトキー、テキスト値、コンテキストコンテキスト)
- スロー にIOException、InterruptedExceptionが
- //例外を投げます
- {
- StringTokenizerはトークナイザ= 新しい StringTokenizerは(value.toString()、 "\ tの");
- // StringTokenizerは、文字列の分割のためのJavaベースのツールキットです
- word.set(tokenizer.nextToken())。
- //間で区切られた次の文字列に現在位置を返します。
- context.write(ワード、1);
- //コンテナに単語を保存し、数に言及
- }
3つのマップ関数のパラメータ、フロント2つのオブジェクトキーがあり、テキスト値が入力されたキー値、第3のパラメータコンテキストコンテキスト値が入力され、レコード・キーです。例えばcontext.write(単語、1つ);他にもマップコンテキスト状態オペレーションを記録しました。Hadoopのジョブ入力のデフォルトモードを使用して位相マップは、買い手IDフィールドから取り出さStringTokenizerは()メソッドで入力値は、1に、出力直接<キー、値>設定キー、値に設定されます。
減速コード
- パブリック 静的 クラス doReducerが 延び 減速<テキスト、IntWritable、テキスト、IntWritable> {
- 同じパラメータを持つ//マップは、次に、入力キーの種類、入力値の種類、キータイプの出力、タイプの出力値を示します
- プライベート IntWritable結果= 新しい IntWritable();
- @オーバーライド
- 保護された 無効 削減(テキストキーを、反復処理可能<IntWritable>値、コンテキストコンテキスト)
- スロー にIOException、InterruptedExceptionが{
- int型の 合計= 0;
- 用 (IntWritable値:値){
- 和+ = value.get()。
- }
- //ループトラバースため、累積値の値が得られます
- result.set(合計)。
- context.write(キー、結果);
- }
- }
地図出力<キー、値>まず、すべてのプロセスを介して端を低減する<キー、値>を形成するために一緒に凝集し、同じキー値をシャッフルしなければなりません。後の低減は、出力に直接、キーのコピーキー入力を<キー、値>を受信し、合計値をループするために、結果は、それが値に設定され、単語が表示される代表キー値回数の合計であります、ダイレクト出力<キー、値>。
完全なコード
- パッケージ のMapReduce。
- インポート にjava.io.IOException;
- 輸入 java.util.StringTokenizer。
- 輸入 org.apache.hadoop.fs.Path。
- 輸入 org.apache.hadoop.io.IntWritable;
- 輸入 org.apache.hadoop.io.Text;
- 輸入 org.apache.hadoop.mapreduce.Job。
- 輸入 org.apache.hadoop.mapreduce.Mapper;
- 輸入 org.apache.hadoop.mapreduce.Reducer。
- 輸入 org.apache.hadoop.mapreduce.lib.input.FileInputFormat。
- 輸入 org.apache.hadoop.mapreduce.lib.output.FileOutputFormat。
- パブリック クラス WORDCOUNT {
- パブリック 静的 ボイド メイン(文字列[]引数)が スロー にIOException、ClassNotFoundExceptionが、InterruptedExceptionあるが{
- ジョブジョブ= Job.getInstance();
- job.setJobName( "WORDCOUNT");
- job.setJarByClass(WORDCOUNT。クラス);
- job.setMapperClass(doMapper。クラス);
- job.setReducerClass(doReducer。クラス);
- job.setOutputKeyClass(テキスト。クラス);
- job.setOutputValueClass(IntWritable。クラス);
- パス で = 新しい パス( "HDFS:// localhostを:9000 / mymapreduce1 /中/ buyer_favorite1");
- パスアウト= 新しい パス( "HDFS:// localhostを:9000 / mymapreduce1 /アウト");
- (仕事、FileInputFormat.addInputPath で)。
- FileOutputFormat.setOutputPath(ジョブ、アウト)。
- System.exit(job.waitForCompletion(真)0:1)。
- }
- パブリック 静的 クラス doMapperが 延びている マッパーを<オブジェクト、テキスト、テキスト、IntWritable> {
- パブリック 静的 最終 IntWritable 1 = 新しい IntWritable(1)。
- 公共の 静的な テキスト・ワード= 新しい テキスト();
- @オーバーライド
- 保護された 無効 マップ(オブジェクトキー、テキスト値、コンテキストコンテキスト)
- スロー にIOException、InterruptedExceptionが{
- StringTokenizerはトークナイザ= 新しい StringTokenizerは(value.toString()、 "\ tの");
- word.set(tokenizer.nextToken())。
- context.write(ワード、1);
- }
- }
- パブリック 静的 クラス doReducerが 延び 減速<テキスト、IntWritable、テキスト、IntWritable> {
- プライベート IntWritable結果= 新しい IntWritable();
- @オーバーライド
- 保護された 無効 削減(テキストキーを、反復処理可能<IntWritable>値、コンテキストコンテキスト)
- スロー にIOException、InterruptedExceptionが{
- int型の 合計= 0;
- 用 (IntWritable値:値){
- 和+ = value.get()。
- }
- result.set(合計)。
- context.write(キー、結果);
- }
- }
- }
10. WORDCOUNTクラスファイル、右クリック=> Run As(実行)=> Hadoopのオプションで実行、中のHadoopのMapReduceタスクに提出されます。
11.終了、またはプログラム出力の端子プラグのHadoop日食、HDFSビュー、結果を開くことができます。
DFSの場所で表示一部-R-00000ファイル