gpt4 book ai didi

apache-spark - 如何更新RDD?

转载 作者:行者123 更新时间:2023-12-03 12:59:57 26 4
gpt4 key购买 nike

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

基本上,RDD是不可变的,只读我们进行操作的数据集。
基于此,我们已将历史数据移到RDD中,并对此类RDD进行了诸如过滤/映射之类的计算。

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

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

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

方法1:广播更改:

  • 对于每个更改请求,我的服务器都会获取范围特定的RDD并生成一个作业
  • 在工作中,在该RDD上应用 map 阶段-
    2.a.对于RDD中的每个节点,在广播中查找并创建一个新值,该值现在已更新,从而创建一个新的RDD
    2.b.现在,我在step2.a上再次对该新RDD进行所有计算。如乘法,约简等
    2.c.我将此RDDs引用保存回我的ScopeCollection


  • 方法2:为更新创建一个RDD
  • 对于每个更改请求,我的服务器都会获取范围特定的RDD并生成一个作业
  • 在每个RDD上,对具有更改的新RDD进行联接
  • 现在我在步骤2再次对这个新RDD进行所有计算,例如乘法,约简等。

  • 方法3:

    我曾考虑过创建流式RDD,并在其中不断更新相同的RDD并进行重新计算。但据我了解,它可以从Flume或Kafka接收。而在我的情况下,值是基于用户交互在应用程序本身中生成的。
    因此,在我的上下文中,看不到流RDD的任何集成点。

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

    TIA!

    最佳答案

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

    Spark Streaming提供了一个框架,可基于传入数据流将工作连续提交给Spark并以RDD格式保存该数据。 Kafka和Flume只是两个可能的Stream来源。

    您可以将Socket通信与SocketInputDStream一起使用,使用FileInputDStream甚至使用共享队列与QueueInputDStream一起读取目录中的文件。如果这些选项都不适合您的应用程序,则可以编写自己的InputDStream

    在此用例中,使用Spark Streaming,您将读取基本的RDD并使用传入的dstream增量转换现有数据并维护不断发展的内存状态。 dstream.transform将允许您将基本RDD与在给定的批处理间隔内收集的数据结合起来,而updateStateByKey操作可以帮助您建立通过键寻址的内存中状态。有关更多信息,请参见documentation

    如果没有有关该应用程序的更多详细信息,就很难达到使用Spark Streaming可能实现的代码级别。我建议您探索这条道路,并对任何特定主题提出新的问题。

    关于apache-spark - 如何更新RDD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27503846/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com