3

Apache Samza 使用 RocksDB 作为本地存储的存储引擎。这允许有状态的流处理,这里有一个很好的概述

我的用例:

  • 我有多个事件流,我希望从 Apache Kafka 等系统中获取这些事件流。
  • 这些事件创建状态 - 我希望跟踪的状态基于以前收到的消息。
  • 我希望根据计算的状态生成新的流事件。
  • 输入流事件高度连接,OrientDB / Neo4J 等图形是查询数据以创建新流事件的理想媒介。

我的问题:

是否可以使用非 KV 存储作为 Samza 的本地存储?有没有人用 OrientDB / Neo4J 做过这个,有人知道一个例子吗?

4

2 回答 2

1

我一直在评估 Samza,我绝不是专家,但我建议您阅读官方文档,甚至通读源代码——除了它是在 Scala 中的事实之外,它非常平易近人。

在这种特殊情况下,在状态管理文档页面的底部,您可以看到:

其他存储引擎

Samza 的容错机制(将本地存储的写入发送到复制的变更日志)与存储引擎的数据结构和查询 API 完全分离。虽然键值存储引擎适用于通用处理,但您可以通过实现StorageEngine接口轻松为其他类型的查询添加自己的存储引擎。Samza 的模型特别适用于嵌入式存储引擎,它们作为库在与流任务相同的进程中运行。

其他可能有用的存储引擎的一些想法:持久堆(用于运行前 N 个查询)、近似算法(如布隆过滤器和 hyperloglog)或全文索引(如 Lucene)。(已接受补丁!)

StorageEngine实际上,大约两周前,我通读了默认实现的代码,以更好地了解它是如何工作的。我绝对没有足够的知识来明智地谈论它,但我可以指出它:

主要的实施问题似乎是:

  1. 记录对主题的所有更改,以便在任务失败时可以恢复存储的状态。
  2. 以高性能的方式恢复商店的状态
  3. 批量写入和缓存频繁读取以节省前往原始存储的行程。
  4. 报告有关商店使用情况的指标。
于 2015-08-17T22:48:48.173 回答
0

输入流事件是定义一个全局图,还是为每个匹配的 Kafka/Samza 分区定义多个图?这很重要,因为 Samza 州是本地的而不是全球的。

如果它是一个全局图,您可以从 Samza 任务处理方法更新/查询一个单独的图系统。Cassandra 上的 Titan 就是一个这样的图形系统。

如果是多个单独的图,你可以使用当前的 RocksDB KV 存储来模拟图数据库操作。Cassandra 上的 Titan 就是这样做的——使用 Cassandra KV 存储来存储和查询图形。图形通过矩阵(如果连接,将 [i,j] 设置为 1)或边列表存储。对于每个节点,将其用作键并将其邻居集存储为值。

于 2015-12-08T15:34:17.477 回答