JAVA-Apache BEAM-GCP : GroupByKey works fine with Direct Runner but fails with Dataflow runner

标签 java google-cloud-dataflow apache-beam dataflow direct-runner

我使用 Dataflow 运行程序测试了我的代码,但它返回错误:

> Error message from worker: java.lang.RuntimeException:
> org.apache.beam.sdk.util.UserCodeException:
> com.fasterxml.jackson.core.JsonParseException: Unrecognized token
> 'WindowReiterable[ ] 
> org.apache.beam.runners.dataflow.worker.GroupAlsoByWindowsParDoFn.processElement(GroupAlsoByWindowsParDoFn.java:114)
> org.apache.beam.runners.dataflow.worker.util.common.worker.ParDoOperation.process(ParDoOperation.java:44)
> org.apache.beam.runners.dataflow.worker.util.common.worker.OutputReceiver.process(OutputReceiver.java:49)
> org.apache.beam.runners.dataflow.worker.util.common.worker.ReadOperation.runReadLoop(ReadOperation.java:201)
> org.apache.beam.runners.dataflow.worker.util.common.worker.ReadOperation.start(ReadOperation.java:159)
> org.apache.beam.runners.dataflow.worker.util.common.worker.MapTaskExecutor.execute(MapTaskExecutor.java:77)
> org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.executeWork(BatchDataflowWorker.java:411)
> org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.doWork(BatchDataflowWorker.java:380)
> org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.getAndPerformWork(BatchDataflowWorker.java:305)
> org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.doWork(DataflowBatchWorkerHarness.java:140)
> org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.call(DataflowBatchWorkerHarness.java:120)
> org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.call(DataflowBatchWorkerHarness.java:107)
> java.util.concurrent.FutureTask.run(FutureTask.java:266)
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> java.lang.Thread.run(Thread.java:748) Caused by:
> org.apache.beam.sdk.util.UserCodeException:
> com.fasterxml.jackson.core.JsonParseException: Unrecognized token
> 'WindowReiterable': was expecting ('true', 'false' or 'null') at
> [Source: (String)"WindowReiterable []

请注意,我在 Direct Runner 中使用了相同的代码,并且它工作得很好。 有人遇到过这个问题吗?如果是这样,你能告诉我如何解决吗? 或者我应该用另一个函数替换 GroupByKey ...?

代码如下:

PCollection<KV<String, Iterable<String>>> KVElements =
        pipeline.apply("Reads the input fixed-width file", TextIO
                .read()
                .from(options.getPolledFile())).apply("Converts to KV elements, ParDo.of(new DoFn<String, String>(){
            @ProcessElement
            public void processElement(ProcessContext c) {
                String element = c.element();
        String[] columns = (“key;col1;col2;col3”).split(";");
        String[] values = element.split(";");
            ObjectNode rowToJson = jsonParser.createObjectNode();
        for (int i = 0; i < columns.length; i++) {
             rowToJson.put(columns[i], values[i].trim());
        }

    c.output(KV.of(rowToJson.get(“key”).asText(), rowToJson.toString()));

}}));

PCollection <KV<String, Iterable<String>>> joinedCollection = KVElements.apply(GroupByKey.create());

PCollection  <String> joined = (PCollection<String>) joinedCollection.apply("Converts to json string", ParDo.of(new DoFn<KV<String, Iterable<String>>, String>(){

    @ProcessElement
    public void processElement(ProcessContext c) throws IOException {
        KV<String, Iterable<String>> element = c.element();
        JsonNode parsed = jsonParser.readTree(String.valueOf(element.getValue()));
        final ObjectMapper mapper = new ObjectMapper();
        ObjectNode KVJson = mapper.createObjectNode();
        String value = null;

        for (int i =0; i<parsed.size();i++){
            KVJson.put("col1",parsed.get(i).get("col1"));
            KVJson.put("col2",parsed.get(i).get("col2"));
            KVJson.put("col3",parsed.get(i).get("col3"));
            }

        c.output(KVJson.toString());

}}));

Apache Beam 版本:2.17.0

最佳答案

看起来 ParDo 定义不正确。在代码片段中

"Converts to KV elements, ParDo.of(new DoFn<String, String>

应该进行更改以匹配作为输出生成的 KV 结果,如下所示

"Converts to KV elements, ParDo.of(new DoFn<String, KV<String, Iterable<String>>>

关于JAVA-Apache BEAM-GCP : GroupByKey works fine with Direct Runner but fails with Dataflow runner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60639914/

相关文章:

java - @Value注解不起作用

pandas - 如何在 Apache Beam 中使用 Pandas?

google-cloud-platform - 允许用户对 gcp 数据流项目进行写访问

java - @OnTimer 方法在触发时接收空引用

java - 数据流管道和发布订阅模拟器

ssl - 在 Dataflow 上运行的 Apache Beam 管道无法从 KafkaIO : SSL handshake failed 读取

java - SlidingWindows 用于 Apache Beam 上的慢速数据(大间隔)

java - 如何在java中将文件读入字符串?

java - 从同一 HashMap 中提取的值的顺序是否相同?

java - 如何在Eclipse中调试java包的值?