Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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 如何更新RDD?_Apache Spark_Rdd_Spark Streaming - Fatal编程技术网

Apache spark 如何更新RDD?

Apache spark 如何更新RDD?,apache-spark,rdd,spark-streaming,Apache Spark,Rdd,Spark Streaming,我们正在开发Spark框架,将历史数据移动到RDD集中 基本上,RDD是不可变的只读数据集,我们在其上执行操作。 基于此,我们将历史数据移动到RDD中,并在此类RDD上进行过滤/映射等计算 现在有一个用例,RDD中的数据子集得到更新,我们必须重新计算值 历史数据采用RDD的形式。 我基于请求范围创建另一个RDD,并将该RDD的引用保存在ScopeCollection中 到目前为止,我已经能够想到以下方法- 方法1:广播更改: 对于每个更改请求,我的服务器都会获取特定于作用域的RDD并生成一个作业

我们正在开发Spark框架,将历史数据移动到RDD集中

基本上,RDD是不可变的只读数据集,我们在其上执行操作。 基于此,我们将历史数据移动到RDD中,并在此类RDD上进行过滤/映射等计算

现在有一个用例,RDD中的数据子集得到更新,我们必须重新计算值

历史数据采用RDD的形式。 我基于请求范围创建另一个RDD,并将该RDD的引用保存在ScopeCollection中

到目前为止,我已经能够想到以下方法-

方法1:广播更改:

  • 对于每个更改请求,我的服务器都会获取特定于作用域的RDD并生成一个作业
  • 在作业中,对该RDD应用映射阶段-

    2.a。对于RDD中的每个节点,查找广播并创建一个新值,该值现在已更新,从而创建一个新的RDD
    2.b。现在我在第2.a步对这个新的RDD再次进行所有计算。如乘法、减法等
    2.c。我将此RDDs引用保存回ScopeCollection中
  • 方法2:为更新创建RDD

  • 对于每个更改请求,我的服务器都会获取特定于作用域的RDD并生成一个作业
  • 在每个RDD上,与具有更改的新RDD进行连接
  • 现在,我在第二步对这个新的RDD进行所有的计算,比如乘法、约化等
  • 方法3:

    我曾想过创建流式RDD,在这里我不断更新相同的RDD并进行重新计算。但据我所知,它可以从水槽或卡夫卡的溪流。而在我的例子中,这些值是基于用户交互在应用程序本身中生成的。 因此,在我的上下文中看不到任何流式RDD的集成点

    任何关于哪种方法更好的建议,或任何其他适合此场景的方法


    蒂亚

    这里介绍的用例非常适合Spark Streaming。另外两个选项有一个问题:“如何提交RDD的重新计算?”

    Spark Streaming提供了一个框架,可以根据一些传入数据流不断向Spark提交工作,并以RDD形式保存这些数据。卡夫卡和水槽是仅有的两种可能的水流来源

    您可以使用套接字和进行通信,使用或甚至使用共享队列读取目录中的文件。如果这些选项都不适合您的应用程序,您可以自己编写

    在本用例中,使用Spark Streaming,您将读取基本RDD,并使用传入的数据流以增量方式转换现有数据,并保持不断变化的内存状态
    dstream.transform
    将允许您将基本RDD与给定批处理间隔期间收集的数据相结合,而
    updateStateByKey
    操作可以帮助您构建由键寻址的内存中状态。有关更多信息,请参阅


    如果没有更多关于应用程序的细节,就很难升级到使用Spark流的代码级别。我建议您探索这条路径,并针对任何特定主题提出新的问题。

    我建议看一看,它提供了可更新的键值对RDD。这可能会给你一些见解

    这个想法基于对密钥的了解,允许您使用已经创建的RDD的相同密钥压缩更新的数据块。在更新过程中,可以过滤掉以前版本的数据

    有了历史数据,我会说你必须有某种事件的身份


    关于流和消费,可以使用TCP端口。这样,驱动程序可能会打开spark希望从中读取的TCP连接并在那里发送更新。

    谢谢@maasg。关于您的问题“您如何提交重新计算”,我已编辑了我的问题。您是否尝试过其中一些想法的原型?在某些代码中会更清楚。e、 g.不确定您计划如何实施“我保存此RDDs参考”,以及这将有何帮助。您还需要进行缓存,否则RDD将从头开始重新计算。查看Spark作业服务器可能是另一种选择: