如何使用 DSE Graph 处理超级节点

How to handle supernodes with DSE Graph

我有一个简单的顶点“url”:

schema.vertexLabel('url').partitionKey('url_fingerprint', 'prop1').properties("url_complete").ifNotExists().create()

还有一个名为“links”的 edgeLabel,它将一个 url 连接到另一个。

schema.edgeLabel('links').properties("prop1", 'prop2').connection('url', 'url').ifNotExists().create()

一个 url 可能有数百万个传入链接(例如 ebay.com 的首页来自其所有子页面)。

但这似乎会导致非常大的分区/以及由于宽分区导致的 dse 崩溃(来自 Opscenter 宽分区报告): graphdbname.url_e(2284 兆字节)

我怎样才能避免这种情况?如何处理这个“超级节点”?我找到了一个用于标签的“分区”命令(关于此 [1] 的文章),但该命令已弃用并将在 DSE 6.0 中删除/发行说明中的​​唯一提示是以另一种方式对数据建模 - 但我'我不知道在那种情况下我该怎么做。

我对每一个提示都很满意。谢谢!

[1] https://www.experoinc.com/post/dse-graph-partitioning-part-2-taming-your-supernodes

当前的建议是使用 "bucketing" 驱动 C* 世界中的数据模型设计的概念,并通过创建表示链接组的中间顶点将其应用于图形。

2 个顶点标签

  1. URL
  2. URL_Group | partition key ((url, group)) …即 composite primary key 具有 2 个分区键组件

2 条边

  1. URL -> URL_Group
  2. URL_Group(替换现有的自​​参考边)URL_Group <->URL_Group 每组存储不超过 100Kish url_fingerprints。每存在 100kish 边后创建一个新组。

此解决方案需要簿记以确定何时需要新组。 这可以通过一个简单的 C* table 来完成,以便快速、轻松地检索。

CREATE TABLE lookup url_fingerprint, group,  count counter PRIMARY KEY (url_fingerprint, group) 

这应该保留 DESC 顺序,如果不保留 DESC 顺序,可能需要添加 ORDER BY 语句。

在写入图表之前,需要阅读 table 以找到最新的组。

SELECT url_fingerprint, group, count from lookup LIMIT(1) 

如果计数器 > 100kish,创建一个新组(增量组 +1)。在向 Graph 写入新行期间或之后,需要增加计数器。

遍历需要类似于:

g.V().has(some url).out(URL).out(URL_Group).in(URL)

从概念上讲,您将遍历 URL -> URL_Group->URL_Group<-URL

等关系

这种遍历的可视化模型如下图所示