Spark和分片JDBC数据源

时间:2015-01-23 21:49:38

标签: postgresql scala jdbc apache-spark

我有一个生产分片的PostgreSQL计算机集群,其中在应用程序层处理分片。 (为创建的记录分配了系统生成的唯一标识符 - 而不是UUID - 其中包含0-255值,表示记录存在的分片#。)此群集在RDS中复制,因此可以对其执行大型读取查询。

我试图找出在Spark中访问此数据的最佳选择。

我正在考虑创建一个只包含分片名称的小数据集(文本文件),即integration-shard-0integration-shard-1等。然后我将这个数据集划分为理想情况下,Spark集群每个工作者只有一个分片名称(但我必须处理一个工人有多个分片的情况)。然后,当我创建JdbcRDD时,实际上创建了1 .. n 这样的RDD,每个分区名称对应一个RDD,并将生成的RDD合并在一起。

这似乎可行,但在我走这条路之前,我想看看其他人是如何解决类似问题的。

(我还有一个单独的Cassandra集群可用作分析处理的第二个数据中心,我将使用Spark访问它。)

1 个答案:

答案 0 :(得分:1)

我最后编写了自己的ShardedJdbcRDD,其初步版本可以在以下要点找到:

https://gist.github.com/cfeduke/3bca88ed793ddf20ea6d

在我写这篇文章的时候,这个版本不支持Java使用,只支持Scala。 (我可能会更新它。)它也没有JdbcRDD具有相同的子分区方案,为此我最终会创建一个重载构造函数。基本上ShardedJdbcRDD将在整个集群中查询您的RDBMS分片;如果你有至少与分片一样多的Spark从属,那么每个slave将为其分区获得一个分片。

未来重载的构造函数将支持JdbcRDD所具有的相同范围查询,因此,如果群集中的Spark派对多于分片,则可以通过范围查询将数据分解为更小的集合。