20

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

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

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

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

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

方法1:广播变化:

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

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

方法2:为更新创建一个RDD

  1. 对于每个更改请求,我的服务器都会获取特定于范围的 RDD 并生成一个作业
  2. 在每个 RDD 上,与具有更改的新 RDD 进行联接
  3. 现在我在第 2 步再次对这个新的 RDD 进行所有计算,例如乘法、减法等

方法3:

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

关于哪种方法更好或适合这种情况的任何其他方法的任何建议。

蒂亚!

4

2 回答 2

9

这里展示的用例非常适合 Spark Streaming。其他两个选项带有一个问题:“你如何提交对 RDD 的重新计算?”

Spark Streaming 提供了一个框架,可以根据一些传入数据流持续向 Spark 提交工作,并以 RDD 形式保存该数据。Kafka 和 Flume 只是两个可能的 Stream 源。

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

在这个用例中,使用 Spark Streaming,您将读取您的基本 RDD 并使用传入的 dstream 增量转换现有数据并保持不断发展的内存状态。dstream.transform将允许您将基本 RDD 与在给定批处理间隔期间收集的数据结合起来,而该updateStateByKey操作可以帮助您构建由键寻址的内存状态。有关详细信息,请参阅文档

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

于 2014-12-16T21:35:31.503 回答
1

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

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

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

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

于 2016-03-16T01:32:47.743 回答