加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:49:19 所属栏目:安全 来源:网络整理
导读:我正在研究 Scala(2.11)/ Spark(1.6.1)流项目,并使用mapWithState()跟踪以前批次中看到的数据. 状态分为20个分区,使用StateSpec.function(trackStateFunc _).numPartitions(20)创建.我曾希望在整个集群中分发状态,但似乎每个节点都保持完整状态,并且执行总是
我正在研究 Scala(2.11)/ Spark(1.6.1)流项目,并使用mapWithState()跟踪以前批次中看到的数据.

状态分为20个分区,使用StateSpec.function(trackStateFunc _).numPartitions(20)创建.我曾希望在整个集群中分发状态,但似乎每个节点都保持完整状态,并且执行总是只执行一个节点.

位置级别摘要:节点本地:每个批次的UI显示50,完整批次是随机读取.之后,我写信给Kafka,分区再次传遍整个集群.我似乎无法找出为什么mapWithState()需要在单个节点上运行.如果它被一个节点而不是整个集群限制,这是否会破坏分区状态的概念?难道不能按密钥分配状态吗?

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读