- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题背景
我试图从实时流中生成每个键的事件项的总(线性)顺序,其中顺序是事件时间(从事件有效负载派生)。
方法
我曾尝试使用流来实现这一点,如下所示:
1)设置一个非重叠的顺序窗口,例如持续时间 5 分钟
2)建立一个允许的迟到——丢弃迟到的事件是可以的
3) 设置累积模式以保留所有已触发的 Pane
4) 使用“AfterwaterMark”触发器
5) 处理触发 Pane 时,仅考虑最后一个 Pane
6) 使用 GroupBy.perKey 确保此窗口中此键的所有事件将作为单个资源上的一个单元进行处理
虽然这种方法确保给定窗口内每个键的线性顺序,但它并不能保证跨多个窗口,例如可能有一个键的事件窗口,它发生在与前面的窗口同时处理之后,如果第一个窗口失败并且必须重试,这很容易发生。
我正在考虑采用这种方法,首先可以处理实时流,以便它按键对事件进行分区,并将它们写入以窗口范围命名的文件中。
由于光束处理的并行特性,这些文件也会乱序生成。
然后,单个流程协调器可以将这些文件按顺序提交到批处理管道 - 只有在它收到前一个文件并且其下游处理已成功完成时才提交下一个文件。
问题是 Apache Beam 只会在该时间窗口中至少有一个时间元素时触发 Pane 。因此,如果事件中存在间隙,则生成的文件中可能存在间隙 - 即丢失的文件。丢失文件的问题在于,协调批处理器无法区分时间窗口是否已经过去而没有数据,或者是否出现故障,在这种情况下,直到文件最终到达它才能继续进行。
强制事件窗口触发的一种方法可能是以某种方式将虚拟事件添加到每个分区和时间窗口的流中。然而,这很难做到……如果时间序列中有很大的差距,那么如果这些虚拟事件发生在很晚的事件周围,那么它们将被视为迟到而被丢弃。
是否有其他方法可以确保每个可能的事件窗口都有触发器,即使这会导致输出空文件?
从实时流中按键生成总排序是 Apache Beam 的一个容易处理的问题吗?我应该考虑另一种方法吗?
最佳答案
根据您对易处理的定义,当然可以在 Apache Beam 中按事件时间戳对每个键的流进行完全排序。
以下是设计背后的考虑因素:
ParDo
使用 state和计时器( blog post still under review )在全局窗口中。这使其成为每个键的工作流程。 ValueState
. EventHeap
为简洁起见,数据结构。在实践中,您希望将其分解为多个状态单元以最小化传输的数据。堆可能是对原始状态类型的合理补充。
new DoFn<KV<K, Event>, Void>() {
@StateId("heap")
private final StateSpec<ValueState<EventHeap>> heapSpec = StateSpecs.value();
@TimerId("next")
private final TimerSpec nextTimerSpec = TimerSpec.timer(TimeDomain.EVENT_TIME);
@ProcessElement
public void process(
ProcessContext ctx,
@StateId("heap") ValueState<EventHeap> heapState,
@TimerId("next") Timer nextTimer) {
EventHeap heap = firstNonNull(
heapState.read(),
EventHeap.createForKey(ctx.element().getKey()));
heap.add(ctx.element().getValue());
// When the watermark reaches this time, no more elements
// can show up that have earlier timestamps
nextTimer.set(heap.nextTimestamp().plus(allowedLateness);
}
@OnTimer("next")
public void onNextTimestamp(
OnTimerContext ctx,
@StateId("heap") ValueState<EventHeap> heapState,
@TimerId("next") Timer nextTimer) {
EventHeap heap = heapState.read();
// If the timer at time t was delivered the watermark must
// be strictly greater than t
while (!heap.nextTimestamp().isAfter(ctx.timestamp())) {
writeToExternalSystem(heap.pop());
}
nextTimer.set(heap.nextTimestamp().plus(allowedLateness);
}
}
关于google-cloud-dataflow - 使用 Apache Beam 按键处理事件的总排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45888719/
我正在使用 Apache Beam 从 Kafka 读取数据。由于乱序写入 Kafka,我想使用有效负载中的事件时间戳而不是默认的 LogAppendTime。 我看到了一个解决方案 Apache B
我有一个通用输入请求,其中包含需要转换和保存的输入。如果需要转换生成的输出,我会为它实现一个新的处理器(转换器)。 class Request { Input input; Transform
我已经在 Apache Beam 上工作了几天。我想快速迭代我正在工作的应用程序,并确保我正在构建的管道没有错误。在 Spark 中我们可以使用 sc.parallelise当我们应用一些 Actio
我有一个简单的波束管道,它使用带有 tf 变换的通用句子编码器获取一些文本并获得嵌入。与使用 tf 1 制作的演示非常相似。 import tensorflow as tf import apache
使用Apache Beam丰富数据时,对每个数据项都进行一次API调用会不会出错? (我是 Apache Beam 的新手) 最佳答案 不,但您可以批处理 API 调用以获得更好的性能。查看 this
我的任务是为一款应用添加支持,以便通过 Android 上的“NFC”在设备之间传输大型数据文件(数十兆字节)。 我知道 Android 上真正的 NFC 非常慢,但我知道 ICS 支持将批量数据传输
NFC:S-beam 和 Android beam 有什么区别?有人可以解释 Wifi-Direct/Bluetooth 激活和传输数据的确切流程吗? 最佳答案 在 stackexchanged 上解
我正在使用 Beam 管道计算流式数据的电话号码频率。我使用的滑动窗口每 5 分钟重复一次,总周期为 15 分钟,因此正如预期的那样,对于某些输入,当输入落在多个窗口中时,我会得到多个输出。 计算出现
输入的PCollection是http requests,是一个有界数据集。我想在 ParDo 中进行异步 http 调用(Java),解析响应并将结果放入输出 PCollection 中。我的代码如
输入的PCollection是http requests,是一个有界数据集。我想在 ParDo 中进行异步 http 调用(Java),解析响应并将结果放入输出 PCollection 中。我的代码如
在使用 PAssert 为我的光束管道编写单元测试时,管道输出对象很好,但在与以下断言错误进行比较时测试失败: java.lang.AssertionError: Decode pubsub mess
我正在尝试从 here 运行 Wordcount 演示与 Samza Runner。这是我的build.gradle plugins { id 'eclipse' id 'java' id
我正在尝试使用 Beam 和 Flink runner 设置流处理管道。 Flink 是一个本地 session 部署,包含以下 docker-compose 文件: version: "3" ser
在尝试编译我的 Phoenix 项目的发行版时,出现以下错误: $ mix release .... ==> Generated .appup for myapp 0.0.1 -> 0.0.2 ===
我正在尝试使用 Apache beam-dataflow 连接到安装在云实例中的配置单元实例。当我运行它时,出现以下异常。当我使用 Apache Beam 访问此数据库时,就会发生这种情况。我见过很多
我正在使用 zsh,并且我已经安装了 gcloud,以便通过我的 Mac 上的本地终端与 GCP 进行交互。我遇到了这个错误“zsh:找不到匹配项:apache-beam[gcp]”。但是,当我在 G
主要记录两种不同的beam search版本 版本一 使用类似层次遍历的方式进行搜索,用队列进行维护,每次循环对当前层的所有节点进行搜索,这些节点每个分别对应topk个节点作为下一层候选节点,取
我的目标是创建一个每秒调用后端(云托管)服务最多次数的管道......我该如何实现? 背景故事:想象一下后端服务使用单个输入调用并返回单个输出。该服务具有与其关联的配额,允许每秒最大请求数(假设每秒
我想写入一个 gs 文件,但在编译时我不知道文件名。它的名称基于在运行时定义的行为。我该如何继续? 最佳答案 如果你使用 Beam Java,你可以使用 FileIO.writeDynamic()为此
我试图弄清楚如何使用Apache Beam读取大型CSV文件。 “大”是指几千兆字节(因此一次将整个CSV读取到内存中是不切实际的)。 到目前为止,我已经尝试了以下选项: 使用TextIO.read(
我是一名优秀的程序员,十分优秀!