一、概念說明
“ETL
,是英文Extract-Transform-Load
的縮寫,用來描述將數據從來源端經過抽取(Extract
)、轉換(Transform
)、加載(Load
)至目的端的過程。ETL
一詞較常用在數據倉庫,但其對象并不限于數據倉庫
在運行核心業務MapReduce
程序之前,往往要先對數據進行清洗,清理掉不符合用戶要求的數據
。
清理的過程往往只需要運行Mapper程序,不需要運行Reduce程序。
Java
做過3年以上的,應該都知道,這就是過濾數據。
過濾數據,肯定要用到正則表達式
二、需求說明
日志文件
去除日志中字段個數小于等于11的日志。
三、代碼實現
WebLogDriver
package com.atguigu.mapreduce.etl;import com.atguigu.mapreduce.outputformat.LogDriver;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WebLogDriver {public static void main(String[] args) throws Exception {// 輸入輸出路徑需要根據自己電腦上實際的輸入輸出路徑設置args = new String[]{"D:/input/inputlog", "D:/hadoop/output11111"};// 1 獲取job信息Configuration conf = new Configuration();Job job = Job.getInstance(conf);// 2 加載jar包job.setJarByClass(LogDriver.class);// 3 關聯mapjob.setMapperClass(WebLogMapper.class);// 4 設置最終輸出類型job.setOutputKeyClass(Text.class);job.setOutputValueClass(NullWritable.class);// 設置reducetask個數為0job.setNumReduceTasks(0);// 5 設置輸入和輸出路徑FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));// 6 提交boolean b = job.waitForCompletion(true);System.exit(b ? 0 : 1);}}
WebLogMapper
package com.atguigu.mapreduce.etl;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class WebLogMapper extends Mapper<LongWritable, Text, Text, NullWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 1 獲取一行String line = value.toString();// 2 ETLboolean result = parseLog(line, context);if (!result){return;}// 3 寫出context.write(value, NullWritable.get());}private boolean parseLog(String line, Context context) {// 切割// 1.206.126.5 - - [19/Sep/2013:05:41:41 +0000] "-" 400 0 "-" "-"String[] fields = line.split(" ");// 2 判斷一下日志的長度是否大于11if (fields.length > 11){return true;}else {return false;}}
}