Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark Streaming:mapWithState函数在集群中如何工作?_Apache Spark_Spark Streaming - Fatal编程技术网

Apache spark Spark Streaming:mapWithState函数在集群中如何工作?

Apache spark Spark Streaming:mapWithState函数在集群中如何工作?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我使用Spark Streaming v2.0.0从Kafka检索日志并进行一些操作。我使用函数mapWithState来保存和更新与设备相关的一些字段。我想知道这个函数在集群中是如何工作的。事实上,到目前为止,我只是在使用独立模式,但稍后我将用一个纱线簇进行尝试 但是,假设我有一个包含多个节点的集群,如果一个节点更新了设备的状态,他是否会立即通知所有其他节点该更新?如果否,则需要设置集群中的mapWithState函数。我怎样才能做到这一点呢?所有有状态转换都会按键洗牌数据,以便在同一执行器线

我使用Spark Streaming v2.0.0从Kafka检索日志并进行一些操作。我使用函数mapWithState来保存和更新与设备相关的一些字段。我想知道这个函数在集群中是如何工作的。事实上,到目前为止,我只是在使用独立模式,但稍后我将用一个纱线簇进行尝试


但是,假设我有一个包含多个节点的集群,如果一个节点更新了设备的状态,他是否会立即通知所有其他节点该更新?如果否,则需要设置集群中的mapWithState函数。我怎样才能做到这一点呢?

所有有状态转换都会按键洗牌数据,以便在同一执行器线程上处理特定键的所有值


不需要额外的同步,并且特定密钥的状态始终一致。

检查点作为目录提供,因此可以来自本地文件系统、NFS挂载、HDFS托管或S3托管

现在,考虑纱线+HDFS组合。由于mapWithState而写入检查点的任何数据都将基于状态的密钥分布在不同的HDFS节点上,spark将尝试在同一节点上调度依赖于它的任务

但如果你考虑,纱线+NFS可能根本不合乎逻辑。每个节点应在同一装载点装载NFS,并且每个读/写请求都将是一个NFS请求。这将创造一个完美的瓶颈

让我们假设,状态管理用户会话。我们可能会选择为每个用户保留少量或多GB的信息。状态中的键应该以某种方式唯一地标识用户,并且每次触发mapWithState函数时,都可以访问该用户在状态中保存的所有信息

但是,假设我有一个包含多个节点的集群,如果一个节点更新了设备的状态,他是否会立即通知所有其他节点该更新?如果否,则需要设置集群中的mapWithState函数

这不是mapWithState的工作方式。mapWithState是一个洗牌阶段,这意味着它将导致集群中的数据四处移动。这对mapWithState有何影响?每个条目键值对将被洗牌到特定的执行器。当同一密钥随后到达给定时间从输入流处理该密钥的执行器时,该密钥将被洗牌到持有内存中映射和先前消息状态的节点。默认情况下,这是通过HashPartitioner完成的,HashPartitioner将散列密钥,然后将其发送给持有状态的适当执行器,这就是为什么需要仔细选择密钥的原因


这意味着特定密钥的状态不会分布在整个集群中。它被分配给集群内的一个特定执行者,每次传入的数据都会根据密钥的哈希值返回到该执行者。

当您说同一台机器时,您是指同一个节点吗?如果我理解你所写的,节点之间已经有了关于转换的同步?我不会检查S3;检查点依赖于重命名来提交检查点,并且依赖于速度非常慢且不是原子的对象存储。嗨,Yuval,你有关于HashPartitioner的文档吗。我只得到了这个链接,但我不明白它到底是如何工作的。如果spark executor崩溃会发生什么?如何为失败的执行器中的密钥重建状态?