Spark JDBC fetchsize选项

时间:2017-09-15 16:39:40

标签: apache-spark jdbc apache-spark-sql

我目前有一个应用程序应该连接到不同类型的数据库,使用Spark的JDBC选项在该数据库上运行特定查询,然后将结果DataFrame写入HDFS。

Oracle的表现非常糟糕(没有检查所有这些)。事实证明这是因为fetchSize属性默认情况下为Oracle的10行。所以我将它增加到1000并且性能增益非常明显。然后,我将其更改为10000,但随后一些表开始失败,执行程序中出现内存不足问题(6个执行程序,每个4G内存,2G驱动程序内存)。

我的问题是:

  • Spark的JDBC提取的数据是否在每次运行时都存在于执行程序内存中?在作业运行时,有没有办法取消它?

  • 我在哪里可以获得有关fetchSize属性的更多信息?我猜它不会得到所有JDBC驱动程序的支持。

  • 我还需要注意哪些与JDBC相关的事情以避免OOM错误?

2 个答案:

答案 0 :(得分:1)

获取大小它只是JDBC PreparedStatement的值。

您可以在JDBCRDD.scala中看到它:

 stmt.setFetchSize(options.fetchSize)

您可以阅读有关JDBC FetchSize here

的更多信息

您还可以改进的一件事是设置所有4个参数,这将导致读取的并行化。查看更多here。然后你的阅读可以分成许多机器,因此每个机器的内存使用量可能会更小。

有关支持哪些JDBC选项及其方式的详细信息,您必须搜索驱动程序文档 - 每个驱动程序可能都有自己的行为

答案 1 :(得分:0)

要回答@ y2k-shubham的后续​​问题“我是否在connectionProperties参数中传递它”,根据the current docs,答案为“是”,但请注意小写的s。

  

fetchsize JDBC的提取大小,它确定每次往返要提取多少行。这可以帮助提高JDBC驱动程序的性能,该驱动程序默认为较小的访存大小(例如,具有10行的Oracle)。此选项仅适用于阅读。