【问题标题】:Spark jdbc reuse connectionSpark jdbc 重用连接
【发布时间】: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 并提供一个连接池。

标签: java jdbc apache-spark


【解决方案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

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

【讨论】:

  • 感谢您的回复。但我的用例是从数据库中读取数据并使用数据帧加载操作。还有其他建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2021-12-01
  • 2011-03-06
  • 2018-01-03
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多