我的Java管道中有3个GroupBys,在每个GroupBy之后,程序运行一些计算b / w阶段。这些组变得越来越大。程序添加的唯一内容是每个块的新键。
最后一个GroupBy处理w /较小的大块#。当然,管道适用于少量项目,但是在第二个或第三个GroupBys中,它对于大量项目都失败了。
我玩过X / X和Xmx甚至选择了更大的实例&nbsp-standard-64'但是它没有用。对于失败的示例,我确定输出小于5G,那么有没有其他方法可以控制DataFlow中每个map / reduce任务的内存?
如果Dataflow可以处理第一个GroupBy,那么它应该能够减少在堆上分配更多内存并在下一阶段处理大块的任务数量。
任何建议都将不胜感激!
更新:
.apply(ParDo.named("Sort Bins").of(
new DoFn<KV<Integer, Iterable<KV<Long, Iterable<TableRow>>>>, KV<Integer, KV<Integer, Iterable<KV<Long, Iterable<TableRow>>>>>>() {
@Override
public void processElement(ProcessContext c) {
KV<Integer, Iterable<KV<Long, Iterable<TableRow>>>> e = c.element();
Integer Secondary_key = e.getKey();
ArrayList<KV<Long, Iterable<TableRow>>> records = Lists.newArrayList(e.getValue()); // Get a modifiable list.
Collections.sort(records, BinID_COMPARATOR);
Integer Primary_key= is a simple function of the secondary key;
c.output(KV.of(Primary_key, KV.of(Secondary_key, (Iterable<KV<Long, Iterable<TableRow>>>) records)));
}
}));
报告了最后一行(c.output)的错误。