【问题标题】:How to handle backpressure on databases when using Apache Spark?使用 Apache Spark 时如何处理数据库的背压?
【发布时间】:2018-11-16 12:29:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

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

    这里应该做的其实是在阅读端。

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

    很遗憾,这可能无法解决您的 RDBMS 的所有性能问题。

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

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

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

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

    免责声明:我是那个 repo 的合著者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      相关资源
      最近更新 更多