图分区技术

这个概念跟关系型数据库的表分区是类似的,也就是在图结构数据量非常大的时候,怎么通过分布式的形式对图进行切分。

在关系型数据库的表分区的应用中,我们对表进行分区可能需要考虑的目的主要是:一个表存为多个分区之后的join和查询的问题。同理:我们在设计图分区策略的时候同样需要考虑的是,图进行分区之后,在做图迭代算法(并行计算)时,最小化在数据量的传输,最小化IO操作,只有减少这部分的开销,才能提高图分区的性能。

另外,业界比较成熟的OLTP产品Neo4j是不支持图分区的,所有的数据都存储于一个实例上,因为他是index-free的实现方式,为了保证图查询的实时性能,因此没有引入分区的方式,所有的图分析和查询都在一个存储上完成,避免网络传输和IO的开销。

一般而言,业界主要有这么几种分区的技术:

edge-cut:边分割

边分割的方式一般适合在图数据中low-degree的数据分布中,也就是中图的连接入度或者出度(有向图)比较少的情况,这样vertex的分割就会比较均匀,减少跨多个集群的数据交换;

vertex-cut:点分割

点分割的方式跟边分割的情况相反,在high-degree的图数据分布的情况下,也就是节点的度特别大,通过点分割,就能够同样减少跨多个集群的数据交换,同时减少节点的副本;如PowerGraph的实现方式;

PowerGraph在一篇论文里PowerGraph: Distributed Graph-Parallel Computation on Natural Graphs以数学的形式证明了在符合幂律分布的自然图中使用点分割的好处。

hybrid-cut:动态混合分割

混合分割的技巧通常需要依赖于图计算架构采集的动态的统计信息,首先需要对图的数据分布情况做估计,然后再决定图分割的策略,使用点分割还是边分割的方式,这种分割方式比较复杂,如Flink Gelly图计算架构就采用这种混合的分割方式;

hash/random partitioning:哈希,随机分区

这种分区方式比较简单粗暴,一般是使用边的hash或者节点的hash来分区,这种方式分区比较简单,但是性能不能保证;

比如OrientDB采用的就是基于hash的分区方式;

 

总的来说,使用分区技术的图分析架构,一般都是定位为OLAP的解决方案,目前还没有OLTP性能不错,也支持分区的图数据库引擎,商业产品TigerGraph和微软的GraphEngine是少数宣称既支持OLAP也支持OLTP的产品,后续的文章可以重点分析分析。

 

你可能感兴趣的:(图数据库,图数据库,数据分区,图分割,边分割,点分割)