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…);
}
}));
上面的例子是根据你的信息改编的。很不清楚你在问什么。