phi*_*ert 8 jdbc apache-spark apache-spark-sql
我目前有一个应用程序,它应该连接到不同类型的数据库,使用 Spark 的 JDBC 选项在该数据库上运行特定查询,然后将生成的 DataFrame 写入 HDFS。
Oracle 的性能非常糟糕(没有检查所有这些)。原来这是因为fetchSizeOracle 的默认属性是 10 行。所以我将它增加到 1000,性能提升非常明显。然后,我将其更改为 10000,但随后一些表开始因执行程序中的内存不足问题而失败(6 个执行程序,每个 4G 内存,2G 驱动程序内存)。
我的问题是:
Spark 的 JDBC 获取的数据是否在每次运行时都保存在执行程序内存中?有什么办法可以在作业运行时取消持久化吗?
我可以从哪里获得有关该fetchSize物业的更多信息?我猜它不会被所有 JDBC 驱动程序支持。
是否还有其他与 JDBC 相关的事情需要注意以避免 OOM 错误?
Fetch Size 它只是 JDBCPreparedStatement 的一个值。
您可以在 JDBCRDD.scala 中看到它:
stmt.setFetchSize(options.fetchSize)
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关 JDBC FetchSize 的更多信息
您还可以改进的一件事是设置所有 4 个参数,这将导致读取并行化。在这里查看更多内容。然后你的阅读可以被分割到许多机器上,因此每个机器的内存使用量可能会更小。
有关支持哪些 JDBC 选项以及如何支持的详细信息,您必须搜索驱动程序文档 - 每个驱动程序可能有其自己的行为
| 归档时间: |
|
| 查看次数: |
11261 次 |
| 最近记录: |