此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));
假设我们有key =“firstKey”。对于这个关键字“firstKey”,我们将在每批次中收到新的值。只有这个键值才会被添加到驻留在这个键状态对象中的HashMap中。所以,在时间上,散列表将会增长,并且在某一时刻,包含散列映射的状态对象将会大到适合一个节点,所以我认为火星将 分布在其他节点上,所以不是问题:“是的假设叶子在节点3上并且最上面的父节点在节点1上并且它不会找到它“有效吗? – Vlad
然后让该值成为标记接口(不像示例中的字符串),它可以是2个对象。一种仅将数据添加到地图的类型,另一种类型从叶子获取父母。这就是为什么我一直在问状态分布。如果基于类型的对象将搜索父级,但叶子(起点)在另一个节点上,则会发生什么情况。 – Vlad
那么,如果你有'RDD',你期望每个'SomeLargeObject'在节点之间分裂,或者每个节点有一个或多个完整的'SomeLargeObject'? –