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 重用连接的主要内容,如果未能解决你的问题,请参考以下文章