Gremlin:OLAP 与划分查询

Gremlin: OLAP vs dividing query

我有一个查询(下面的link)我必须在我的应用程序中每天或每周执行一次以查找连接的用户组。在查询中,我为应用程序的每个用户检查了所有可能的组(并非所有用户都被评估,但可能很多)。目前我只使用 Gremlin 服务器在本地主机上进行性能测试,因为我的应用程序还没有上线。

问题是当模拟许多用户测试此查询时,查询达到了默认情况下在 Gremlin 服务器中配置的请求可以占用的时间限制,另一个问题是查询没有占用完整的 CPU用法,因为单个查询似乎旨在使用单个线程或以某种方式减少 CPU 处理量。

所以我想到了 2 个解决方案,将查询分成每个用户一个块或使用 OLAP:

解决方案一: 发送查询以首先获取用户,然后为每个用户发送一个查询,然后删除服务器代码中的重复项,这在我的情况下应该有效,因为我可以同时发送所有查询,所以我可以使用所有可用资源并绕过时间限制。

方案二: 使用联机分析处理程序。我想 OLAP 没有时间限制。问题:据我所知,我的想法是使用 Amazon Neptune,但那里不支持 OLAP。 在这个关于它的问题中: Gremlin OLAP queries on AWS Neptune

大卫 说: 更新:自 GA(2018 年 6 月)以来,Neptune 支持在单个 request/transaction

中进行多个查询

“单个请求中的多个查询”是什么意思?

我的解决方案 1 与 OLAP 相比如何?

我是否应该寻找另一个支持 OLAP 的数据库服务而不是 Neptune?哪一个可能是?我不想要一个意味着学习设置我自己的“Neptune 类”服务器的选项,我的时间有限。

如果您想查看,我的查询: https://gremlify.com/69cb606uzaj

这个问题有点复杂。

The problem is that when testing this query simulating many users the query reaches the time limit a request can take that is configured in Gremlin Server by default,

我假设您无法更改默认值是有原因的,但是对于那些可能正在阅读此答案的人来说,超时是可以在服务器上配置的(evaluationTimeoutserver yaml) and per request both for scripts and bytecode 基于请求。

another problem is that the query does not take full CPU usage since it seems a single query is designed to use a single thread or a reduced amount of CPU processing in some way.

如果您在 Gremlin 服务器中使用 TinkerGraph 进行测试,那么就会知道 TinkerGraph 非常简单。它不会在内部对 运行 并行遍历的任何方面执行任何操作(没有与 OLAP 相关的 TinkerGraphComputer)。

So I have 2 solutions in mind, divide the query in one chunk per user or use OLAP:

这两种方法都有可能奏效。在第一个解决方案中,您提出了一种穷人的 OLAP 形式,您必须设计自己的方法来进行这种并行处理(即管理线程池、同步状态等)。我认为这种方法是人们处理此类问题的常见第一步。我想知道您是否需要像每个请求的一个用户一样细粒度。我认为一次发送多个是可以接受的,但只有在您的实际环境中进行测试才能得出答案。这个解决方案的好处是它通常适用于任何图形系统,包括 Neptune。

将您的第二个解决方案与 OLAP 结合使用比较棘手。您有一个明显的问题,即 Neptune 不直接支持它,但是去另一个提供支持的提供商不会立即解决您的问题。虽然 OLAP 使您不必担心如何以最佳方式并行化您的工作负载,但这并不意味着您可以立即采用您想要 运行 的 Gremlin 查询,将其放入 Spark 中并立竿见影。例如,我从 TinkerPop 参考文档中获取:

In OLAP, where the atomic unit of computing is the vertex and its local 
"star graph," it is important that the anonymous traversal does not leave the 
confines of the vertex’s star graph. In other words, it can not traverse to an 
adjacent vertex’s properties or edges.

在您的查询中,已经有您“离开星图”的地方,所以您会立即在那里找到问题来解决。通常,出于 OLAP 目的可以解决该限制,但在这种情况下,它并不像将 withComputer() 添加到您的遍历并获得胜利那么简单。

沿着这条将 OLAP 与 Neptune 以外的图形一起使用的路径进一步深入,您可能至少要考虑是否可以将这种复杂的遍历写成 custom VertexProgram which might better bind your use case to the the capabilities of BSP 比更通用的 TraversalVertexProgram 在处理任意 Gremlin 时执行。就此而言,混合使用 Gremlin OLAP、自定义 VertexProgram 和一些标准 map/reduce 样式处理可能最终会导致最优雅和最有效的答案。

对于不支持 OLAP 的图形,我一直在考虑的一个想法是 subgraph()(使用 Java)与您的算法相关的图形部分,然后执行它在 TinkerGraph 本地!我认为这在某些用例中可能是有意义的,在这些用例中,算法具有一些可以提前定义的限制以形成子图,这些限制可以很容易地被过滤掉,并且生成的子图不是太大以至于需要大量的数据建设的时间。如果子图有一些超越单一算法的用途,那就更好了——几乎表现得像缓存图。我不知道这对你是否有用,但这是一个想法。这是我最近写的一篇博客 post,其中讨论了 writing VertexPrograms。或许你会觉得有趣。

关于 OLAP 的所有说明,我认为您的第一个解决方案似乎可以作为开始。您还没有 multi-billion 边图,现在可能可以负担得起采用这种方法。

What does it mean "multiple queries in a single request"?

我相信这只是意味着您可以发送如下脚本:

g.addV().iterate()
g.addV().iterate()
g.V()

其中multiple Gremlin commands可以在单个事务的范围内执行,其中每个命令必须“由换行符('\n'),空格(''),分号(';')分隔,或什么都不做(例如:g.addV('person').next()g.V() 有效)”。我认为最后一个命令只有returns一个值。该特定功能似乎对您的情况没有帮助。在可能的情况下,我会更多地关注特定请求中的批处理用户。

如果您正在寻找原生的 OLAP 图形引擎,或许可以看看 AnzoGraphDB,它比我们所知的任何其他东西都更适合那种更复杂的查询风格,其扩展性和性能要好得多。它是一个 MPP 引擎,因此每个核心都并行处理查询。根据您需要它处理的数据量,免费版本(仅限单节点,RAM 受限)可能就是您所需要的,并且可以用于商业用途。您可以在 AWS Marketplace 或 Docker Hub 上找到它。

免责声明:我在 Cambridge Semantics Inc. 工作