繁体   English   中英

Apache Beam中有状态处理的问题

[英]Issues with Stateful processing in Apache Beam

所以我已经阅读了梁的状态处理及时处理文章,并发现了实现这些功能的问题。

我试图解决的问题与类似,为每一行生成一个顺序索引。 因为我希望能够将数据流生成的行引用到原始源的行。

public static class createIndex extends DoFn<String, KV<String, String>> {
  @StateId("count")
  private final StateSpec<ValueState<Long>> countState = StateSpecs.value(VarLongCoder.of());

  @ProcessElement
  public void processElement(ProcessContext c, @StateId("count") ValueState<Long> countState)  {

    String val = c.element();
    long count = 0L;
    if(countState.read() != null)
      count = countState.read();

    count = count + 1;
    countState.write(count);

    c.output(KV.of(String.valueOf(count), val));

  }
}

Pipeline p = Pipeline.create(options);

p.apply(TextIO.read().from("gs://randomBucket/file.txt"))
 .apply(ParDo.of(new createIndex()));

我按照我在网上找到的任何内容查看了ParDo的原始源代码,但不确定需要做什么。 我得到的错误是:

java.lang.IllegalArgumentException: ParDo requires its input to use KvCoder in order to use state and timers.

在这里这里查看了示例。

我意识到这是一个简单的问题,但由于缺乏足够的示例或文档,我无法解决问题。 我很感激任何帮助。 谢谢!

好的,所以我继续研究这个问题,在阅读完一些资料后,我就能解决问题。 事实证明, ParDo.of(new DoFn())的输入要求输入的格式为KV<T,U>

因此,为了读取文件并为每一行创建索引,我需要通过Key Value Pair对象传递它。 下面我添加了代码:

public static class FakeKvPair extends DoFn<String, KV<String, String>> {
  @ProcessElement
  public void processElement(ProcessContext c) {
    c.output(KV.of("", c.element()));
  }
}

并将管道更改为:

Pipeline p = Pipeline.create(options);

p.apply(TextIO.read().from("gs://randomBucket/file.txt"))
 .apply(ParDo.of(new FakeKvPair()))
 .apply(ParDo.of(new createIndex()));

这引发的新问题是线路的顺序是否被保留,因为我在运送到createIndex()之前运行额外的ParDo函数(可能会改变线的顺序createIndex()

在我的本地计算机上保留了订单,但我不确定它如何扩展到Dataflow。 但我会问这是一个不同的问题。

暂无
暂无

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

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