过滤日志自定义日志输出路径(自定义OutputFormat)

1.需求分析

过滤输入的log日志中是否包含xyg

(1)包含xyg的网站输出到e:/xyg.log

(2)不包含xyg的网站输出到e:/other.log

2.数据准备

  1. http://www.baidu.com
  2. http://www.google.com
  3. http://cn.bing.com
  4. http://www.xyg.com
  5. http://www.sohu.com
  6. http://www.sina.com
  7. http://www.sin2a.com
  8. http://www.sin2desa.com
  9. http://www.sindsafa.com

log.txt

输出预期:

  1. http://www.xyg.com

xyg.txt

  1. http://cn.bing.com
  2. http://www.baidu.com
  3. http://www.google.com
  4. http://www.sin2a.com
  5. http://www.sin2desa.com
  6. http://www.sina.com
  7. http://www.sindsafa.com
  8. http://www.sohu.com

other.txt

3.代码实现

(1)自定义一个outputformat

  1. package com.xyg.mapreduce.outputformat;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.NullWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.RecordWriter;
  6. import org.apache.hadoop.mapreduce.TaskAttemptContext;
  7. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  8.  
  9. public class FilterOutputFormat extends FileOutputFormat<Text, NullWritable>{
  10.  
  11. @Override
  12. public RecordWriter<Text, NullWritable> getRecordWriter(TaskAttemptContext job) throws IOException, InterruptedException {
  13.  
  14. // 创建一个RecordWriter
  15. return new FilterRecordWriter(job);
  16. }
  17. }

(2)具体的写数据RecordWriter

  1. package com.xyg.mapreduce.outputformat;
  2. import java.io.IOException;
  3. import org.apache.hadoop.fs.FSDataOutputStream;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.NullWritable;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.RecordWriter;
  9. import org.apache.hadoop.mapreduce.TaskAttemptContext;
  10.  
  11. public class FilterRecordWriter extends RecordWriter<Text, NullWritable> {
  12. FSDataOutputStream atguiguOut = null;
  13. FSDataOutputStream otherOut = null;
  14.  
  15. public FilterRecordWriter(TaskAttemptContext job) {
  16. // 1 获取文件系统
  17. FileSystem fs;
  18.  
  19. try {
  20. fs = FileSystem.get(job.getConfiguration());
  21.  
  22. // 2 创建输出文件路径
  23. Path atguiguPath = new Path("e:/xyg.log");
  24. Path otherPath = new Path("e:/other.log");
  25.  
  26. // 3 创建输出流
  27. atguiguOut = fs.create(atguiguPath);
  28. otherOut = fs.create(otherPath);
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33.  
  34. @Override
  35. public void write(Text key, NullWritable value) throws IOException, InterruptedException {
  36.  
  37. // 判断是否包含“xyg”输出到不同文件
  38. if (key.toString().contains("xyg")) {
  39. atguiguOut.write(key.toString().getBytes());
  40. } else {
  41. otherOut.write(key.toString().getBytes());
  42. }
  43. }
  44.  
  45. @Override
  46. public void close(TaskAttemptContext context) throws IOException, InterruptedException {
  47. // 关闭资源
  48. if (atguiguOut != null) {
  49. atguiguOut.close();
  50. }
  51.  
  52. if (otherOut != null) {
  53. otherOut.close();
  54. }
  55. }
  56. }

(3)编写FilterMapper

  1. package com.xyg.mapreduce.outputformat;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.LongWritable;
  4. import org.apache.hadoop.io.NullWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Mapper;
  7.  
  8. public class FilterMapper extends Mapper<LongWritable, Text, Text, NullWritable>{
  9.  
  10. Text k = new Text();
  11.  
  12. @Override
  13. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  14. // 1 获取一行
  15. String line = value.toString();
  16.  
  17. k.set(line);
  18.  
  19. // 3 写出
  20. context.write(k, NullWritable.get());
  21. }
  22. }

(4)编写FilterReducer

  1. package com.xyg.mapreduce.outputformat;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.NullWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Reducer;
  6.  
  7. public class FilterReducer extends Reducer<Text, NullWritable, Text, NullWritable> {
  8.  
  9. @Override
  10. protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
  11.  
  12. String k = key.toString();
  13. k = k + "\r\n";
  14.  
  15. context.write(new Text(k), NullWritable.get());
  16. }
  17. }

