postgresql - Spark 和分片 JDBC 数据源

标签 postgresql scala jdbc apache-spark

我有一个 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 从属设备,则每个从属设备将为其分区分配一个分片。

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

p>

关于postgresql - Spark 和分片 JDBC 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28119277/

相关文章:

scala - protected 和 protected 区别[this]

java - 部署后未找到 jdbc mysql 驱动程序

java.lang.ClassNotFoundException : com/microsoft/sqlserver/jdbc/SQLServerDriver

Postgresql 字符串连接 : error: syntax error at or near "msg"

java - 可以使用 8.4 和 9.0 postgres( hibernate )库构建一个 .war 文件吗?

sql - 使用物化路径对树进行排序?

scala - 在 Scala 中反转/转置一对多映射

scala - 如何在 JavaFX WebView 中隐藏滚动条

java - 将 JDBC 连接到 IP 地址

sql - PostgreSQL,获取所有分区表名和所有非分区表名