如何在Spark上均匀分配Beam Tasks?

时间:2017-03-29 21:04:04

标签: apache-spark apache-beam

我有一个简单的管道,它同时读取文本文件和mysql的记录并试图协调它们,即在数据库中不存在时插入记录,用文件更新数据库中的记录,并且DB中记录的一些其他更新,文件中不存在。

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

enter image description here

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

        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可视化

enter image description here

最终,一名工人将耗尽内存。我在Spark本身就知道,可以指定分区来帮助分配工作人员的工作量。但是,我如何在Beam中做到这一点?

修改

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

以下是正在处理的阶段: enter image description here

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

1 个答案:

答案 0 :(得分:0)

通过实现我自己无法区分Spark阶段和任务来回答我自己的问题。这些任务确实已经散开,我实际上并没有为驱动程序分配足够的内存。