Hadoop案例(五)过滤日志及自定义日志输出路径(自定义OutputFormat)
过滤日志及自定义日志输出路径(自定义OutputFormat)
1.需求分析
过滤输入的log日志中是否包含xyg
(1)包含xyg的网站输出到e:/xyg.log
(2)不包含xyg的网站输出到e:/other.log
2.数据准备
- http://www.baidu.com
- http://www.google.com
- http://cn.bing.com
- http://www.xyg.com
- http://www.sohu.com
- http://www.sina.com
- http://www.sin2a.com
- http://www.sin2desa.com
- http://www.sindsafa.com
log.txt
输出预期:
- http://www.xyg.com
xyg.txt
- http://cn.bing.com
- http://www.baidu.com
- http://www.google.com
- http://www.sin2a.com
- http://www.sin2desa.com
- http://www.sina.com
- http://www.sindsafa.com
- http://www.sohu.com
other.txt
3.代码实现
(1)自定义一个outputformat
- package com.xyg.mapreduce.outputformat;
- import java.io.IOException;
- import org.apache.hadoop.io.NullWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.RecordWriter;
- import org.apache.hadoop.mapreduce.TaskAttemptContext;
- import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
- public class FilterOutputFormat extends FileOutputFormat<Text, NullWritable>{
- @Override
- public RecordWriter<Text, NullWritable> getRecordWriter(TaskAttemptContext job) throws IOException, InterruptedException {
- // 创建一个RecordWriter
- return new FilterRecordWriter(job);
- }
- }
(2)具体的写数据RecordWriter
- package com.xyg.mapreduce.outputformat;
- import java.io.IOException;
- import org.apache.hadoop.fs.FSDataOutputStream;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.NullWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.RecordWriter;
- import org.apache.hadoop.mapreduce.TaskAttemptContext;
- public class FilterRecordWriter extends RecordWriter<Text, NullWritable> {
- FSDataOutputStream atguiguOut = null;
- FSDataOutputStream otherOut = null;
- public FilterRecordWriter(TaskAttemptContext job) {
- // 1 获取文件系统
- FileSystem fs;
- try {
- fs = FileSystem.get(job.getConfiguration());
- // 2 创建输出文件路径
- Path atguiguPath = new Path("e:/xyg.log");
- Path otherPath = new Path("e:/other.log");
- // 3 创建输出流
- atguiguOut = fs.create(atguiguPath);
- otherOut = fs.create(otherPath);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void write(Text key, NullWritable value) throws IOException, InterruptedException {
- // 判断是否包含“xyg”输出到不同文件
- if (key.toString().contains("xyg")) {
- atguiguOut.write(key.toString().getBytes());
- } else {
- otherOut.write(key.toString().getBytes());
- }
- }
- @Override
- public void close(TaskAttemptContext context) throws IOException, InterruptedException {
- // 关闭资源
- if (atguiguOut != null) {
- atguiguOut.close();
- }
- if (otherOut != null) {
- otherOut.close();
- }
- }
- }
(3)编写FilterMapper
- package com.xyg.mapreduce.outputformat;
- 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 FilterMapper extends Mapper<LongWritable, Text, Text, NullWritable>{
- Text k = new Text();
- @Override
- protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
- // 1 获取一行
- String line = value.toString();
- k.set(line);
- // 3 写出
- context.write(k, NullWritable.get());
- }
- }
(4)编写FilterReducer
- package com.xyg.mapreduce.outputformat;
- import java.io.IOException;
- import org.apache.hadoop.io.NullWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Reducer;
- public class FilterReducer extends Reducer<Text, NullWritable, Text, NullWritable> {
- @Override
- protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
- String k = key.toString();
- k = k + "\r\n";
- context.write(new Text(k), NullWritable.get());
- }
- }
(5)编写FilterDriver
- package com.xyg.mapreduce.outputformat;
- 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 FilterDriver {
- public static void main(String[] args) throws Exception {
- args = new String[] { "e:/inputoutputformat", "e:/output2" };
- Configuration conf = new Configuration();
- Job job = Job.getInstance(conf);
- job.setJarByClass(FilterDriver.class);
- job.setMapperClass(FilterMapper.class);
- job.setReducerClass(FilterReducer.class);
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(NullWritable.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(NullWritable.class);
- // 要将自定义的输出格式组件设置到job中
- job.setOutputFormatClass(FilterOutputFormat.class);
- FileInputFormat.setInputPaths(job, new Path(args[]));
- // 虽然我们自定义了outputformat,但是因为我们的outputformat继承自fileoutputformat
- // 而fileoutputformat要输出一个_SUCCESS文件,所以,在这还得指定一个输出目录
- FileOutputFormat.setOutputPath(job, new Path(args[]));
- boolean result = job.waitForCompletion(true);
- System.exit(result ? : );
- }
- }
Hadoop案例(五)过滤日志及自定义日志输出路径(自定义OutputFormat)的更多相关文章
- Flink FileSink 自定义输出路径——StreamingFileSink、BucketingSink 和 StreamingFileSink简单比较
接上篇:Flink FileSink 自定义输出路径——BucketingSink 上篇使用BucketingSink 实现了自定义输出路径,现在来看看 StreamingFileSink( 据说是S ...
- Hadoop案例(一)之日志清洗
日志清洗案例 一. 简单解析版 1)需求 去除日志中字段长度小于等于11的日志. 2)输入数据 /Sep/::: +] "-" "Mozilla/4.0 (compati ...
- 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)
1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...
- 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
1.简介 前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar.log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的 ...
- log4j分离日志输出 自定义过滤 自定义日志文件
普通的log4j.properties 定义: ### set log levels ### log4j.rootLogger = debug,D,E ## Disable other log log ...
- ELK收集Nginx自定义日志格式输出
1.ELK收集日志的有两种常用的方式: 1.1:不修改源日志格式,简单的说就是在logstash中转通过 grok方式进行过滤处理,将原始无规则的日志转换为规则日志(Logstash自定义日志格式) ...
- ATS配置自定义日志
修改records.config,开启日志自定义功能 更改日志目录,默认日志存放在/var/log/trafficserver: CONFIG proxy.config.log.logfile_dir ...
- SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!
往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...
- Nginx日志配置及日志分析脚本案例
https://blog.csdn.net/bbwangj/article/details/82186162 nginx的log日志分为access log 和 error log 其中access ...
随机推荐
- 据说要写一个CTSC&APIO的收获
就不写流水帐了,总的写一下吧.先从最浅显的地方开始——知识.大概被普及了一发带花树,算上自己的考试,还被普及了一发洲阁筛.当然更多的还是对于一些知识的强化,比如:乱搞(这东西真是太重点了啊).DP.数 ...
- Myeclipse下配置SVN报错问题 svn: E175002: java.lang.RuntimeException: Could not generate DH keypair,缺少subclipse插件的javaHL
在myeclipse10.0下安装svn插件,出现了Could not generate DH keypair,这么一个错误. 看到了一篇博客说是svn接口选择问题,可是我myeclipse没有那个接 ...
- Uiautomator 快速调试
UiAutomatorHelper使用 1.介绍: 他是一种可以快速调试的方法:其本身也是java问津相当于自动化脚本,查看该文件,其主要实现的功能如下 1.创建bu ...
- Kubernetes 1.5部署sonarqube
前面几篇博文我们一直在说kubernetes的基础环境的安装及部署.在基础环境部署完成以后,我们开始尝试使用kubernetes来管理我们的应用.本篇博文通过一个简单的示例来向大家展示如何通过depl ...
- 生存分析/Weibull Distribution韦布尔分布
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...
- OpenCV---分水岭算法
推文: OpenCV学习(7) 分水岭算法(1)(原理简介简单明了) OpenCV-Python教程:31.分水岭算法对图像进行分割(步骤讲解不错) 使用分水岭算法进行图像分割 (一)获取灰度图像,二 ...
- MakeDown的使用
Makedown的使用 之前有用博客园来写博客,但是因为它的界面不好看,所以中途就放弃了.后来也使用过"有道云笔记",发现其写的笔记的界面很简洁工整.有道云笔记的书写原理和Make ...
- 1.ideal常用快捷键
Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如ge ...
- 课程设计——利用信号量实现生产者-消费者问题(java)
package cn.Douzi.ProductConsume; import java.util.LinkedList; import java.util.Queue; import java.ut ...
- [Luogu 2486] SDOI2011 染色
[Luogu 2486] SDOI2011 染色 树剖水题,线段树维护. 详细题解不写了. 我只想说我写的线段树又变漂亮了qwq #include <algorithm> #include ...