Google cloud dataflow 如何读取GCP数据流中CombineFn函数的日志消息?

Google cloud dataflow 如何读取GCP数据流中CombineFn函数的日志消息?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我正在创建一个Apache Beam流处理管道,以在GCP数据流中运行。我有许多扩展DoFn和CombineFn的转换。在DoFn中,使用数据流作业详细信息中的日志窗口可以很好地可视化日志。但是,未显示CombineFn转换的日志 我尝试了不同的日志级别,使用DirectRunner时也显示了良好的性能 下面是一些示例代码。为了简洁起见,我将输入和输出更改为字符串,代码中有一些自定义类 import java.io.Serializable; 导入org.apache.avro.reflect.

我正在创建一个Apache Beam流处理管道,以在GCP数据流中运行。我有许多扩展DoFn和CombineFn的转换。在DoFn中,使用数据流作业详细信息中的日志窗口可以很好地可视化日志。但是,未显示CombineFn转换的日志

我尝试了不同的日志级别,使用DirectRunner时也显示了良好的性能

下面是一些示例代码。为了简洁起见,我将输入和输出更改为字符串,代码中有一些自定义类

import java.io.Serializable;
导入org.apache.avro.reflect.Nullable;
导入org.apache.beam.sdk.coders.AvroCoder;
导入org.apache.beam.sdk.coders.DefaultCoder;
导入org.apache.beam.sdk.transforms.Combine.CombineFn;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
公共类平均SPV扩展组合Fn{
私有静态最终记录器LOG=LoggerFactory.getLogger(AverageSpv.class);
@DefaultCoder(AvroCoder.class)
公共静态类Accum实现了可序列化{
@可为空的字符串id;
}
@凌驾
公共累计器{
返回新的Accum();
}
@凌驾
公共累加器输入(累加器、字符串输入){
info(“添加输入:id{},输入);
acculator.id=输入;
回流蓄能器;
}
@凌驾
公共累加器(可累加器){
LOG.info(“合并累加器”);
Accum merged=createAccumulator();
用于(蓄能器:蓄能器){
merged.id=acculator.id;
}
返回合并;
}
@凌驾
公共车辆PeedPerSegmentInfo提取输出(累加器){
LOG.info(“提取累加器”);
info(“提取输出:id{}”,acummulator.id);
返回acummulator.id;
}
}

Apache Beam CombineFn操作在数据流中的多个步骤中执行(具体来说,在将所有结果混洗到单个键之前会进行大量的预组合,然后在后续的后GBK步骤中将所有上游结果合并到一个最终结果中。)事实上没有单个执行“步骤”“与图中的原始合并步骤相对应的可能是阻止找到日志的原因


这是一个bug,应该修复。如前所述,解决方法是查看管道中的所有日志

我做了一个复制,同样的事情也发生在我的云控制台上。但是,我可以在Stackdriver日志中很好地看到它们。好的,当我在Dataflow控制台中单击CombineFn步骤,然后单击LOGS时,那里没有你发现的东西。当我单击StackDriver链接时,日志仍然没有显示在StackDriver中。但是,当我取消选择CombineFn步骤并转到常规日志,然后是StackDriver时,CombineFn日志就在那里。谢谢你的解决办法。