如何使用Cassandra加速TitanDB中的双跳查询

时间:2016-09-13 06:12:06

标签: graph cassandra titan gremlin

我正在测试TitanDB + Cassandra。 图形模式如下:

VERTEX:USER(userId), IP(ip), SESSION_ID(sessionId), DEVICE(deviceId) EDGE:USER->IP, USER->SESSION_ID, USER->DEVICE 数据大小:顶点100万,边缘:10亿 索引:各种边缘的以顶点为中心的索引。 userId,ip,sessionId和deviceId的索引。

为IP,DEVICE和SESSION_ID设置Vertext分区。共32个分区。

Cassandra主持人:AWS EC2 I2(2xlage)x 24。 目前,每个主机都拥有大约30G的数据。

Usecase:给userId一个edgeLabel,通过这个edge的out顶点找出所有相关的用户。 例如:g.V().has(T.label, 'USER').has('USER_ID', '12345').out('USER_IP').in().valueMap();

但是这种查询很慢,有时甚至数百秒。 一个用户可以拥有许多相关的IP(数百个),因此从这些IP中,它也可以获得大量的USER(数千个)。

Titan是否并行查询针对后端存储的所有分区的这种查询? 我尝试使用限制:

g.V().has(T.label, 'USER').has('USER_ID', '12345').out('USER_IP').limit(50).in().limit(100).valueMap()

它也很慢。我希望这种查询可以在5秒内完成。 Titan limit()的工作原理如何?首先获得所有结果,然后'限制'??

如何提高性能呢?任何人都可以提出一些建议吗?

1 个答案:

答案 0 :(得分:1)

你可以获得的一个快速性能来自使用泰坦Vertex Centric Indices,这可以让你从一个顶点快速跳跃到另一个顶点。例如,您可以尝试这样的事情:

mgmt = graph.openManagement()
userId = mgmt.getPropertyKey('userId')
userIp = mgmt.getEdgeLabel('USER_IP')
mgmt.buildEdgeIndex(userIp, 'userIdByUserIP', Direction.BOTH, Order.decr, time)
mgmt.commit()

创建一个简单的以顶点为中心的索引。

如果要从多个用户顶点查找多个用户ips,则可以尝试使用Titan-Hadoop。但是,这是一个更复杂的过程。