IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hadoop 自定义OutputFormat -> 正文阅读

[大数据]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
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:32:29  更:2021-08-21 15:34:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:02:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码