hadoop outputformat是reduceTask中的重要过程
1.实例化outputformat,检查输出目录合法性
在jobClient的submitJobInternal反射生成的outputformat
// Check the output specification if (reduces == 0 ? jobCopy.getUseNewMapper() : jobCopy.getUseNewReducer()) { org.apache.hadoop.mapreduce.OutputFormat<?,?> output = ReflectionUtils.newInstance(context.getOutputFormatClass(), jobCopy);//生成outputformat output.checkOutputSpecs(context); } else { jobCopy.getOutputFormat().checkOutputSpecs(fs, jobCopy); }
贴上一个最常用的FileOutputFormat的checkOutputSpaces的方法
// Ensure that the output directory is set and not already there Path outDir = getOutputPath(job);//获得mapred.output.dir的目录 if (outDir == null) { throw new InvalidJobConfException("Output directory not set."); } // get delegation token for outDir's file system TokenCache.obtainTokensForNamenodes(job.getCredentials(), new Path[] {outDir}, job.getConfiguration()); if (outDir.getFileSystem(job.getConfiguration()).exists(outDir)) {//获得当前job的fs,判断目录是否存在 throw new FileAlreadyExistsException("Output directory " + outDir + " already exists"); }
写出key和value
1.生成inputformat和recordwritter
Task中的initialize方法,创建outputformat,并生成committer,这样mapper和reducer都会执行
主要在ReducerTask中使用outputformat,在runNewReducer方法中,获取recordWritrer
// make a task context so we can get the classes org.apache.hadoop.mapreduce.TaskAttemptContext taskContext = new org.apache.hadoop.mapreduce.TaskAttemptContext(job, getTaskID()); // make a reducer org.apache.hadoop.mapreduce.Reducer<INKEY,INVALUE,OUTKEY,OUTVALUE> reducer = (org.apache.hadoop.mapreduce.Reducer<INKEY,INVALUE,OUTKEY,OUTVALUE>) ReflectionUtils.newInstance(taskContext.getReducerClass(), job); org.apache.hadoop.mapreduce.RecordWriter<OUTKEY,OUTVALUE> trackedRW = new NewTrackingRecordWriter<OUTKEY, OUTVALUE>(reduceOutputCounter, job, reporter, taskContext);//NewTrackingRecordWriter一样也是recordWriter的代理类 job.setBoolean("mapred.skip.on", isSkipping());
2.写出key和value
在自定义Reducer运行run方法中,调用reducer进行业务处理
public void run(Context context) throws IOException, InterruptedException { setup(context); while (context.nextKey()) { reduce(context.getCurrentKey(), context.getValues(), context);//执行reduce } cleanup(context); }
在reducer的reduce方法,使用Reducer$Context调用自定义recordWriter的代理类
Reducer$Context代码:
/** * Generate an output key/value pair. */ public void write(KEYOUT key, VALUEOUT value ) throws IOException, InterruptedException { output.write(key, value); }
NewTrackingRecordWriter代码:
@Override public void write(K key, V value) throws IOException, InterruptedException { long bytesOutPrev = getOutputBytes(fsStats); real.write(key,value); long bytesOutCurr = getOutputBytes(fsStats); fileOutputByteCounter.increment(bytesOutCurr - bytesOutPrev); outputRecordCounter.increment(1); }
最终在reducerTask中关闭writter
reducer.run(reducerContext); trackedRW.close(reducerContext);
相关推荐
7. **扩展性与插件开发**:学习如何为Hadoop开发自定义InputFormat、OutputFormat、Partitioner、Combiner等组件。 8. **实战项目**:结合实际案例,运用所学知识解决大数据处理问题,如日志分析、推荐系统等。 ...
同时,源码包也方便了开发者进行扩展和优化,例如自定义InputFormat、OutputFormat、Partitioner、Reducer等,以适应特定的业务需求。 此外,由于这个源码包是基于Maven结构生成的,所以它应该包含了所有依赖项的...
6. **扩展与定制**:理解源码后,可以对Hadoop进行各种定制,例如开发自定义InputFormat、OutputFormat、Partitioner、Comparator等,以适应特定的数据处理需求。 7. **性能优化**:通过阅读源码,可以发现可能的...
3. **数据输入与输出**:探讨InputFormat和OutputFormat接口,理解如何自定义输入输出格式以适应不同类型的数据源。 4. **错误处理与容错机制**:讲解Hadoop的检查点、重试和故障恢复策略,以确保任务的可靠性。 5...
5. **数据输入与输出**:学习如何使用Hadoop的InputFormat和OutputFormat接口自定义数据格式,以及如何使用`hadoop fs`命令操作HDFS。 6. **应用程序开发**:掌握如何编写MapReduce程序,理解Mapper和Reducer的工作...
- 通过阅读源码,开发者可以自定义Hadoop的行为,例如编写自定义InputFormat、OutputFormat或Partitioner。 - 调试工具,如Hadoop的日志系统和JMX监控,可以帮助定位和解决问题。 6. 性能优化 - 通过对源码的...
对于Java开发者来说,深入Hadoop源码意味着可以自定义Hadoop的行为,创建更适合特定业务场景的解决方案。例如,你可以通过修改或扩展现有的InputFormat、OutputFormat、Mapper和Reducer来优化数据处理流程。 此外,...
然后逐步深入源码,结合实际案例分析,例如研究如何自定义InputFormat、OutputFormat、Mapper和Reducer等组件。此外,熟悉Java编程语言和面向对象设计是必不可少的,因为Hadoop主要用Java实现。 总之,Hadoop脚本的...
源码中可以看到各种接口设计,使得开发者可以方便地开发自定义的InputFormat、OutputFormat、Partitioner和Reducer等,以适应不同的数据处理需求。 9. **源码学习方法** 理解Hadoop源码需要具备Java基础、网络知识...
此外,Hadoop的源码还涵盖了如**InputFormat**和**OutputFormat**等接口,它们定义了数据输入和输出的格式。学习者可以通过分析源码理解如何自定义这些接口以支持不同的数据源和目标。 在Hadoop生态中,还有诸如**...
此外,`Hadoop`框架还提供了丰富的工具和类库,如JobTracker和TaskTracker(在Hadoop 2.x版本中被YARN取代),用于任务调度和资源管理,以及InputFormat和OutputFormat接口,用于自定义数据输入和输出格式。...
- `listing-4-1`至`listing-4-11`涵盖了数据输入格式的定义(如自定义InputFormat)以及数据输出格式(OutputFormat)的实现,这对于定制化数据处理流程至关重要。 4. **Hadoop配置与集群管理**: - 文件名未明确...
掌握Hadoop源码有助于进行自定义开发,如编写新的InputFormat、OutputFormat、Partitioner、Combiner等,以满足特定的数据处理需求。 9. **学习路径**: 研究Hadoop源码通常需要Java基础,对分布式系统有一定了解...
3. **MapReduce编程**:讲解如何编写Map和Reduce函数,包括键值对的处理、分区、排序和归约过程,以及自定义InputFormat和OutputFormat。 4. **Hadoop生态组件**:如HBase(分布式数据库)、Hive(数据仓库工具)、...
你可能会看到如何处理文本数据、CSV数据或其他结构化数据的示例,以及如何自定义Partitioner、Combiner和OutputFormat。 4. **数据分桶与分区**:源代码可能涉及到如何根据特定键值进行数据分区,以优化数据的分布...
本文将深入探讨如何使用Java编程语言来操作Hadoop MapReduce进行基本实践,通过源码分析来理解其核心工作原理和编程模型。 MapReduce的核心思想是将大规模数据集分解成小块,然后在分布式集群上并行处理这些小块,...
5. **实战应用**:通过源码分析,开发者可以学习如何定制Hadoop,如调整配置参数以优化性能,开发自定义InputFormat、OutputFormat、Partitioner等,满足特定的数据处理需求。 6. **性能优化**:源码分析有助于识别...
2. 功能扩展:Hadoop提供了丰富的API,允许开发人员根据需求扩展其功能,如自定义InputFormat、OutputFormat、Partitioner等。源码中包含了大量的示例,可以帮助我们更好地理解和使用这些接口。 四、Hadoop在实际...
2. **Chap 2 - 数据输入与输出**:这章可能包含如何使用Hadoop的InputFormat和OutputFormat类来定义数据的读取和写入方式。读者可以学习如何自定义输入分片(Splits)和Mapper/Reducer任务。 3. **Chap 3 - ...