博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于MultipleOutputFormat若干小记
阅读量:6358 次
发布时间:2019-06-23

本文共 2558 字,大约阅读时间需要 8 分钟。

使用版本是0.19.2,据说0.20以后,MultipleOutputFormat不好使,不知道真假

api可以参考

但是说老实话,光看api有的时候有点混乱,每个函数到底影响些啥呢?

protected   ( key,  value)
          Generate the actual key from the given key/value.
protected   ( key,  value)
          Generate the actual value from the given key and value.
protected   ( key,  value,  name)
          Generate the file output file name based on the given key and the leaf file name.
protected   ( name)
          Generate the leaf name for the output file name.
protected abstract  <,> ( fs,  job,  name,  arg3)
           
protected   ( job,  name)
          Generate the outfile name based on a given anme and the input file name.
 <,> ( fs,  job,  name,  arg3)
          Create a composite record writer that can write key/value data to different output files

 

现在简单介绍了下调用的过程

ReduceTask.java文件中

 1 
public 
void run(JobConf job, 
final TaskUmbilicalProtocol umbilical) 
throws IOException
 2 {
 3 ..........
 4 
 5 String finalName = 
getOutputName(getPartition());
//
return "part-" + NUMBER_FORMAT.format(partition);依据taskid产生诸如part-00000这样的文件名
 6 
 7 FileSystem fs = FileSystem.get(job);
 8 
 9 
final RecordWriter out = job.getOutputFormat().
getRecordWriter(fs, job, finalName, reporter);
//
finalName=part-00000
10 
11 .............
12 }

 

 在MultipleOutputFormat.java里面,请注意这些个函数的调用顺序

 

    
public RecordWriter<K, V> getRecordWriter(FileSystem fs, JobConf job, String name, Progressable arg3)
throws IOException
    {
        
final FileSystem myFS = fs;
        
final String myName = 
generateLeafFileName(name);
//在这里可以硬性的指定文件名名称
        
final JobConf myJob = job;
        
final Progressable myProgressable = arg3;
        
return 
new RecordWriter<K, V>() {
            
//
 a cache storing the record writers for different output files.
            TreeMap<String, RecordWriter<K, V>> recordWriters = 
new TreeMap<String, RecordWriter<K, V>>();
            
public 
void write(K key, V value) 
throws IOException
            {
                
//
 get the file name based on the key
                String keyBasedPath = 
generateFileNameForKeyValue(key, value, myName);
//一般依据key来决定文件名的时候 就在这个函数
                
//
 get the file name based on the input file name
                String finalPath = 
getInputFileBasedOutputFileName(myJob, keyBasedPath);
//如果想依据jobconf配置来确定名称的话 就在这个函数里实现  finalPath 就是最终的文件名
                
//
 get the actual key
                K actualKey = 
generateActualKey(key, value);
                V actualValue = 
generateActualValue(key, value);
                RecordWriter<K, V> rw = 
this.recordWriters.get(finalPath);
                
if (rw == 
null)
                {
                    
//
 if we don't have the record writer yet for the final path, create
one
and add it to the cache
            
    
    rw = getBaseRecordWriter(myFS, myJob, finalPath, myProgressable);//必须自己实现的
                    
this.recordWriters.put(finalPath, rw);
                }
                rw.write(actualKey, actualValue);//
            };
 
             .......
 
        };
    }

 

 上述函数,除了getInputFileBasedOutputFileName,其他的红色函数基本上都只是简单的返回输入值.

转载地址:http://tzbma.baihongyu.com/

你可能感兴趣的文章
Java中静态变量和实例变量的区别
查看>>
秋名山老司机(详解)——bugku
查看>>
RED | Robot Framework集成开发环境
查看>>
育碧同 Mozilla 联手开发 AI 代码助手
查看>>
【实用】面对枯燥的源码,如何才能看得下去?
查看>>
智库说 | 徐远:数字时代的城市潜力
查看>>
《JSP极简教程》jsp c:forEach用法
查看>>
WebSocket详解(六):刨根问底WebSocket与Socket的关系
查看>>
用 Go 写一个轻量级的 ssh 批量操作工具
查看>>
网站设计之合理架构CSS 架构CSS
查看>>
D语言/DLang 2.085.1 发布,修复性迭代
查看>>
感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢?...
查看>>
Java 基础 之 算数运算符
查看>>
Windows下配置安装Git(二)
查看>>
一个最简单的基于Android SearchView的搜索框
查看>>
铁路开通WiFi“钱景”不明
查看>>
Facebook申请专利 或让好友及陌生人相互拼车
查看>>
电力“十三五”规划:地面光伏与分布式的分水岭
查看>>
美联社再告FBI:要求公开请黑客解锁iPhone花费
查看>>
三星电子出售希捷和夏普等四家公司股份
查看>>