我有一个简单的管道,它同时读取文本文件和mysql的记录并试图协调它们,即在数据库中不存在时插入记录,用文件更新数据库中的记录,并且DB中记录的一些其他更新,文件中不存在。
在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读得更快,但最终遇到了同样的问题。
答案 0 :(得分:0)
通过实现我自己无法区分Spark阶段和任务来回答我自己的问题。这些任务确实已经散开,我实际上并没有为驱动程序分配足够的内存。