我用Awesome-Graphs看论文:解读X-Stream

X-Stream论文:《X-Stream: Edge-centric Graph Processing using Streaming Partitions》

前面通过文章《论文图谱当如是:Awesome-Graphs用200篇图系统论文打个样》向大家介绍了论文图谱项目Awesome-Graphs,并分享了Google的Pregel以及OSDI 2012上的PowerGraph。这次向大家分享发表在SOSP 2013上的另一篇经典图计算框架论文X-Stream,构建了单机上基于外存的Scatter-Gather图处理框架。

对图计算技术感兴趣的同学可以多做了解,也非常欢迎大家关注和参与论文图谱的开源项目:

  • Awesome-Graphs:https://github.com/TuGraph-family/Awesome-Graphs
  • OSGraph:https://github.com/TuGraph-family/OSGraph

提前感谢给项目点Star的小伙伴,接下来我们直接进入正文!

摘要

  • X-Stream是一个单机共享内存的既可以处理内存图也可以处理外存图的图处理系统。
  • 特点:
    • 以边为中心的计算模型。
    • 流式访问无序边,而不是随机访问。

1. 介绍

传统的以点为中心的处理:

  • scatter函数将点状态传播给邻居点。
  • gather函数累计更新,并重新计算点状态。


顺序/随机访问不同存储介质的性能差异:

  • 磁盘:500x
  • SSD:30x
  • 内存:1.8x - 4.6x

X-Stream的以边为中心的处理:

  • scatter/gather在边/更新上迭代,而不是在点上迭代。
  • 使用流式分区缓解点集的随机访问。
  • 将边和源点划分到同一个分区。


X-Stream主要贡献:

  • 边中心处理模型。
  • 流式分区。
  • 不同存储介质上的良好扩展性。
  • 高性能。

2. X-Stream处理模型

API设计:

  • Scatter:根据边和源点,计算目标点更新。
  • Gather:根据目标点收到更新,重新计算目标点状态。

2.1 流

X-Stream使用流的方式执行Scatter+Gather。边和更新是顺序访问的,但是点是随机访问的。

2.2 流式分区

流式分区包含:

  • 点集:分区上的点子集。
  • 边列表:源点的边。
  • 更新列表:目标点的更新。

2.3 分区上的Scatter-Gather

Scatter + Shuffle + Gather:

2.4 分区的大小和数量

  • 一方面为了让点集合尽量加载到快存储,分区数不能太小。
  • 另一方面为了最大化利用慢存储的顺序读写能力,分区数不能太大。
  • 通过固定分区点集合大小的方式进行分区。

2.5 API限制和扩展

  • 虽然不能遍历点上的所有边,但是可以对所有的点进行迭代,并提供自定义的点函数。
  • 不仅限于支持scatter-gather模型,也可以支持semi-streaming、W-Stream模型等。

3. 基于外存的流式引擎

每个流式分区维护三个磁盘文件:点文件、边文件、更新文件。
难点在于实现shuffle节点的顺序访问,通过合并scatter+shuffle阶段,更新写入到内存buffer,buffer满时执行内存shuffle追加到目标分区磁盘文件。

3.1 内存数据结构

stream buffer设计:

基于stream buffer,一个buffer用于存储scatter的更新,另一个存储内存shuffle的结果。

3.2 操作

初始化边分区可以使用内存shuffle方式实现。

3.3 磁盘IO

  • X-Stream的stream buffer采用异步Direct I/O,而不是OS页面缓存(4K)。
  • 预读和块写提高磁盘利用率,但是需要额外的stream buffer。
  • 使用RAID实现读写分离。
  • 使用SSD存储TRIM操作实现truncate。

3.4 分区数量

假设分区的更新满足均匀分布,则有如下内存公式:

  • N:点集合内存总量。
  • S:最大带宽IO请求包大小。
  • K:分区数。
  • M:内存总量。

4. 基于内存的流式引擎

