2

我的 Reduce 操作生成的输出文件很大(Gzipping 后为 1 GB)。我希望它将中断输出生成为 200 MB 的较小文件。是否有一个属性/Java 类可以按大小或没有拆分减少输出。行数?我不能增加 reducer 的数量,因为这会对 hadoop 作业的性能产生负面影响。

4

2 回答 2

2

我很好奇为什么你不能只使用更多的减速器,但我会相信你的话。

您可以做的一种选择是使用 MultipleOutputs 并从一个 reducer 写入多个文件。例如,假设每个 reducer 的输出文件为 1GB,而您想要 256MB 的文件。这意味着您需要为每个 reducer 写入 4 个文件,而不是一个文件。

在您的工作驱动程序中,执行以下操作:

JobConf conf = ...;

// You should probably pass this in as parameter rather than hardcoding 4.
conf.setInt("outputs.per.reducer", 4);

// This sets up the infrastructure to write multiple files per reducer.
MultipleOutputs.addMultiNamedOutput(conf, "multi", YourOutputFormat.class, YourKey.class, YourValue.class);

在你的减速器中,这样做:

@Override
public void configure(JobConf conf) {
  numFiles = conf.getInt("outputs.per.reducer", 1);
  multipleOutputs = new MultipleOutputs(conf);

  // other init stuff
  ...
}

@Override
public void reduce(YourKey key
                   Iterator<YourValue> valuesIter,
                   OutputCollector<OutKey, OutVal> ignoreThis,
                   Reporter reporter) {
    // Do your business logic just as you're doing currently.
    OutKey outputKey = ...;
    OutVal outputVal = ...;

    // Now this is where it gets interesting. Hash the value to find
    // which output file the data should be written to. Don't use the
    // key since all the data will be written to one file if the number
    // of reducers is a multiple of numFiles.
    int fileIndex = (outputVal.hashCode() & Integer.MAX_VALUE) % numFiles;

    // Now use multiple outputs to actually write the data.
    // This will create output files named: multi_0-r-00000, multi_1-r-00000,
    // multi_2-r-00000, multi_3-r-00000 for reducer 0. For reducer 1, the files
    // will be multi_0-r-00001, multi_1-r-00001, multi_2-r-00001, multi_3-r-00001.
    multipleOutputs.getCollector("multi", Integer.toString(fileIndex), reporter)
      .collect(outputKey, outputValue);
}

@Overrider
public void close() {
   // You must do this!!!!
   multipleOutputs.close();
}

这个伪代码是在考虑旧的 mapreduce api 的情况下编写的。但是,使用 mapreduce api 存在等效的 api,因此无论哪种方式,您都应该做好准备。

于 2012-05-04T06:21:18.177 回答
0

没有财产可以做到这一点。您需要编写自己的输出格式和记录器。

于 2012-05-03T21:20:14.730 回答