gpt4 book ai didi

scala - Spark mapWithState 将所有数据混洗到一个节点

转载 作者:行者123 更新时间:2023-12-04 15:41:57 26 4
gpt4 key购买 nike

我正在处理 Scala (2.11)/Spark (1.6.1) 流项目并使用 mapWithState()跟踪从以前的批次中看到的数据。

状态分为 20 个分区,由 StateSpec.function(trackStateFunc _).numPartitions(20) 创建.我曾希望将状态分布在整个集群中,但似乎每个节点都拥有完整的状态,并且执行始终只在一个节点上执行。


Locality Level Summary: Node local: 50显示在每个批次的 UI 中,完整的批次是随机读取的。之后,我写信给 Kafka,分区再次分布在集群中。我似乎无法找出原因 mapWithState()需要在单个节点上运行。如果它被一个节点而不是整个集群限制,这不是破坏了对状态进行分区的概念吗?难道不能通过 key 分配状态吗?

最佳答案

I can't seem to find out why mapWithState needs to be run on a single node



它没有。 Spark 默认使用 HashPartitioner在集群中的不同工作节点之间对 key 进行分区。如果由于某种原因您看到所有数据都存储在不同的节点上,请检查 key 的分布。如果这是您用作 key 的自定义对象,请确保它是 hashCode方法执行得当。如果 key 分发出现问题,就会发生这种情况。如果您想对此进行测试,请尝试使用随机数作为键并查看 Spark UI 并查看此行为是否发生变化。

我在运行 mapWithState并且传入的数据根据​​键进行分区,因为我还有一个 reduceByKey保持状态之前的方法调用,以及查看 Storage 时在 Spark UI 上的选项卡上,我可以看到不同的 RDD 存储在集群中的不同工作节点上。

关于scala - Spark mapWithState 将所有数据混洗到一个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36151354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com