4.1 并行Scatter-Gather

  • 每个线程写自由缓存,再统一flush到贡献的输出数据块。
  • 通过worker stealing避免倾斜。

4.2 并行多阶段shuffle

  • 将分区使用树形结构组织起来,分支因子F(扇出度大小),树的每一层对应一步shuffle。
  • 因此对于K个分区,一共需要logFK步shuffle。
  • 使用两个stream buffer轮换输入输出角色实现shuffle。
  • 论文将F设置为CPU cache的可用行数。

4.3 磁盘流的分层

内存引擎逻辑上在外存引擎上层,外存引擎可以自由选择使用内存引擎处理的分区数量,以最大化利用内存和计算资源。

5. 评估

  • 256M内存cache大小,在16core时达到最大内存带宽25GB/s。
  • 16M IO请求包大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/774333.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于new、delete函数的错误处理(std::nothrow)

new、delete函数源码注释如下:无参数 无参数的new、delete函数,如果调用失败,会抛出bad_alloc异常,需要使用try{}catch(){}语句捕获异常从而进行异常处理。 #include <iostream>int main() {try {while (1){int *p = new int[100000000ul];}} catch (std::bad_alloc&…

了解GraphRAG

了解GraphRAG转载:从零实现大模型-GraphRAG,构建LLM中的关系数据库开源地址:https://github.com/microsoft/graphrag 论文:From Local to Global: A Graph RAG Approach to Query-Focused Summarization 博客介绍:https://microsoft.github.io/graphrag/传统RAGLLM预训练和…

Laconic Private Set-Intersection From Pairings (2022)

Laconic Private Set-Intersection From Pairings (2022)[!IMPORTANT] 论文地址:https://eprint.iacr.org/2022/529.pdf 代码地址:https://github.com/relic-toolkit/relic/tree/main/demo/psi-client-server 代码运行参考:RELIC 库学习Laconic 算法介绍 Laconic 适用于算力…

供热从清洁走向智慧

清洁供热是一种以末端需求为核心的拉动式供热方式,可以通过全面实施智慧供热,实现热电协同、多能互补,以打通供热最后一公里,使供热更加智慧化、高效化、绿色化。“清洁供热是一种以末端需求为核心的拉动式供热方式,可以通过全面实施智慧供热,实现热电协同、多能互补,以…

netty核心流程(一):服务端如何建立连接

为了接收连接请求, Netty 服务端应该做些什么事情? 根据Java NIO 的知识,服务端在准备接收客户端连接之前做了下面几个工作,我们可以带着问题往下看。服务端对连接请求是如何初始化的? 如何把用户定义的处理逻辑 childHandler 加入到 Netty 的处理流程里? 如何在 Socket …

Logisim-008-16位无符号比较器

仓库地址 https://gitee.com/gitliang/logisim-to-cpu

springboot项目使用自定义starter

首先是自定义的starter部分 pom文件<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http:…

SQL执行顺序和逻辑

SQL执行顺序和逻辑 MySQL的执行顺序:(9) SELECT (6) SUM(聚合函数) (10) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> …

后缀数组 - half

后缀数组 后缀数组可以解决有关后缀的问题废话。那么暴力做法肯定是把每个后缀全部取出来,然后按照字典序排序,但是这样复杂度是 \(\Theta(n^2\log n)\) 的。 后缀数组可以解决以下问题:最长重复子串 多个串的最长公共子串 不同子串个数算法详解 面对这些问题,我们需要 \(3…

Misc专项

一:文件操作与隐写 1、文件类型的识别 1、文件头完好情况: (1)file命令 使用file命令识别:识别出file.doc为jpg类型(2)winhex 通过winhex工具查看文件头类型,根据文件头部内容去判断文件的类型eg:JPG类型(3)notepad++ 下载HEXeditor插件,查看文件的头部信息,和010e…

zookeeper未授权访问(CVE-2014-085)

漏洞描述 默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据 漏洞影响 Apache ZooKeepe…