使用 Apache Spark 时如何处理数据库的背压?

Gow*_*n V 2 apache-spark apache-spark-sql

我们使用 Apache Spark 每 2 小时执行一次 ETL。

有时Spark在执行读/写操作时会给数据库带来很大的压力。

对于Spark Streaming,我可以backpressure在kafka上看到配置。

有没有办法在批处理中处理这个问题?

eli*_*sah 5

背压实际上只是一个花哨的词,指的是设置最大接收速率。所以实际上它并不像你想象的那样工作。

这里要做的事情其实是在阅读端。

现在,在经典的 JDBC 使用中,jdbc 连接器具有sfetchSize属性PreparedStatement。因此,基本上您可以考虑根据以下答案中的内容配置 fetchSize :

不幸的是,这可能无法解决RDBMS.

您必须知道的是,与在单个工作程序上运行的基本 jdbc reader 相比,当使用整数列或使用谓词序列对数据进行分区时,以分布式模式加载数据但会引入一些问题。在您的情况下,大量并发读取很容易限制数据库。

为了解决这个问题,我建议如下:

  • 如果可用,请考虑通过 JDBC 连接使用专用数据源。
  • 考虑使用专门或通用的批量导入/导出工具,例如 Postgres COPY 或 Apache Sqoop。
  • 请务必了解不同 JDBC 数据源变体的性能影响,尤其是在使用生产数据库时。
  • 考虑为 Spark 作业使用单独的副本。

如果您想了解更多有关使用 JDBC 源读取数据的信息,我建议您阅读以下内容:

免责声明:我是该存储库的共同作者。