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

时间:2018-11-16 12:29:18

标签: apache-spark apache-spark-sql

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

有时,在执行读/写操作时,Spark会对数据库施加很大压力。

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

是否可以在批处理中处理此问题?

1 个答案:

答案 0 :(得分:3)

实际上,

背压只是一个花哨的词,用于设置最大接收速率。因此,实际上它并不像您认为的那样起作用。

实际上应该在阅读端进行此操作。

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

不幸的是,这可能无法解决PreparedStatement的所有性能问题。

您必须了解的是,与在单个工作程序上运行的基本jdbc阅读器相比,当使用整数列或使用谓词序列对数据进行分区时,以分布式方式加载数据会带来一些问题。在您的情况下,大量并发读取会轻易限制数据库。

为解决这个问题,我建议以下内容:

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

如果您想进一步了解使用JDBC源读取数据,建议您阅读以下内容:

免责声明: 。我是该仓库的合著者。