2017-06-10 49 views
0

我讀了如何計算陣列爲重點的狀態位置弗林克的源代碼,並發現keyGroupIndex-keyGroupOffset計算的狀態位置,
我的問題是:爲什麼通過這種方式爲Flink計算的Key的狀態位置?

  1. 爲什麼要使用keyGroupIndex-keyGroupOffset作爲位置,爲什麼不直接使用狀態[keyGroupIndex]?

    此外,如果直接使用state[keyGroupIndex],我還發現狀態數組的大小由Number of KeyGroup指定,如果直接使用state[keyGroupIndex],它也應該是一對一的映射。

  2. 爲什麼我們需要KeyGroupRange?

下面代碼從源代碼NestedMapsStateTable.java

this.keyGroupOffset = keyContext.getKeyGroupRange().getStartKeyGroup(); 

@VisibleForTesting 
Map<N, Map<K, S>> getMapForKeyGroup(int keyGroupIndex) { 
    final int pos = indexToOffset(keyGroupIndex); 
    if (pos >= 0 && pos < state.length) { 
     return state[pos]; 
    } else { 
     return null; 
    } 
} 

private int indexToOffset(int index) { 
    return index - keyGroupOffset; 
} 

public NestedMapsStateTable(InternalKeyContext<K> keyContext, RegisteredKeyedBackendStateMetaInfo<N, S> metaInfo) { 
    super(keyContext, metaInfo); 
    this.keyGroupOffset = keyContext.getKeyGroupRange().getStartKeyGroup(); 

    @SuppressWarnings("unchecked") 
    Map<N, Map<K, S>>[] state = (Map<N, Map<K, S>>[]) new Map[keyContext.getNumberOfKeyGroups()]; 
    this.state = state; 
} 

https://github.com/apache/flink/blob/63c04a516f40ec2dca4d8edef58e7c2ef563ce67/flink-runtime/src/main/java/org/apache/flink/runtime/state/heap/NestedMapsStateTable.java

回答

0

想法提取是每個StateBackend負責設置的完整鍵組範圍的子。因此,我們只需要爲我們的範圍內的每個關鍵組存儲狀態圖。爲了完成狀態映射管理,我們對關鍵組索引進行了標準化,使它們以0開頭。

但是,在爲整個範圍內的每個鍵組分配狀態映射條目的代碼中存在一個小錯誤。這應該是固定的。這裏是相應的JIRA issue

+0

謝謝你的幫助直到。 –

相關問題