Apache Samza使用RocksDB作为本地存储的存储引擎。这允许有状态流处理,这里有一个很好的概述。
我的用例:
- 我有多个事件流,我希望处理从一个系统,如Apache Kafka。
- 这些事件创建状态—我希望跟踪的状态基于先前收到的消息。
- 我希望基于计算状态生成新的流事件。
- 输入流事件是高度连接的,像OrientDB/Neo4J这样的图是查询数据以创建新流事件的理想媒介。
我的问题:
是否可以使用非kv存储作为Samza的本地存储?有人这样做过与OrientDB/Neo4J,有人知道一个例子吗?
我一直在评估Samza,我绝不是专家,但我建议您阅读官方文档,甚至通读源代码-除了它是在Scala中,它非常容易接近。
在这个特殊的例子中,在文档的状态管理页面的底部有这样的内容:
其他存储引擎 Samza的容错机制(将本地存储的写操作发送到复制的变更日志)与存储引擎的数据结构和查询api完全解耦。虽然键值存储引擎很适合通用处理,但您可以通过实现StorageEngine接口轻松地为其他类型的查询添加自己的存储引擎。Samza的模型特别适用于嵌入式存储引擎,它作为库在与流任务相同的进程中运行。其他存储引擎的一些想法可能是有用的:持久堆(用于运行top-N查询),近似算法,如bloom过滤器和hyperloglog,或全文索引,如Lucene。(补丁接受!)
我实际上在大约两周前通读了默认StorageEngine
实现的代码,以更好地了解它是如何工作的。我确实知道得不够多,说不出多少聪明的话,但我可以告诉你:
- https://github.com/apache/samza/tree/master/samza-kv-rocksdb/src/main/scala/org/apache/samza/storage/kv
- https://github.com/apache/samza/tree/master/samza-kv/src/main/scala/org/apache/samza/storage/kv
主要的实现关注点似乎是:
- 记录主题的所有更改,以便在任务失败时可以恢复存储状态。
- 以高效的方式恢复存储状态
- 批量写和缓存频繁的读,以节省到原始存储的行程。
- 报告商店使用的指标。
输入流事件是为每个匹配的Kafka/Samza分区定义一个全局图,还是多个图?这一点很重要,因为Samza状态是局部的,而不是全局的。
如果它是一个全局图,你可以从Samza任务处理方法更新/查询一个单独的图系统。卡桑德拉上的泰坦星就是这样一个图形系统。
如果它是多个独立的图形,你可以使用当前的RocksDB KV存储来模拟图形数据库操作。Titan on Cassandra就是这样做的——使用Cassandra KV存储来存储和查询图形。图可以通过矩阵(如果连接则将[i,j]设置为1)或边列表存储。对于每个节点,使用它作为键,并将其邻居集存储为值。