scala – Spark mapWithState将所有数据混洗到一个节点
我正在研究
Scala(2.11)/ Spark(1.6.1)流项目,并使用mapWithState()跟踪以前批次中看到的数据.
状态分为20个分区,使用StateSpec.function(trackStateFunc _).numPartitions(20)创建.我曾希望在整个集群中分发状态,但似乎每个节点都保持完整状态,并且执行总是只执行一个节点. 位置级别摘要:节点本地:每个批次的UI显示50,完整批次是随机读取.之后,我写信给Kafka,分区再次传遍整个集群.我似乎无法找出为什么mapWithState()需要在单个节点上运行.如果它被一个节点而不是整个集群限制,这是否会破坏分区状态的概念?难道不能按密钥分配状态吗? 解决方法
它没有.默认情况下,Spark使用HashPartitioner在群集中的不同工作节点之间对密钥进行分区.如果由于某种原因您看到所有数据都存储在不同的节点上,请检查密钥的分布情况.如果这是您用作键的自定义对象,请确保它的hashCode方法正确实现.如果密钥分发出现问题,就会发生这种情况.如果您想对此进行测试,请尝试使用随机数作为键并查看Spark UI并查看此行为是否发生更改. 我正在运行mapWithState,并且根据键对进入的数据进行分区,因为在保持状态之前我还有一个reduceByKey方法调用,当查看Spark UI上的Storage选项卡时,我可以看到不同的RDD是存储在集群中的不同工作节点上. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |