apachesamza使用rocksdb作为本地存储的存储引擎。这允许有状态流处理,下面是一个非常好的概述。
我的用例:
我希望从apachekafka这样的系统中处理多个事件流。
这些事件创建状态-我希望跟踪的状态基于以前收到的消息。
我希望根据计算的状态生成新的流事件。
输入流事件是高度连接的,orientdb/neo4j等图形是查询数据以创建新流事件的理想介质。
我的问题是:
是否可以使用非kv存储作为samza的本地存储?有没有人用orientdb/neo4j做过这个,有没有人知道一个例子?
2条答案
按热度按时间vsmadaxz1#
输入流事件是定义一个全局图,还是为每个匹配的kafka/samza分区定义多个图?这一点很重要,因为桑扎州是地方性的,而不是全球性的。
如果它是一个全局图,那么可以从samza任务处理方法更新/查询一个单独的图系统。Cassandra星球上的泰坦就是这样一个图形系统。
如果是多个独立的图形,可以使用当前的rocksdbkv存储来模拟图形数据库操作。cassandra上的titan就是这样做的——使用cassandra kv存储来存储和查询图形。图形通过矩阵(如果连接,则将[i,j]设置为1)或边列表存储。对于每个节点,将其用作键,并将其邻居集存储为值。
cs7cruho2#
我一直在评估samza,我绝不是一个Maven,但我建议你阅读官方文档,甚至通读源代码,除了它在scala中的事实,它是非常平易近人的。
在这种情况下,在状态管理文档页面的底部,您可以看到:
其他存储引擎
samza的容错机制(将本地存储的写操作发送到复制的changelog)与存储引擎的数据结构和查询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
主要的实施问题似乎是:
记录对主题的所有更改,以便在任务失败时恢复存储的状态。
以性能良好的方式恢复商店的状态
批处理写入和缓存频繁读取,以节省到原始存储的行程。
报告有关商店使用情况的指标。