如何激发SQL访问数据库



假设您使用spark SQL访问SQL数据库。使用RDD,spark将数据划分为许多不同的部分,这些部分共同组成数据集。

我的问题是Spark SQL如何管理从N个节点到数据库的访问。我可以看到几种可能性:

  1. RDD的每个节点都访问数据库并构建它们的部分。它的优点是,节点不必分配大量内存,但数据库必须支持N个连接,其中N个连接可能非常大。

  2. 单个节点访问数据,并根据需要将数据发送到其他N-1个节点。问题是,这个节点需要拥有所有数据,而这在许多情况下是不可行的。这可能可以通过按块获取数据来缓解。

JDBC包使用池连接以避免一次又一次的连接。但这并不能解决这个问题。

有什么参考资料可以解释spark是如何管理对SQL数据库的访问的?其中有多少可以参数化?

这在JDBC To Other Databases数据源文档页面上有非常详细的说明。

简而言之,作业中涉及的每个节点都将建立到数据库的连接。然而,决定连接数的不是节点数,而是配置的分区数:

numPartitions:表读写中可用于并行的最大分区数这也决定了并发JDBC连接的最大数量。如果要写入的分区数超过了这个限制,我们会在写入之前通过调用coalize(numPartitions(将其减少到这个限制。

关于

JDBC包使用池连接以避免一次又一次的连接。但这并不能解决这个问题。

JDBC驱动程序不会隐式地池化连接。应用程序设置、配置和使用连接池。除非Spark需要重复连接到数据库以获取数据,否则它不需要在每个分区建立多个连接。因此,将不需要汇集连接。

链接的文档页面有一个选项列表,应用程序可以使用这些选项来控制如何从数据库中提取数据。

最新更新