多输入和分组比较器

时间:2012-11-04 05:21:14

标签: java hadoop mapreduce distributed-computing hdfs

我有来自两个来源的输入:

  1. 以表格形式输出地图

    output.collect(new StockKey(Text(x+" "+id), new Text(id2)), new Text(data));
    
  2. 以表格形式输出地图

    output.collect(new StockKey(new Text(x+" "+id), new Text(1), new Text(data));
    
  3. 工作机会:

     conf.setPartitionerClass(CustomPartitioner.class);
     conf.setValueGroupingComparatorClass(StockKeyGroupingComparator.class);
    

    其中StockKey是格式为(new Text(), new Text())的自定义类;

    构造

    public StockKey(){
        this.symbol = new Text();
        this.timestamp = new Text();
    }
    

    分组比较器:

    public class StockKeyGroupingComparator extends WritableComparator {
    
        protected StockKeyGroupingComparator() {
            super(StockKey.class, true);
        }  
    
        public int compare(WritableComparable w1, WritableComparable w2){
            StockKey k1 = (StockKey)w1;
            StockKey k2 = (StockKey)w2;
    
            Text x1 = new Text(k1.getSymbol());
            Text x2 = new Text(k2.getSymbol());
    
            return x1.compareTo(x2);
    
        }
    
    }
    

    但我没有从输入

    接收地图输出值

    我只得到地图输出值到达reducer。我希望将具有符号viz new Text(x+" "+id)的记录从两个地图输出中共同分组到同一个reducer。我很震惊。

    请帮忙!

1 个答案:

答案 0 :(得分:1)

要做到这一点,你需要一个适合如下的分区:

  1. 您的映射器输出一组记录作为键/值对
  2. 对于每条记录,分区程序将传递密钥,值和reducers数。分区程序决定哪个reducer将处理记录
  3. 记录将发送到各自的分区(缩减器)
  4. 运行GroupingComparator以决定将哪些键值对分组为可迭代,以便对reducer()方法进行一次调用
  5. 等......
  6. 我认为默认分区程序是根据键的整个值选择每个记录的reducer分区(这是默认行为)。但是,您希望记录仅按键的一部分(只是符号而不是符号和时间戳)。因此,您需要编写一个执行此操作的分区程序,并在驱动程序类中指定/配置它。

    一旦你这样做,你正在分组比较器应该按照你的意图帮助分组记录。

    编辑:随意的想法

    • 如果您将时间戳移动到值,使密钥变得简单(只是符号)和值复杂(时间戳和值),您可能会使自己更容易。那么你就不需要分区器或分组比较器了。
    • 你没有说过任何一种方式,但你确实使用了MultipleInputs类,对吗?这是为同一个工作调用两个或更多映射器的唯一方法。