我有一个 PostgreSQL 机器的生产分片集群,其中分片是在应用程序层处理的。 (创建的记录被分配一个系统生成的唯一标识符——而不是 UUID——它包括一个 0-255 值,指示记录所在的分片#。)这个集群在 RDS 中复制,因此可以对其执行大型读取查询。
我正在尝试找出在 Spark 中访问此数据的最佳选择。
我正在考虑创建一个仅包含分片名称的小型数据集(文本文件),即 integration-shard-0
、integration-shard-1
等。然后我将这个数据集划分到整个 Spark 集群中,因此理想情况下每个工作人员只有一个分片名称(但我必须处理一个工作人员有多个分片的情况)。然后,当我创建一个 JdbcRDD
时,我实际上会创建 1..n 个这样的 RDD,一个对应驻留在该 worker 上的每个分片名称,然后将生成的 RDD 合并在一起。
这似乎行得通,但在我走这条路之前,我想看看其他人是如何解决类似问题的。
(我还有一个单独的 Cassandra 集群可用作分析处理的第二个数据中心,我将使用 Spark 访问它。)
最佳答案
我最终编写了自己的 ShardedJdbcRDD
,其初步版本可以在以下要点中找到:
https://gist.github.com/cfeduke/3bca88ed793ddf20ea6d
在我写它的时候,这个版本不支持从 Java 使用,只支持 Scala。 (我可能会更新它。)它也没有与 JdbcRDD
相同的子分区方案,我最终将为此创建一个重载构造函数。基本上 ShardedJdbcRDD
将跨集群查询您的 RDBMS 分片;如果您至少拥有与分片一样多的 Spark 从属设备,则每个从属设备将为其分区分配一个分片。
future 的重载构造函数将支持与 JdbcRDD
相同的范围查询,因此如果集群中的 Spark 从属节点多于分片,则可以通过范围查询将数据分解成更小的集合。
关于postgresql - Spark 和分片 JDBC 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28119277/