2015-11-04 80 views
1

我有兩個螺栓類BoltXBoltYBoltYBoltX接收元組。 BoltX聲明輸出具有多個字段,每個元組包含4個字符串:風暴中的多個字段分組

class BoltX implements IBasicBolt { 
    ... 
    public void declareOutputFields(OutputFieldsDeclarer declarer) { 
     declarer.declare(new Fields("A","B","C","D")); 
    } 
} 

BoltY

class BoltX implements IBasicBolt { 
    boolean hasReceive = false; 
    String A = null; 
    String B = null; 
    ... 
    public void execute(Tuple input, BasicOutputCollector collector) { 
     if (!hasReceive) { 
      hasReceive = true; 
      A = input.getString(0); 
      B = input.getString(1); 
     } 

     if (!input.getString(0).equals(A) || !input.getString(1).equals(B)) { 
      LOG.error("group error"); 
      return; 
     } 
     ... 
    } 
    ... 
} 

在拓撲:

... 
builder.setBolt("x", new BoltX(), 3); 
builder.setBolt("y", new Bolty(), 3).fieldsGrouping("x", new Fields("A", "B")); 
... 

我認爲,從X與同場的輸出「A」和「B」將執行BoltY的相同任務。

但是,拓撲結構的日誌顯示了很多「組錯誤」。

那麼如何將具有相同字段「A」和「B」的輸出分組到同一個任務BoltY

+0

字段分組在這裏正確解釋:http://nrecursions.blogspot.in/2016/09/understanding-fields-grouping-in-apache.html – Anon

回答

4

預計會在日誌文件中看到很多組錯誤。從http://storm.apache.org/documentation/Concepts.html字段分組描述

字段分組:該流由分組中指定的字段進行分區。例如,如果流按「user-id」字段分組,則具有相同「user-id」的元組將始終轉到相同的任務,但具有不同「user-id」的元組可能轉到不同的任務。 這意味着字段A和B具有相同值的元組將始終執行相同的任務,但這並不意味着字段A和B的具有其他值的元組不能執行相同的任務。對於例如如果輸入數據具有下列元組

1,2,3,4 1,2,5,6 3,4,5,6

在上述情況下的前兩個元組被保證去執行相同的任務,但第三個元組也可以執行相同的任務,特別是當BoltY的parallelism提示設置爲1時。沒有其他任務。想想它像java中的hashcode方法。相同的對象總是具有相同的散列碼,但兩個不同的對象可以具有相同的散列碼。