2015-01-14 77 views

回答

0

这样做有多种方式:

  1. 发射值用在“特殊”键的标准键/值输出,这将保证你的价值会先汇入您减速器减速每一个。 (您可能需要设置自定义排序比较器和分区)
  2. 使用MultipleOutputs在映射器和FileSystem在减速设置读取文本文件。我想你也可以在映射器中使用FileSystem来编写。这不是最佳解决方案,因此在写入和关闭文件之前,需要注意确保读取数据的时间。
  3. 使用DistributedCache编辑:其实,我不认为这将在同一工作的映射器和减速器之间工作。请忽略此选项。

对于选项#1,假设您有一个Text键和Text值从mapper传递到reducer。 而且你知道你的任何一把钥匙都不能以空格“”开头。所以你可以做的是构造一个特殊的键“”+#,其中#是一个reducer分区id(从0到N-1,其中N是你的reducer的总数)。然后在一个循环中输入“01”,“02”,“03”......这样的密钥,并输入你需要传递给每个reducer的值。 设置自定义partitioner,使其认识到“特殊”键和路线给对应分区:

int getPartition(Text key, Text value, int numPartitions) { 
    if (key.toString().startWith(" ") { 
     //special key 
     int partId = Integer.parseInt(key.toString().substring(1)); 
     return partId; 
    } else { 
     //regular key 
     return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
    } 
} 

显然,如果你有使用的密钥其他数据类型,你仍然可以创造性地想出了一个类似的逻辑。

+0

谢谢您的回答。 :) –

相关问题