如何在 Spark 上均匀分配 Beam 任务?

How to distribute Beam Tasks evenly on Spark?

我有一个简单的管道,可以读取文本文件和 mysql 的记录并尝试协调它们,即当数据库中不存在记录时插入记录,使用更新数据库中的记录文件,并对文件中不存在的数据库中的记录进行一些其他更新。

在Spark中运行有2M条记录时出现的问题如下:

我的预感是以下代码会产生这种不平衡

        final TupleTag<FileRecord> fileTag = new TupleTag<>();
        final TupleTag<MysqlRecord> mysqlTag = new TupleTag<>();
        PCollection<KV<Integer, CoGbkResult>> joinedRawCollection =
                KeyedPCollectionTuple.of(fileTag, fileRecords)
                        .and(mysqlTag, mysqlRecords)
                        .apply(CoGroupByKey.create());

这是 Spark Executor DAG 可视化

最后一个工人会 运行 内存不足。我知道在 Spark 中,可以指定分区器来帮助在工作人员之间分配工作负载。但是,我如何在 Beam 中做到这一点?

编辑:

我怀疑 JDBCIo 无法正确分配一个查询,因此我将其拆分为多个 PCollections,然后将它们展平。我从 Mysql 读得更快,但最终 运行 遇到了同样的问题。

以下是正在进行的阶段:

但每个阶段仍然存在这种不平衡?:

用我自己无法区分 Spark 阶段和任务的实现来回答我自己的问题。任务确实分散了,我只是没有给驱动程序分配足够的内存。