Spark 和分片 JDBC 个数据源

Spark and sharded JDBC datasources

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

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

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

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

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

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

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

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

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