【问题标题】:Spark 2.4.6 + JDBC Reader: When predicate pushdown set to false, is data read in parallel by spark from the engine?Spark 2.4.6 + JDBC Reader:当谓词下推设置为false时,spark是否从引擎并行读取数据?
【发布时间】:2021-01-02 05:25:08
【问题描述】:

我正在尝试从 SAP HANA 中的一个大表中提取数据,该表大小约为 1.5tb,最好的方法是跨节点和线程并行运行。 Spark JDBC 是该任务的完美候选者,但为了实际并行提取,它需要设置分区列、下限/上限和分区数选项。为了使提取操作更容易,我考虑添加一个添加的分区列,它是 row_number() 函数,并分别使用 MIN()、MAX() 作为下限/上限。然后只需要运维团队提供要拥有的分区数量。

问题在于 HANA 内存不足,并且很可能 row_number() 在引擎上的开销太大。我只能想象有超过 100 个线程在每次 fetch 期间运行相同的查询以应用 where 过滤器并检索相应的块。

所以我的问题是,如果我禁用谓词下推选项,spark 的行为如何?它是否仅由一个执行者读取,然后将过滤器应用于 spark 端?还是从数据库中拆分获取部分有什么魔力?

对于使用可用的 JDBC 阅读器提取如此大的表,您有什么建议?

提前致谢。

【问题讨论】:

    标签: apache-spark jdbc hana


    【解决方案1】:

    在从 Spark 执行主查询之前,运行预摄取查询以获取正在加载的数据集的大小,即您提到的 Min()、Max() 等。

    期望数据在 Min 和 Max 键之间均匀分布,您可以通过提供 Min/Max/Number of Executors 在 Spark 中跨 executor 进行分区。

    在这种情况下,您不需要(不想)通过添加额外的列来支持数据摄取来更改主数据源。

    【讨论】:

    • 添加一个新的计算列(如 row_num)的想法是解除运营团队为 700 多个表确定合适分区列的责任,只要求他们说我想要这个数量此表同时连接到 HANA。
    • 只要你可以灵活更改分区数,现在可以是10个,未来可以是20个。或者不同的用例可能需要不同的分区
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2018-07-18
    • 2016-07-14
    • 2017-01-26
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多