我目前有一个应用程序应该连接到不同类型的数据库,使用Spark的JDBC选项在该数据库上运行特定查询,然后将结果DataFrame写入HDFS。
Oracle的表现非常糟糕(没有检查所有这些)。事实证明这是因为fetchSize
属性默认情况下为Oracle的10行。所以我将它增加到1000并且性能增益非常明显。然后,我将其更改为10000,但随后一些表开始失败,执行程序中出现内存不足问题(6个执行程序,每个4G内存,2G驱动程序内存)。
我的问题是:
Spark的JDBC提取的数据是否在每次运行时都存在于执行程序内存中?在作业运行时,有没有办法取消它?
我在哪里可以获得有关fetchSize
属性的更多信息?我猜它不会得到所有JDBC驱动程序的支持。
我还需要注意哪些与JDBC相关的事情以避免OOM错误?
答案 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)。此选项仅适用于阅读。