高校网站建设滞后河南网站开发公司
map阶段:按行读入内容,对内容进行检查,如果字段的个数少于等于11,就删除这条日志(不保留)去除日志中字段个数小于等于11的日志内容。
<偏移量,第一行的内容> → <通过刷选之后的第一行的内容,null>
reduce阶段:不需要进行汇总。
1.编写WebLogMapper类
package com.root.mapreduce.weblog;
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;public class WebLogMapper extends Mapper<LongWritable, Text, Text, NullWritable>{ @Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 1. 获取一行数据,使用空格进行拆分,判断是否有9个字段String[] fields = value.toString().split(" ");if (fields.length > 7) {// 这条数据是有意义的,保留System.out.println(fields[0]);context.write(value, NullWritable.get());} else {// 这条数据是无意义的,不保留return;}
}
}
代码说明:NullWritable就等价于null,context.write(value,NullWritable.get())就表示只有key,没有value。
2.编写WebLogDriver类
package com.root.mapreduce.weblog;
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 { // 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("E:\\vm\\web.log"));FileOutputFormat.setOutputPath(job, new Path("E:\\vm\\ouput2"));// 6 提交boolean b = job.waitForCompletion(true);System.exit(b ? 0 : 1);}
}
代码说明:reduceTask为0,表示没有reduce阶段,程序会根据Map函数的结果把内容输出。最终输出的文件个数与mapperTask的数量一致。