【发布时间】:2018-11-16 12:29:17
【问题描述】:
我们使用 Apache Spark 每 2 小时执行一次 ETL。
有时 Spark 在执行读/写操作时会给数据库带来很大压力。
对于 Spark Streaming,我可以在 kafka 上看到 backpressure 配置。
有没有办法在批处理中处理这个问题?
【问题讨论】:
标签: apache-spark apache-spark-sql
我们使用 Apache Spark 每 2 小时执行一次 ETL。
有时 Spark 在执行读/写操作时会给数据库带来很大压力。
对于 Spark Streaming,我可以在 kafka 上看到 backpressure 配置。
有没有办法在批处理中处理这个问题?
【问题讨论】:
标签: apache-spark apache-spark-sql
背压其实只是一个花哨的词,指的是设置最大接收率。所以实际上它并不像你想象的那样工作。
这里应该做的其实是在阅读端。
现在在经典的 JDBC 用法中,jdbc 连接器有一个fetchSize 属性,用于PreparedStatements。因此,基本上您可以考虑根据以下答案中的内容配置该 fetchSize :
很遗憾,这可能无法解决您的 RDBMS 的所有性能问题。
您必须知道的是,与在单个 worker 上运行的基本 jdbc 读取器相比,在使用整数列或使用谓词序列对数据进行分区时,以分布式模式加载数据但会引入一些问题。在您的情况下,大量并发读取很容易限制数据库。
为了解决这个问题,我建议如下:
如果您想了解更多关于使用 JDBC 源读取数据,我建议您阅读以下内容:
免责声明:我是那个 repo 的合著者。
【讨论】: