我正在使用Apache Beam结合多个流和一些查找。我有2种情况,如果查找大小很大,我希望侧面输入为每个记录处理重新加载/刷新(即,我将使用where子句查询数据库),如果查找尺寸较小,则重新加载/刷新一次一天。
我想知道什么是正确的方法。我不希望海量数据输入消耗所有工作人员的内存。
我已经使用下面的代码每天刷新一次侧面输入。
PCollectionView<Map<String, String>> lkp =
p.apply(GenerateSequence.from(0)).withRate(1, Duration.standardDays(1))
.apply(
Window.<Long>into(new GlobalWindows())
.triggering(Repeatedly.forever(AfterProcessingTime.pastFirstElementInPane()))
.discardingFiredPanes())
.apply(
ParDo.of(
new DoFn<Long, Map<String, String>>() {
private static final long serialVersionUID = 1L;
@ProcessElement
public void process(
@Element Long input, OutputReceiver<Map<String, String>> o) {
Map<String, String> map = HiveConnection.getHiveConnection("select * from table");
o.output(map);
}
}))
.apply(View.<Map<String, String>>asSingleton());
请为我指导这些类型用例的最佳实践,并为我提供一些示例代码以更好地理解。
谢谢, 哥谭
答案 0 :(得分:1)
您正在为每天的小型查找使用正确的推荐模式。
在大多数情况下,建议您使用DoFn的标注,而不是使用SideInput。这个旧博客包含“调用外部服务以进行数据丰富”模式的示例。
Guide to common Cloud Dataflow use-case patterns, Part 1
我将尝试在以下位置找到时间将此图案添加到“光束”图案页面: