如何使用 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 个顶点标签
- URL
- URL_Group | partition key ((url, group)) …即 composite primary key 具有 2 个分区键组件
2 条边
- URL -> URL_Group
- 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
等关系
这种遍历的可视化模型如下图所示
我有一个简单的顶点“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 个顶点标签
- URL
- URL_Group | partition key ((url, group)) …即 composite primary key 具有 2 个分区键组件
2 条边
- URL -> URL_Group
- 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
等关系这种遍历的可视化模型如下图所示