繁体   English   中英

外部 api 调用 apache 光束数据流

[英]external api call in apache beam dataflow

我有一个用例,我读入存储在谷歌云存储中的换行符 json 元素并开始处理每个 json。 在处理每个 json 时,我必须调用外部 API 进行重复数据删除,无论之前是否发现了 json 元素。 我在每个ParDo上使用DoFn进行 ParDo。

我还没有看到任何在线教程说明如何从 apache 光束DoFn数据流调用外部 API 端点。

我正在使用 Beam 的JAVA SDK。 我研究的一些教程解释了使用startBundleFinishBundle但我不清楚如何使用它

如果您需要检查外部存储中每个 JSON 记录的重复项,那么您仍然可以使用DoFn 有几个注释,如@Setup@StartBundle@FinishBundle等,可用于注释DoFn中的方法。

例如,如果您需要实例化客户端 object 以将请求发送到您的外部数据库,那么您可能希望在@Setup方法(如 POJO 构造函数)中执行此操作,然后在您的@ProcessElement方法中利用此客户端 object。

让我们考虑一个简单的例子:

static class MyDoFn extends DoFn<Record, Record> {

    static transient MyClient client;

    @Setup
    public void setup() {
        client = new MyClient("host");
    }

    @ProcessElement
    public void processElement(ProcessContext c) {
        // process your records
        Record r = c.element();
        // check record ID for duplicates
        if (!client.isRecordExist(r.id()) {
            c.output(r);
        }
    }

    @Teardown
    public void teardown() {
        if (client != null) {
            client.close();
            client = null;
        }
    }
}

此外,为避免对每条记录进行远程调用,您可以将记录批处理到内部缓冲区(将输入数据拆分为捆绑包)并以批处理模式检查重复项(如果您的客户端支持此操作)。 为此,您可以使用@StartBundle@FinishBundle注释的方法,这些方法将在相应地处理 Beam 包之前和之后调用。

对于更复杂的示例,我建议查看不同 Beam IOs 中的 Sink 实现,例如KinesisIO

There is an example of calling external system in batches using a stateful DoFn in the following blog post: https://beam.apache.org/blog/2017/08/28/timely-processing.html , might be helpful.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM