【问题标题】:How to handle supernodes with DSE Graph如何使用 DSE Graph 处理超级节点
【发布时间】:2018-06-14 00:28:52
【问题描述】:

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

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

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

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

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

但这似乎会导致非常大的分区 / 并且由于分区宽而导致 dse 崩溃(来自 Opscenter 宽分区报告): graphdbname.url_e (2284 mb)

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

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

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

【问题讨论】:

    标签: datastax graph-databases datastax-enterprise datastax-enterprise-graph


    【解决方案1】:

    目前的建议是使用“桶”的概念来驱动 C* 世界中的数据模型设计,并通过创建一个代表链接组的中间顶点将其应用于图形。

    2 个顶点标签

    1. 网址
    2. URL_组 |分区键((url,组))...即composite primary key,带有2个分区键组件

    2 条边

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

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

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

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

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

    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

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

    【讨论】:

    • 感谢您的回答!听起来是个不错的解决方法/我会试一试。
    猜你喜欢
    • 2014-11-04
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2011-09-25
    • 2014-06-04
    • 2016-09-15
    相关资源
    最近更新 更多