在Spark中使用大量数据帧/数据集/ RDD

时间:2016-07-01 20:39:46

标签: scala apache-spark

好的我使用Scala / Spark相对较新,我想知道是否有一个设计模式可以在Streaming应用程序中处理大量的DataFrame(几个100k)?

在我的示例中,我有一个SparkStreaming应用程序,其消息有效负载类似于:

{"user_id":123, "data":"ABC"}
{"user_id":456, "data":"DEF"}
{"user_id":123, "data":"GHI"}

因此,当一条消息进入user_id时:123我需要使用特定于相关用户的SparkSQL引入一些外部数据并在本地缓存它然后执行一些额外的计算然后将新数据保存到数据库。然后对流中的每条消息重复此过程。

现在我的问题是,我想缓存为每个用户提取的数据,然后每次我需要处理来自流的消息时重用用户数据的缓存副本(如果存在)用户。我有数百万可能的用户,在任何给定的时刻都有~100K活跃,我会在几个(~50-ish)执行者中处理这些数据。

我理解缓存的DataFrames / RDD会使LRU内存不足但是,如果我将每个用户缓存的计算数据存储在map中,以便在每个执行器上进行本地快速查找和检索,例如:

Map[id: INT, user_data: DataFrame]

我是否会创建一个场景,我将保留对永远不会获得GC的旧DataFrame的引用,因为我有对它们的活动引用,我最终会耗尽内存?

我是否遗漏了一些基本的东西,并且有更好的方法来实现这一目标?

谢谢,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

如果用户元数据是静态的,我只需保留一张包含所有用户ID和元数据的地图,并将其广播给工作人员。当您处理诸如此类的小地图时,这是最有效的解决方案。更难的情况是这个"映射"需要及时更新。在这种情况下,我会定期将数据加载到rdd中,并将其作为流水线的一部分与流数据连续加入。