2016-08-24 46 views
1

此Spark App正在3个节点上运行。我有一个State对象(MessageState),它包含一个HashMap。这个HashMap包含一个Graph(关键叶,父值)(并且不,GraphX不是这个的解决方案)假设状态对象将变得很大以适合一个节点,因此它将分布在其他两个节点上。如果我想知道叶子是最上面的父亲(它会做一些递归函数来遍历整个地图),假设叶子在节点3上,最上面的父母在节点1上,并且它不会找到它或火花分布将照顾到,所以整个地图数据将可用于搜索。我的问题实际上是州分配如何工作。在State对象中的所有节点上的映射是否相同?

JavaPairDStream<String, String> inputMessagesStream = readFromKafkaStream1(); 
    Function3<String, Optional<String>, State<MessageState>, String> messageState = (key, value, state) -> { 
       //MessageState contains the HashMap 
       if (state.exists()) { 
        return state.get().process(value.get()); 
       } else { 
        MessageState ms = new MessageState(); 
        ms.process(value.get()); 
        state.update(ms); 
        return null; 
       } 
      }; 

JavaMapWithStateDStream<String, String, MessageState, String> message1 = inputMessagesStream.mapWithState(StateSpec.function(messageState)); 

回答

0

"Return a JavaMapWithStateDStream by applying a function to every key-value element of this stream, while maintaining some state data for each unique key."

由于在一个PairRDDStream一个键的所有值是一个节点,在同一节点上关键的生命以及状态(如果你有太多的对值,它们可能会在多个节点上结束,但Spark仍然会尽量减少它必须传输的数据量)。您无法访问mapWithState中的不同密钥的状态,因此“是否有可能让我们说叶子在节点3上,最上面的父节点在节点1上,并且它不会找到它”不适用。

+0

假设我们有key =“firstKey”。对于这个关键字“firstKey”,我们将在每批次中收到新的值。只有这个键值才会被添加到驻留在这个键状态对象中的HashMap中。所以,在时间上,散列表将会增长,并且在某一时刻,包含散列映射的状态对象将会大到适合一个节点,所以我认为火星将 分布在其他节点上,所以不是问题:“是的假设叶子在节点3上并且最上面的父节点在节点1上并且它不会找到它“有效吗? – Vlad

+0

然后让该值成为标记接口(不像示例中的字符串),它可以是2个对象。一种仅将数据添加到地图的类型,另一种类型从叶子获取父母。这就是为什么我一直在问状态分布。如果基于类型的对象将搜索父级,但叶子(起点)在另一个节点上,则会发生什么情况。 – Vlad

+0

那么,如果你有'RDD ',你期望每个'SomeLargeObject'在节点之间分裂,或者每个节点有一个或多个完整的'SomeLargeObject'? –

相关问题