Spark jdbc 重用连接

Posted

技术标签:

【中文标题】Spark jdbc 重用连接【英文标题】:Spark jdbc reuse connection 【发布时间】:2016-10-12 10:12:38 【问题描述】:

在我的 spark 应用程序中,我使用以下代码通过 JDBC 驱动程序从 sql server 数据库中检索数据。

 Dataset<Row> dfResult= sparksession.read().jdbc("jdbc:sqlserver://server\dbname", tableName,partitionColumn, lowerBound, upperBound, numberOfPartitions, properties);

并在 dfResult 数据集上使用 map 操作。

在独立模式下运行应用程序时,我看到 spark 为每个 rdd 创建唯一的连接。从 Api 描述中,我了解 spark 负责关闭连接。

请问是否有办法重用连接,而不是为每个 rdd 分区打开和关闭 jdbc 连接?

谢谢

【问题讨论】:

我不知道 spark,但您可能想检查是否可以改用 javax.sql.DataSource 并提供一个连接池。 【参考方案1】:

即使您通过 API 手动将数据推送到数据库中,我也经常看到建议您为每个分区创建一个连接。

# pseudo-code
rdd.foreachPartition(iterator =>
  connection = SomeAPI.connect()
  for i in iterator:
    connection.insert(i)
)

因此,如果 jdbc 对象已经在这样做,那么这一定是在确认模式应该是那样的。

下面是另一个推荐这种模式的例子:

http://www.slideshare.net/databricks/strata-sj-everyday-im-shuffling-tips-for-writing-better-spark-programs(幻灯片 27

我认为这是推荐模式的原因是因为当您在多节点集群中工作时,您永远不知道将在哪个节点上评估特定分区,因此,您需要确保它有一个数据库连接。

【讨论】:

感谢您的回复。但我的用例是从数据库中读取数据并使用数据帧加载操作。还有其他建议吗?

以上是关于Spark jdbc 重用连接的主要内容,如果未能解决你的问题,请参考以下文章

spark连接jdbc,连接mysql

通过 Spark 的 Hive JDBC 连接(Nullpointer 异常)

Flink JDBC Sink 和连接池

Spark Jdbc 连接 JDBCOptions

将 jdbc 连接传递给 spark 读取

Spark集群模式下的Impala JDBC连接问题