【问题标题】:Real-time data streaming using Wikipedia's RecentChanges API使用 Wikipedia 的 RecentChanges API 的实时数据流
【发布时间】:2019-10-23 11:15:50
【问题描述】:

我最近尝试使用 NiFi -> Kafka -> Druid -> Superset 创建一个实时流媒体演示。出于本演示的目的,我选择使用Wikipedia's RecentChanges API 来获取最新更改的异步数据。

我使用这个URL 来获得更改的响应。我正在调用 API 常量,以免错过任何更改。这样,我会得到很多我不想要的重复项。

无论如何,是否可以参数化此 API 以修复它,例如获取前一秒的所有更改并每秒执行一次或其他方法来解决这个问题问题。我正在尝试为此使用 NiFi 进行配置,如果有人必须在该部分添加一些内容,请访问 Cloudera 上的此讨论。

【问题讨论】:

  • 为什么不使用event stream
  • @Tgr 我不知道有这样的 API,非常感谢。

标签: rest apache-nifi wikipedia-api


【解决方案1】:

是的。请参阅https://en.wikipedia.org/w/api.php?action=help&modules=query%2Brecentchanges 使用 rcstart 和 rcend 来定义您的开始和结束时间。 rcend 可以用“now”。

【讨论】:

  • 非常感谢 smartse 的回复。如果我将 rcend 设置为 now 那么 rcstart 的定义应该是什么让我们说获取前 5 秒。
  • 您必须获取当前时间然后减去 5 秒。请参阅mediawiki.org/wiki/Timestamp 了解可接受的格式。不过,Tgr 的建议可能更优雅。
  • 是的,我认为它更接近我的需要,但我面临一些消耗该流的问题,它无法以与 API 相同的方式解决,因为它遵循服务器发送的事件协议跨度>
  • @smartse +1 这是一个好的开始。我在回答stackoverflow.com/a/58553360/401025中提出了一个解决方案
【解决方案2】:

我想扩展 smartse 的答案并提出解决方案。您希望通过移动开始和结束参数将您的 API 请求放在特定的时间窗口中。窗口可能会像这样工作:

  • 初始化开始、结束时间戳参数
  • 将这些参数作为属性添加到流中
  • 下游处理器可以使用这些参数调用 API
  • 之后,您必须设置 start = previous_end + 1 秒和 end = now

当您确定下一次运行的新窗口时,您需要上一次运行的参数。这就是为什么你必须记住这些价值观。您可以使用 NiFi 的分布式地图缓存来实现这一点。

我为你准备了一个流程:

放大Get next date range

结束参数总是现在,所以你只需要存储开始参数。 FetchDistributedMapCache 会为您获取它并将其放入 stored.state 属性中:

Set time range处理器会初始化参数:

请注意,结束始终是现在,开始是初始日期(第一次运行)或最后一个结束参数加上 1 秒。此时,流被定向到Time range 输出,您可以在其中调用下游的 API。此外,您必须更新stored.value。这发生在ReplaceText 处理器中:

最后你更新了状态:

参数的生命周期与缓存标识符绑定。更改标识符时,您从头开始。

【讨论】:

  • 非常感谢您的回复 Upvote 我肯定会尝试您的版本,我非常感谢您创建了一个完整的流程让我理解。为了解决我的问题,我接受了 Tgr 的建议,并使用 python 创建了一个 Kafka 生产者,它读取尊重 SSE 协议的 HTTP 流 (EventStream)。我用 python 代码完成了所有的转换,整个过程都是实时的,我在 Superset 中得到了很好的结果。如果有人需要更多信息,我很乐意提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多