Hadoop 自定义OutputFormat

Hadoop 自定义OutputFormat

1 介绍

OutputFormat是MapReduce输出的基类,所有实现MapReduce输出都实现了 OutputFormat接口。

  • hadoop常见的OutputFormat实现类
    在这里插入图片描述

2 自定义OutputFormat

2.1 说明

  1. 应用场景
    例如:输出数据到MySQL/HBase/Elasticsearch/HDFS等存储框架中。

  2. 自定义OutputFormat步骤
    自定义一个类继承FileOutputFormat。
    改写RecordWriter,具体改写输出数据的方法write()。
    设置自定义的 outputformat:job.setOutputFormatClass(LogOutputFormat.class);

2.2 案例伪代码

  • 需求:按日志分类,分别输出到HDFS的两个文件
  • LogRecordWriter 继承RecordWriter
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
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 java.io.IOException;
public class LogRecordWriter extends RecordWriter<Text, NullWritable> {
 	private FSDataOutputStream atguiguOut;
 	private FSDataOutputStream otherOut;
 	public LogRecordWriter(TaskAttemptContext job) {
 		try {
 			//获取文件系统对象
 			FileSystem fs = FileSystem.get(job.getConfiguration());
 			//用文件系统对象创建两个输出流对应不同的目录
 			atguiguOut = fs.create(new Path("d:/hadoop/atguigu.log"));
 			otherOut = fs.create(new Path("d:/hadoop/other.log"));
 		} catch (IOException e) {
 		e.printStackTrace();
		 }
	}
	// 输出格式在该方法定义
 	@Override
 	public void write(Text key, NullWritable value) throws IOException, 
		InterruptedException {
 		String log = key.toString();
 		//根据一行的 数据是否包含 atguigu,判断两条输出流输出的内容
 		if (log.contains("atguigu")) {
 			atguiguOut.writeBytes(log + "\n");
		 } else {
 		otherOut.writeBytes(log + "\n");
 		}
 }
 		@Override
 		public void close(TaskAttemptContext context) throws IOException, 
		InterruptedException {
 			//关流
 			IOUtils.closeStream(atguiguOut);
 			IOUtils.closeStream(otherOut);
 	} 
 }
  • LogOutputFormat 继承FileOutputFormat
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;
import java.io.IOException;
public class LogOutputFormat extends FileOutputFormat<Text, NullWritable> {
 		@Override
 		public RecordWriter<Text, NullWritable> getRecordWriter(TaskAttemptContext job) throws IOException, 
		InterruptedException {
 			//创建一个自定义的 RecordWriter 返回
 			LogRecordWriter logRecordWriter = new LogRecordWriter(job);
 			return logRecordWriter;
 		} 
 	}
  • job 设置自定义输出
    伪代码
//设置自定义的 outputformat
 job.setOutputFormatClass(LogOutputFormat.class);
 // 虽 然 我 们 自 定 义 了 outputformat , 但 是 因 为 我 们 的 outputformat 继承自fileoutputformat
 //而 fileoutputformat 要输出一个_SUCCESS 文件,所以在这还得指定一个输出目录
 FileOutputFormat.setOutputPath(job, new Path("D:\\logoutp
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值