在 Spark 中为可变集合建模

Posted

技术标签:

【中文标题】在 Spark 中为可变集合建模【英文标题】:Modelling a mutable collection in Spark 【发布时间】:2016-01-25 15:18:08 【问题描述】:

我们现有的应用程序在启动时将大约一千万行从数据库加载到对象集合中。该集合存储在 GigaSpaces 缓存中。

当应用程序接收到新消息时,会检查缓存以查看该消息的条目是否已存在。如果不是,则根据消息中的数据将新实体添加到缓存中。 (同时,新实体被持久化到数据库中)。

我们正在研究使用 Spark 和 Scala 重新构建应用程序的可行性和附加值。问题是,在 Spark 中建模的正确方法是什么。

我的第一个想法是从数据库加载到 Spark RDD。查找现有条目显然很简单。但是,由于 RDD 是不可变的,因此向缓存中添加新条目需要进行转换。鉴于大量数据,我的假设是这不会很好。

另一个想法是将缓存创建为可变的 Scala 集合。但是,鉴于 Spark 与 RDD 一起工作,我们如何将其与 Spark 集成?

谢谢

【问题讨论】:

“我的第一个想法是从数据库加载到 Spark RDD。查找现有条目显然很简单”。呃,不,不会的,你想用什么操作来查找条目是否存在?它可能需要查看每个节点......对我来说,Spark 和 RDD 似乎非常不适合您的用例 - SPark 是关于指定如何将大型数据集中的数据转换为 RDD,然后定义一个集合该 RDD 上的转换,目的是产生一些(可能仍然很大)结果集。对于大型数据集的所有用例来说,这并不是灵丹妙药。 【参考方案1】:

这更像是一个设计问题。 Spark 不适合快速查找。它针对需要触及几乎整个数据集的批处理作业进行了优化;可能多次。

如果您想要具有快速搜索功能的东西,您应该查看Elastic Search。

通常用于存储大型内存/查找表的其他技术是redis 和memcached。

【讨论】:

【参考方案2】:

由于 RDD 是不可变的,每次缓存更新都需要从之前的 RDD 生成一个全新的 RDD。这显然是低效的(你必须操纵整个 RDD 来更新它的一小部分)。至于拥有一个可变 scala 集合的 RDD 元素的另一个想法——嗯,这不会在机器/CPU 之间分布,那么有什么意义呢?

如果您的目标是在缓存上进行内存中、可分发/可分区操作,那么您正在寻找的是可操作的内存数据网格,而不是 Apache Spark。例如:Hazelcast、ScaleOut 软件等。

众所周知,Apache Spark 不擅长进行细粒度的转换,例如内存中分布式缓存所需的转换。

对不起,如果我没有直接回答技术问题,而是在你的问题背后回答你的问题......

【讨论】:

以上是关于在 Spark 中为可变集合建模的主要内容,如果未能解决你的问题,请参考以下文章

数仓建模

说说spark

在猫鼬中为朋友模式建模?

如何在 MongoDb 中为这样的链接帐户建模?

如何在 appengine 中为追随者流建模?

在 ARIMA 时间序列建模 python pandas 中为 Adfuller 测试(平稳性测试)提取 p 值