A:MapReduceの思考
(A)MapReduceの問題
1.クラスタ内のノードに分散したコードを達成するための方法、およびそれらを実行する方法
2.指定されたマシンが稼働したコードの配布
ノードの動作の3リアルタイム監視
4.結果が要約されている方法
要するに:私たちの単純なビジネス・ロジックを簡単に大量のデータに分散コンピューティング環境に拡張します
(B)基本的な概念と、プログラムロジックの調製のMapReduce
MapReduceのプログラムの実行プロセスを2つの段階に分けられます:マッパーと減速ステージのステージ
含まマッパー段階:
1>、入力ファイルのパスを指定し、入力ファイルと論理的にデータの分割片を複数に分割。その後スライス入力キーと値のペア<K1、V1>に分解、k1は、多くの場合、v1は一定のルールに従ってテキストの行の内容で、私たちは、開始オフセットと言われています。 各キーと値のペア<K1、V1>マップ関数がいったん呼び出される前記2>その調製をマッピングする関数呼び出しを、<K1、V1>へのキー入力は、<K2、V2>キーと値のペアに変換します。 3>出力キー値<K2、V2>分割、パケットがそれらとセットに同じキー値であり、グループ化、ソート。 ローカルマージ処理(合成)に4>(オプション)データパケット。
含ま減速段階:
5>マッパー出力する複数のタスクから、異なるパーティションに応じて、出力マッパー複数のタスク続いて異なる減速治療上のネットワーク・ノードをコピーするには、組み合わされ順序付けされます。 6>関数呼び出しは、それらの調製を低減するために、キーと値のペアに変換<K2、V2が構成へのキー入力> <K3、V3>
7>リデューサーは、タスクは、指定したファイルに出力を保存します。
2:WORDCOUNTプログラム実現
書き込み()マッププログラム
cn.hadoop.mr.wcパッケージ; インポートにjava.io.IOException; インポートorg.apache.commons.lang.StringUtils; インポートorg.apache.hadoop.io.LongWritable; インポートorg.apache.hadoop.io.Text; インポートorg.apache.hadoop.mapreduce.Mapper; //ジェネリック第4、第1マッパーの二つは、入力データ・タイプを指定マッパーデータ型の2つの出力 される//マップとデータの入出力を減らしますカプセル化に<K、V>キーと値のペアの形式で //デフォルト、マッパーデータ入力、テキスト値は行の内容であり、キー列が開始オフセット処理される パブリック クラス WCMapperマッパー延び<LongWritableを、テキスト、テキスト、LongWritable> { @Override //カスタム・データ・タイプは、ネットワークの伝送効率を向上させるためにコーディング冗長データネットワークに表示されません。機能は、クラスタのデータ通信改善 保護 のボイドマップ(LongWritableキー、テキスト値を、マッパー<LongWritable、テキスト、テキスト、LongWritable> .contextコンテキスト) IOExceptionが、例外:InterruptedExceptionをスロー{ // 行の内容を取得する 文字列LINEVAL = value.toStringを(); // 区切りによるテキストセグメンテーションのこの行 文字列の単語[] = StringUtils.split(LINEVAL、" " ); / / 出力モード<K、V>フォームに反復、 のために(文字列ワード:ワード){ // 出力データがコンテキストに書き込まれる (context.write 新しい新しいテキスト(ワード)、新しい新しい LongWritable(1 )); } / /実際に<kは、V>書き込みクラスタ・ノードに送信されますが、キャッシュから送出されたクラスのデータを完全に横断した後、同じキーは、ありません //結果は<K、<V1、V2の形で送信され、実際の形式は<Kである、V3、...、VN >>、<1,1,1,1,1、...、1 >> } }
書き込み(b)のプログラムを削減
パッケージcn.hadoop.mr.wc; インポートにjava.io.IOException; 輸入org.apache.hadoop.io.LongWritable; 輸入org.apache.hadoop.io.Text; 輸入org.apache.hadoop.mapreduce.Reducer; パブリック クラス WCReducerは減速が<テキスト、LongWritableは、テキスト、LongWritable>が延び{ @Overrideが 保護 ボイド低減(テキストキー、反復処理可能<LongWritable> の値、 減速 <テキスト、LongWritable、テキスト、LongWritable> .Contextコンテキストが)にIOException、InterruptedExceptionある{スロー 長いですカウント= 0 ; // 遍历値、统计每个キー出现的总次数 ため(LongWritable値:値){ COUNT。+ =値GET (); } // 出力統計そのワード context.write(キー、新しい新LongWritable(COUNT)); } }
(C)ジョブを生成するには、クラスター・マップに提出し、低減され
パッケージcn.hadoop.mr.wc; インポートにjava.io.IOException; 輸入org.apache.hadoop.conf.Configuration。 輸入org.apache.hadoop.fs.Path。 輸入org.apache.hadoop.io.LongWritable; 輸入org.apache.hadoop.io.Text; 輸入org.apache.hadoop.mapreduce.Job。 輸入org.apache.hadoop.mapreduce.lib.input.FileInputFormat。 輸入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat。 パブリック クラスWCRunner { 公共 静的 ボイドメイン(文字列[]引数)がスローにIOException、ClassNotFoundExceptionが、InterruptedExceptionある{ 構成CONF = 新しい構成(); 仕事wcjob =Job.getInstance(CONF); //それらジャーパッケージで使用されることがジョブ全体のクラス設定 wcjob.setJarByClass(WCRunner.classを); //マッパージョブクラスのセットと減速が使用 wcjob.setMapperClass(WCMapper.class)を、 wcjob.setReducerClass(WCReducer.class); //マップを設定し、出力クラス減らす wcjob.setOutputKeyClass(Text.class)を、 wcjob.setOutputValueClass(LongWritable.class); //このマップは、別々に出力データk、V型を提供することができます。上記のタイプが異なる場合、次のように有用である wcjob.setMapOutputKeyClass(Text.class); wcjob.setMapOutputValueClass(LongWritable.class); パス//指定された入力データを処理するための格納された FileInputFormat.setInputPaths(wcjob、新しいパス( " / WC / INPUT /「)); //指定されたストレージパス出力構造 FileOutputFormat.setOutputPath(wcjob、新しい新しいパス(「/ WC /出力」)); //ジョブが実行中のクラスタに提出される wcjob.waitForCompletion(真の); //パス引数は次のとおりです。プログラムのステータスと進行状況を表示するかどうか } }
(D)補助
マップを実行し、削減するために、あなたはまた、フォルダの下に、インポートのjarパッケージのMapReduceファイル共有フォルダに必要
(E)輸出のjarパッケージ
(VI)の実験的試験
1.実験データ
ハローキティハローマーク バイキティ 良い朝 セイこんにちはシステムパスの Hostsファイル を開き、ファイルを こんにちはssyfj 取得アクセス 取得デフォルト
HDFSシステムへ2.アップロード
ファイル入力ディレクトリを作成します。
HadoopのFS -mkdir -p / WC /入力/
アップロードは、入力ディレクトリにファイル
HadoopのFS -put wcdata.txt / WC /入力/
注:結果出力ディレクトリを作成しないでください、またはエラーになります
データ解析のための3コールプログラム
Hadoopのジャーwc.jar cn.hadoop.mr.wc.WCRunner
私たちの輸出のjarパッケージをwc.jar、cn.hadoop.mr.wc.WCRunnerは、私たちが実行メインクラスです
4.チェック結果
3:Hadoopのローカルテスト
(A)プロジェクトに(依存JARライブラリLIBパケットを含む)HDFS、MapReduceの、糸ジャーパケットを導入
(B)スレッド「メイン」のjava.lang.NullPointerExceptionの問題で解決例外(二つの方法)
メインクラスのmainメソッドの先頭に1を追加WCRunner
するSystem.setProperty(" hadoop.home.dir "、" E:\\ Hadoopの\\のHadoop-2.7.1 " )。
環境変数を追加します。2.
(C)は、ホームディレクトリのHadoop下のbinディレクトリに以下のファイルを入手します
ダウンロード:https://github.com/steveloughran/winutils/tree/master/hadoop-2.7.1
Cへのbinディレクトリ内のすべてのファイルをインポートする(D):\ WINDOWS \ System32ディレクトリ
(E)の結果は見ます
(VI)Eclipseの実行にHadoopを解決するために、ログには、問題が表示されません
一般的に次のことが発生します。MapReduceの進捗情報は表示されません。
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
这种情况一般是由于log4j这个日志信息打印模块的配置信息没有给出造成的,可以在项目的src目录下,新建一个文件,命名为“log4j.properties”,填入以下信息:
log4j.rootLogger = INFO、STDOUT log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern =%D%P [ %のC] - %M%N log4j.appender.logfile = org.apache.log4j.FileAppender log4j.appender.logfile.File =目標/ spring.log log4j.appender.logfile.layout = org.apache.log4j.PatternLayout のlog4j .appender.logfile.layout.ConversionPattern =%D%P [%のC] - %のm個の%nを