Google cloud dataflow 通过数据流处理日志时,是否可以跟踪状态?

Google cloud dataflow 通过数据流处理日志时,是否可以跟踪状态?,google-cloud-dataflow,Google Cloud Dataflow,是否可以让数据流进程保持该状态。有一些日志处理工具可以实现这一点,它们提供了可用于实时处理的快速访问(适当/内存中)文件,以便在处理日志时跟踪日志上的状态。 一个用例示例是跟踪用户采取的注册步骤。注册步骤将出现在不同的日志中,这些日志的数据形式将由实时进程组装成一个最终的数据库记录(针对每个注册用户),并写入数据库。 我的数据流代码是否可以跟踪用户的许多注册步骤(流式输入),一旦用户的注册步骤完成,则让数据流进程将记录写入数据库(每个用户一条记录) 我对数据流架构了解不多。它必须使用一些(专有/

是否可以让数据流进程保持该状态。有一些日志处理工具可以实现这一点,它们提供了可用于实时处理的快速访问(适当/内存中)文件,以便在处理日志时跟踪日志上的状态。
一个用例示例是跟踪用户采取的注册步骤。注册步骤将出现在不同的日志中,这些日志的数据形式将由实时进程组装成一个最终的数据库记录(针对每个注册用户),并写入数据库。 我的数据流代码是否可以跟踪用户的许多注册步骤(流式输入),一旦用户的注册步骤完成,则让数据流进程将记录写入数据库(每个用户一条记录)

我对数据流架构了解不多。它必须使用一些(专有/内存中的nosql)数据存储来跟踪它需要跟踪的内容(例如,当它试图产生前100名客户时)。数据流进程是否也可以使用快速访问数据存储


感谢

数据流目前没有公开它使用的底层状态机制。然而,这肯定会在未来的更新中出现。

正如丹尼尔姆所说,国家还没有公开。好消息是您的用例可能不需要它

如果您有一个
PCollection
,您可以使用
CombineFn
Combine.perKey
来获取特定
用户ID的所有
LogEvent
并将它们合并到一个输出中。
CombineFn
告诉数据流如何创建累加器,通过合并输入元素进行更新,然后提取最终输出。像
Top
这样的转换实际上使用了
CombineFn
(使用堆作为累加器)而不是实际的状态API

如果您的事件属于不同的类型,您仍然可以这样做。例如,如果您有两个日志,则可以执行以下操作:

PCollection<KV<UserId, LogEvent1>> events1 = ...;
PCollection<KV<UserId, LogEvent2>> events2 = ...;

// Create tuple tags for the value types in each collection.
final TupleTag<LogEvent1> tag1 = new TupleTag<LogEvent1>();
final TupleTag<LogEvent2> tag2 = new TupleTag<LogEvent2>();

 //Merge collection values into a CoGbkResult collection
PCollection<KV<UserIf, CoGbkResult>> coGbkResultCollection =
KeyedPCollectionTuple.of(tag1, pt1)
                     .and(tag2, pt2)
                     .apply(CoGroupByKey.<UserId>create());

// Access results and do something.
PCollection<T> finalResultCollection =
  coGbkResultCollection.apply(ParDo.of(
    new DoFn<KV<K, CoGbkResult>, T>() {
      @Override
      public void processElement(ProcessContext c) {
        KV<K, CoGbkResult> e = c.element();
        // Get all LogEvent1 values
        Iterable<LogEvent1> event1s = e.getValue().getAll(tag1);
        // There will only be one LogEvent2
        LogEvent2 event2 = e.getValue().getOnly(tag2);
        ... Do Something to compute T ....
        c.output(...some T...);
      }
    }));
PCollection事件1=。。。;
PCollection事件2=。。。;
//为每个集合中的值类型创建元组标记。
final TupleTag tag1=新TupleTag();
final TupleTag tag2=新TupleTag();
//将集合值合并到CoGbkResult集合中
PCollection coGbkResultCollection=
KeyedPCollectionTuple.of(tag1,pt1)
.和(tag2,pt2)
.apply(CoGroupByKey.create());
//访问结果并做一些事情。
PCollection finalResultCollection=
coGbkResultCollection.apply(第页)(
新DoFn(){
@凌驾
公共void processElement(ProcessContext c){
KV e=c.元件();
//获取所有LogEvent1值
Iterable event1s=e.getValue().getAll(tag1);
//只有一个LogEvent2
LogEvent2 event2=e.getValue().getOnly(tag2);
…做点什么来计算T。。。。
c、 输出(…某些T…);
}
}));

上面的例子是根据你的信息改编的。

很不清楚你在问什么。