在Spark中建模可变集合

时间:2016-01-25 15:18:08

标签: scala apache-spark

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

当应用程序收到新消息时,将检查缓存以查看该消息的条目是否已存在。如果不是,则基于消息中的数据将新实体添加到高速缓存中。 (与此同时,新实体将持久保存到数据库中。)

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

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

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

谢谢

2 个答案:

答案 0 :(得分:2)

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

如果您想要具有快速搜索类似功能的内容,则应该查看Elastic Search

通常用于存储大型内存中/查找表的其他技术是redismemcached

答案 1 :(得分:1)

由于RDD是不可变的,因此每次缓存更新都需要从之前的RDD生成一个全新的RDD。这显然是低效的(你必须操纵整个RDD只是为了更新它的一小部分)。关于拥有RDD元素的可变scala集合的另一个想法 - 那么,它不能在机器/ CPU之间分配,那么重点是什么?

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

Apache Spark在细粒度转换方面非常糟糕,例如内存分布式缓存所需的转换。

很抱歉,如果我没有直接回答技术问题,请回答你的问题背后的问题...