我正在使用Spark Streaming v2.0.0从Kafka检索日志并进行一些操作。我正在使用函数mapWithState
来保存和更新与设备相关的一些字段。我想知道这个功能在集群中是如何工作的。实际上,到目前为止我只是使用独立模式,但稍后我会尝试使用Yarn集群。
但是,假设我有一个包含多个节点的集群,如果节点更新了设备的状态,他是否会立即通知此更新的所有其他节点?如果不是,则需要设置集群中的mapWithState
功能。我怎么能这样做?
答案 0 :(得分:4)
但是,假设我有一个包含多个节点的集群,如果节点更新了设备的状态,他是否会立即通知此更新的所有其他节点?如果不是,则需要设置集群中的mapWithState函数。
这不是mapWithState
的工作方式。 mapWithState
是一个随机播放阶段,这意味着它会导致群集中的数据四处移动。这对mapWithState
有何影响?每个条目(键值对)将被洗牌到特定的Executor。在随后将该相同密钥到达Executor在给定时间从输入流处理它时,它将被随机播放到保存具有先前消息状态的内存中映射的节点。默认情况下,这是通过HashPartitioner
完成的,它会对密钥进行散列,然后将其发送给持有该状态的正确执行程序,这就是您需要仔细选择密钥的原因。
这意味着特定密钥的状态不会遍布整个群集。它被分配给集群内的特定Executor,并且传入的数据将根据密钥的哈希值每次都返回到一个。
答案 1 :(得分:0)
所有有状态转换按键对数据进行混洗,因此特定键的所有值都在同一个执行程序线程上处理。
不需要额外的同步,特定键的状态始终是一致的。
答案 2 :(得分:-1)
Checkpoint作为目录提供,因此可以从本地文件系统,NFS挂载,HDFS托管或S3托管!!!
现在,考虑YARN + HDFS组合。由于mapWithState而写入检查点的任何数据将根据状态的密钥分布在不同的HDFS节点上,spark将尝试在同一节点上调度依赖于它的任务。
但是如果你考虑一下,YARN + NFS(可能根本不合逻辑)。每个节点都应在同一安装点挂载NFS,每个读/写请求都是NFS请求。这将创造一个完美的瓶颈!!!
让我们假设,陈述管理用户的会话。我们可能会选择为每个用户保留少量信息或多GB信息。状态中的键应以某种方式唯一地标识用户,并且每次触发mapWithState函数时,将可访问在该状态中保存的所有信息。