(5)编写FilterDriver

  1. package com.xyg.mapreduce.outputformat;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.io.NullWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Job;
  7. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  8. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  9.  
  10. public class FilterDriver {
  11. public static void main(String[] args) throws Exception {
  12.  
  13. args = new String[] { "e:/inputoutputformat", "e:/output2" };
  14.  
  15. Configuration conf = new Configuration();
  16.  
  17. Job job = Job.getInstance(conf);
  18.  
  19. job.setJarByClass(FilterDriver.class);
  20. job.setMapperClass(FilterMapper.class);
  21. job.setReducerClass(FilterReducer.class);
  22.  
  23. job.setMapOutputKeyClass(Text.class);
  24. job.setMapOutputValueClass(NullWritable.class);
  25.  
  26. job.setOutputKeyClass(Text.class);
  27. job.setOutputValueClass(NullWritable.class);
  28.  
  29. // 要将自定义的输出格式组件设置到job中
  30. job.setOutputFormatClass(FilterOutputFormat.class);
  31.  
  32. FileInputFormat.setInputPaths(job, new Path(args[]));
  33.  
  34. // 虽然我们自定义了outputformat,但是因为我们的outputformat继承自fileoutputformat
  35. // 而fileoutputformat要输出一个_SUCCESS文件,所以,在这还得指定一个输出目录
  36. FileOutputFormat.setOutputPath(job, new Path(args[]));
  37.  
  38. boolean result = job.waitForCompletion(true);
  39. System.exit(result ? : );
  40. }
  41. }

Hadoop案例(五)过滤日志及自定义日志输出路径(自定义OutputFormat)的更多相关文章

  1. Flink FileSink 自定义输出路径——StreamingFileSink、BucketingSink 和 StreamingFileSink简单比较

    接上篇:Flink FileSink 自定义输出路径——BucketingSink 上篇使用BucketingSink 实现了自定义输出路径,现在来看看 StreamingFileSink( 据说是S ...

  2. Hadoop案例(一)之日志清洗

    日志清洗案例 一. 简单解析版 1)需求 去除日志中字段长度小于等于11的日志. 2)输入数据 /Sep/::: +] "-" "Mozilla/4.0 (compati ...

  3. 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)

    1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...

  4. 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)

    1.简介 前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar.log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的 ...

  5. log4j分离日志输出 自定义过滤 自定义日志文件

    普通的log4j.properties 定义: ### set log levels ### log4j.rootLogger = debug,D,E ## Disable other log log ...

  6. ELK收集Nginx自定义日志格式输出

    1.ELK收集日志的有两种常用的方式: 1.1:不修改源日志格式,简单的说就是在logstash中转通过 grok方式进行过滤处理,将原始无规则的日志转换为规则日志(Logstash自定义日志格式) ...

  7. ATS配置自定义日志

    修改records.config,开启日志自定义功能 更改日志目录,默认日志存放在/var/log/trafficserver: CONFIG proxy.config.log.logfile_dir ...

  8. SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!

    往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...

  9. Nginx日志配置及日志分析脚本案例

    https://blog.csdn.net/bbwangj/article/details/82186162 nginx的log日志分为access log 和 error log 其中access ...

随机推荐

  1. 据说要写一个CTSC&APIO的收获

    就不写流水帐了,总的写一下吧.先从最浅显的地方开始——知识.大概被普及了一发带花树,算上自己的考试,还被普及了一发洲阁筛.当然更多的还是对于一些知识的强化,比如:乱搞(这东西真是太重点了啊).DP.数 ...

  2. Myeclipse下配置SVN报错问题 svn: E175002: java.lang.RuntimeException: Could not generate DH keypair,缺少subclipse插件的javaHL

    在myeclipse10.0下安装svn插件,出现了Could not generate DH keypair,这么一个错误. 看到了一篇博客说是svn接口选择问题,可是我myeclipse没有那个接 ...

  3. Uiautomator 快速调试

    UiAutomatorHelper使用      1.介绍:     他是一种可以快速调试的方法:其本身也是java问津相当于自动化脚本,查看该文件,其主要实现的功能如下         1.创建bu ...

  4. Kubernetes 1.5部署sonarqube

    前面几篇博文我们一直在说kubernetes的基础环境的安装及部署.在基础环境部署完成以后,我们开始尝试使用kubernetes来管理我们的应用.本篇博文通过一个简单的示例来向大家展示如何通过depl ...

  5. 生存分析/Weibull Distribution韦布尔分布

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...

  6. OpenCV---分水岭算法

    推文: OpenCV学习(7) 分水岭算法(1)(原理简介简单明了) OpenCV-Python教程:31.分水岭算法对图像进行分割(步骤讲解不错) 使用分水岭算法进行图像分割 (一)获取灰度图像,二 ...

  7. MakeDown的使用

    Makedown的使用 之前有用博客园来写博客,但是因为它的界面不好看,所以中途就放弃了.后来也使用过"有道云笔记",发现其写的笔记的界面很简洁工整.有道云笔记的书写原理和Make ...

  8. 1.ideal常用快捷键

    Alt+回车 导入包,自动修正Ctrl+N   查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L  格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如ge ...

  9. 课程设计——利用信号量实现生产者-消费者问题(java)

    package cn.Douzi.ProductConsume; import java.util.LinkedList; import java.util.Queue; import java.ut ...

  10. [Luogu 2486] SDOI2011 染色

    [Luogu 2486] SDOI2011 染色 树剖水题,线段树维护. 详细题解不写了. 我只想说我写的线段树又变漂亮了qwq #include <algorithm> #include ...