如何刷新/重新加载每个窗口上的侧面输入

时间:2019-07-15 04:29:14

标签: java join apache-beam beam-sql

我正在使用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());

请为我指导这些类型用例的最佳实践,并为我提供一些示例代码以更好地理解。

谢谢, 哥谭

1 个答案:

答案 0 :(得分:1)

您正在为每天的小型查找使用正确的推荐模式。

在大多数情况下,建议您使用DoFn的标注,而不是使用SideInput。这个旧博客包含“调用外部服务以进行数据丰富”模式的示例。

Guide to common Cloud Dataflow use-case patterns, Part 1

我将尝试在以下位置找到时间将此图案添加到“光束”图案页面:

Beam Patterns