Postgresql Spark和切分JDBC数据源

Postgresql Spark和切分JDBC数据源,postgresql,scala,jdbc,apache-spark,Postgresql,Scala,Jdbc,Apache Spark,我有一个PostgreSQL机器的生产分片集群,其中分片在应用层处理。(创建的记录被分配一个系统生成的唯一标识符,而不是UUID,其中包括一个0-255的值,表示记录所在的碎片。)此群集在RDS中复制,因此可以对其执行大型读取查询 我正试图找出在Spark中访问这些数据的最佳选择 我正在考虑创建一个只包含碎片名称的小数据集(文本文件),即integration-shard-0、integration-shard-1,等等。然后我将该数据集跨Spark集群进行分区,以便理想情况下每个工作人员只有一

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

我正试图找出在Spark中访问这些数据的最佳选择

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

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


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

我最终编写了自己的
ShardedJdbcRDD
,其初步版本如下所示:

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


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

您是否考虑过实现您自己的RDD,覆盖每个Spark分区并将其分配给碎片?我考虑过实现覆盖
getPartitions
的我自己的RDD,我将发布一个链接到下面的要点。碎片是与spark节点并置的,还是一个不同的机器集?不同的机器集(AWS RDS副本)所以数据局部性是不必要的。当我对Spark的使用有了更多的经验后,我会考虑创建一个支持数据局部性的版本。(我们的生产集群将有一个复制的Cassandra数据中心的数据局部性。)明白了。我敢打赌,您将获得更高的性能。