パッケージtiqu。 インポートにjava.io.IOException; 輸入java.text.ParseException。 輸入java.text.SimpleDateFormatの。 輸入java.util.Date; インポートたjava.util.Locale; 輸入org.apache.hadoop.conf.Configuration。 輸入org.apache.hadoop.fs.Path。 輸入org.apache.hadoop.io.LongWritable; 輸入org.apache.hadoop.io.NullWritable; 輸入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.input.TextInputFormat。 輸入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat。 輸入org.apache.hadoop.mapreduce.lib.output.TextOutputFormat。 パブリック クラスTiQu { パブリック 静的の クラスマップが拡張マッパー<オブジェクト、テキスト、テキスト、NullWritable> { プライベート 静的のテキストをNEWKEY = 新しいテキスト(); / * 公共ボイドマップ(オブジェクトキー、テキスト値、コンテキストコンテキスト)にIOException、例外:InterruptedExceptionをスロー{ 文字列の行= value.toString()。 System.out.println(ライン)。 文字列ARR [] = line.split(」「)。 newKey.set(ARR [1])。 context.write(NEWKEY、NullWritable.get())。 System.out.println(NEWKEY)。 } } * / 公共 ボイドマップ(オブジェクトキー、テキスト値、コンテキストコンテキスト)スローにIOException、InterruptedExceptionある{ ストリングS1 = value.toStringは(); Log Parserツールのパーサー = 新しいLog Parserツール(); 最終的な文字列[]配列= parser.parse(S1)。 System.out.println(S1)。 / *System.out.format( "解析结果:IP =%sは、時間=%S、日=%S、トラフィック=%S、タイプ=%S、ID =%s"は、 配列[0]、配列[1]、配列[2]配列[3]、配列[4]、配列[5])。 context.write(NEWKEY、NullWritable.get())。* / ストリング =配列[0 ]。 文字列Uが配列= [1 ]。 列c =配列[2 ]。 列D =配列[3 ]。 文字列E =配列[4 ]。 文字列F =配列[5 ]。 文字列str = A + " "+ U +" "+ C +" "+ D +" "+ E +"" + F。 newKey.set(STR)。 System.out.println(NEWKEY)。 低減は延び減速<テキスト、NullWritable、テキスト、NullWritable> { 公共 ボイド低減(テキストキー、反復処理可能<NullWritable> 値は、コンテキスト・コンテキスト)が スローにIOException、InterruptedExceptionある{ context.write(キー、NullWritable.getを())。 } } パブリック 静的 ボイドメイン(文字列[]引数)をスローにIOException、ClassNotFoundExceptionが、InterruptedExceptionある{ 構成CONF = 新規構成(); System.out.println( "スタート" ); ジョブジョブ = 新しい仕事(confに、「フィルタ」)。 job.setJarByClass(TiQu。クラス); job.setMapperClass(地図。クラス); job.setReducerClass(リデュース。クラス)。 job.setOutputKeyClass(テキスト。クラス); job.setOutputValueClass(NullWritable。クラス); job.setInputFormatClass(TextInputFormat。クラス); job.setOutputFormatClass(TextOutputFormat。クラス); PATHに = 新しいですパス( "HDFS:// localhostを:9000 / mymapreduce1 /中/結果" ); パスアウト = 新しいですパス( "HDFS:// localhostを:9000 / mymapreduce1 / tiqu" ); FileInputFormat.addInputPath(ジョブ、中)。 FileOutputFormat.setOutputPath(ジョブ、アウト)。 System.exit(job.waitForCompletion(真)0:1 )。 } 静的 クラス MyMapperは延び マッパー <LongWritable、テキスト、LongWritable、テキスト> { Log ParserツールLOGPARSER = 新しいLog Parserツール()。 テキストoutputValue = 新しいテキスト(); 保護された 無効マップ( LongWritableキー、 テキスト値、 org.apache.hadoop.mapreduce.Mapper<LongWritableは、テキスト、LongWritable、テキスト> .contextコンテキスト)が スローにjava.io.IOException、InterruptedExceptionが{ 最終列[]構文解析=のlogParser.parse(value.toString()); // 静的リソースアクセス要求アウトステップ1フィルタ 場合(の解析された[2] .startsWith( "GET /静的/" ) ||解析された[2] .startsWith( "GET / uc_server"の)){ リターン; } // 。ステップ2は、指定された文字列の先頭で濾別 IF(構文解析[の2] .startsWith( "GET /" )){ の構文解析[ 2] =構文解析の[2] .substring( "GET /" .LENGTH()); }(解析された[2] .startsWith( "役職 /"他 IF )){ 解析されるのは、[ 2] =構文解析の[2]( "POST /" .substring .LENGTH()); } // 。特定の文字列の末尾アウトステップ3フィルタを IFに(解析された[2] .endsWith(「HTTP /1.1 " )){ 構文解析[の 2] =構文解析の[2](0 .substring、解析された[2 ] .LENGTH() - " HTTP / 1.1 " .LENGTHは()); } // ステップ4は、3つだけが書き込まれます。アイテムの種類の記録 ([1]構文解析の解析済+ [0] + "\ T"構文解析+ [2 + "\ T" outputValue.setを]); context.write(キー、OutputValue); } } 静的 クラス MyReducerは延びて 減速を <LongWritable、テキスト、テキスト、NullWritable>{ 保護 ボイド(減らします LongWritable K2、 java.lang.Iterable <テキスト> V2が構成、 org.apache.hadoop.mapreduce.Reducer <LongWritable、テキスト、テキスト、NullWritable> .Contextコンテキスト)が スローにjava.io.IOException、InterruptedExceptionあるが{ ため(テキストV2:V2が構成){ context.write(V2、NullWritable.get())。 } }。 } / * *日志解析类 * / 静的 クラス Log Parserツール{ パブリック 静的 最終のSimpleDateFormat FORMAT = 新しいてSimpleDateFormat( "D / MMM / YYYY HH:MM:SS"、Locale.ENGLISH)。 パブリック 静的 最終てSimpleDateFormat dateformat1 = 新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS" )。 / ** *解析英文时间字符串 * * @paramの文字列 * @return * @throws はParseException * / プライベート日付parseDateFormat(文字列){ 日パース = nullを。 試す{ パース = FORMAT.parse(列)。 } キャッチ(はParseException電子){ e.printStackTrace(); } 戻り解析。 } / ** *ログイン解消行 * * @param ライン * @return 配列は、5つの要素、すなわち、IP、時間、日付、状態、流量含ま * / 公共String []型の解析(文字列ラインを) { 文字列IP = parseIP(行); 文字時間 = parseTime(行) 列日 = parseday(行); 文字列のトラフィック = parseTraffic(行); 文字列型 = parsertype(行); 文字列ID = parseid(行); リターン 新しいです文字列[] {IP、時間、日、トラフィック、タイプ、ID}。 } プライベート文字parseIP(列線){ 文字列IP = line.split( "")[0 ] .trim()。 リターンIP; } プライベート文字parseTime(列線){ 最終 INT最初= line.indexOf( "" )。 最終 int型最後= line.indexOf( "0800" ); ストリング時間 = line.substring(第+ 1 、最後).trim(); 日付日付 = parseDateFormat(時間); リターンdateformat1.format(日); } プライベート文字列parseday(列線){ 文字riqi = line.split( "")[2 ] .trim()。 リターンriqi。 } プライベート文字parseTraffic(列線){ 文字列riqi = line.split( "")[3 ] .trim()。 リターンriqi。 } // プライベート文字列parseTraffic(列線){ // 最終的な文字列のトリム= line.substring(line.lastIndexOf( "")+ 1) // .trim()。 // 文字列のトラフィック= trim.split(」「)[0]; // 戻りトラフィック; // } // プライベート文字列parsertype(列線){ // 最終INT最初= line.indexOf( "")。 // 最終int型最後= line.lastIndexOf( ""); // 文字列のURL =最初+ 1(line.substring、 // 戻りURL; // } プライベート文字列parsertype(列線){ 文字列riqi = line.split( "")[4 ] .trim()。 リターンriqi。 } プライベート文字列parseid(列線){ 最終的な文字列のトリム=(line.lastIndexOf( "")+ 1 line.substring ) .trim(); 文字列ID = trim.split(」「)[0 ]; 戻り値のID。 } } }
これは、所定のフォーマットへのデータであり、フォーマット変換時間2019年11月13日
内蔵のテーブル:
HDFSはリストにドキュメントを追加します。