Hadoop 3.x|第十二天|MapReduce框架原理(OutputFormat数据输出)

OutputFormat

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

默认输出格式

默认的输出格式是TextOutputFormat

自定义OutputFormat

想要输出数据到MySQL/HBase/Elasticsearch等存储框架中。

  1. 自定义一个类继承FileOutputFormat
  2. 改写RecordWriter,具体改写输出数据的方法write()

自定义OutputFormat

需求

过滤输入的log日志,包含atguigu的网站输出到一个地址,不包含的网站输出到一个地址。

解决方案

自定义一个OutputFormat类,其中创建一个类LogRecordWriter继承RecordWriter并创建两个文件的输出流:atguiguOut otherOut,分别将数据送往两个不同的文件。

代码实现

自定义RecordWriter类

package com.atguigu.mapreduce.outputformat;
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 {
			//获取文件系统对象 要和job联系起来 故不能new
			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();
		//根据一行的 log 数据是否包含 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);
	}
 }

自定义OutputFormat类

package com.atguigu.mapreduce.outputformat;
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
	//返回RecordWriter
	public RecordWriter<Text, NullWritable> getRecordWriter(TaskAttemptContext job) throws IOException, InterruptedException {
 	//创建一个自定义的 RecordWriter 返回
 	LogRecordWriter logRecordWriter = new LogRecordWriter(job);
	return logRecordWriter;
 } }

补充Driver类

除了常规那几点,Driver类里依然要补充

 //设置自定义的 outputformat
 job.setOutputFormatClass(LogOutputFormat.class);
 //FileInputFormat.setInputPaths(job, new Path("D:\\input"));
 // 虽 然 我 们 自 定 义 了 outputformat , 但 是 因 为 我 们 的 outputformat 继承自fileoutputformat
 //而 fileoutputformat 要输出一个_SUCCESS 文件,所以在这还得指定一个输出目录
 FileOutputFormat.setOutputPath(job, new Path("D:\\logoutput"));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MapReduce 作业结束后,如果希望将输出数据保存到本地,可以使用 Hadoop 的文件系统 API 将输出数据写入本地文件。这可以通过使用 Hadoop 的 FileSystem 类来实现。例如,下面是一个示例代码,展示了如何使用 Hadoop 的 FileSystem 类将输出数据写入本地文件: ``` Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); Path outputPath = new Path("file:///local/path/to/output/file"); FSDataOutputStream outputStream = fs.create(outputPath); // 写入输出数据 outputStream.write(outputData); outputStream.close(); fs.close(); ``` 在上面的代码中,我们首先创建了一个 Configuration 对象,然后使用 FileSystem 类的 get 方法获取文件系统的实例。接下来,我们使用 Path 类创建了一个指向本地文件的路径,并使用 create 方法创建了一个 FSDataOutputStream 对象。最后,我们使用 write 方法将输出数据写入文件,并关闭输出流和文件系统。 ### 回答2: 在 MapReduce 作业结束后保存输出数据到本地,可以使用 Hadoop 的文件系统 API 将输出数据写入本地文件。Hadoop 提供了一个分布式文件系统,称为 Hadoop 文件系统(Hadoop Distributed File System,HDFS),它允许数据存储在集群中的多个节点上,并提供了数据的冗余和容错机制。 要将输出数据保存到本地,首先需要获取 Hadoop 文件系统的引用。可以使用 Hadoop Configuration 类来实现此目的。然后,可以使用 FileSystem 类的 getLocal 方法来获取本地文件系统的实例。这样就可以使用本地文件系统 API 来操作本地文件。 一旦获得了本地文件系统的实例,就可以使用 FileSystem 类的 create 方法创建一个输出文件。可以指定文件的路径和名称。然后,可以使用 MapReduce 作业的输出对象(如 OutputFormat 或自定义的 OutputFormat)将输出数据写入到该文件中。 在写入数据之后,需要使用 FileSystem 类的 close 方法关闭文件系统实例。这将确保所有缓冲的数据都被刷新到磁盘,并释放相关的资源。 总之,要将 MapReduce 作业的输出数据保存到本地文件,可以使用 Hadoop 的文件系统 API,并按照以下步骤操作: 1. 获取 Hadoop 文件系统的引用。 2. 使用 getLocal 方法获取本地文件系统的实例。 3. 使用 FileSystem 的 create 方法创建输出文件。 4. 使用输出对象将数据写入文件。 5. 使用 FileSystem 的 close 方法关闭文件系统实例。 这样,就可以将 MapReduce 作业的输出数据有效地保存到本地文件中,以便进一步处理或分析。 ### 回答3: 在MapReduce作业结束后,可以使用Hadoop的文件系统API将输出数据写入本地文件。Hadoop文件系统(Hadoop Distributed File System,简称HDFS)是Hadoop的核心组件之一,它提供了一个分布式文件系统,可以将大量的数据存储在网络连接的多个计算机集群上。 在MapReduce作业中,输出数据被存储在HDFS中的输出目录中。要将这些数据保存到本地文件,可以使用Hadoop文件系统API的功能。首先,通过创建一个新的本地文件路径,指定文件名称和目录路径,来创建一个本地文件输出流。然后,通过使用HDFS API的文件系统对象,打开HDFS中输出数据所在的文件,获取一个输入流。接下来,可以通过读取输入流中的内容,并将其写入本地文件输出流中。最后,确保在操作完成后关闭输入流和输出流,并释放资源。 通过使用Hadoop文件系统API,可以简化将MapReduce作业的输出数据保存到本地文件的过程。通过这种方法,用户可以方便地将处理后的数据从HDFS中直接写入本地文件系统,以后可以在本地系统中进行进一步的分析、处理或展示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值