开发与测试

本指南将引导您了解代码的组织结构,识别关键功能和重要代码,并构建和测试分析引擎。

安装

为简化操作,我们建议您使用已预装必要依赖项的Docker镜像。

docker run --name dev -it --shm-size=4096m registry.cn-hongkong.aliyuncs.com/graphscope/graphscope-dev:latest

或者,您也可以手动在本地机器上安装所有依赖项。 请参考Dev Environment获取更多设置开发环境的选项。

环境准备完成后,克隆代码仓库并进入仓库的analytical_engine目录。

git clone https://github.com/alibaba/GraphScope.git
cd analytical_engine

理解代码库

由于分析引擎继承自GRAPE,它需要libgrape-lite作为依赖项。 请注意,libgrape-lite的核心功能,如图结构、图分区器、工作节点、工作节点之间的通信以及应用程序,在GraphScope的分析引擎中被大量复用。

如果你想全面了解分析引擎,强烈建议你从libgrape-lite开始。

位于analytical_engine目录中的代码功能类似于libgrape-lite的扩展,通过以下增强使其功能更加完备:

  • 支持K8s以实现由GraphScope协调器进行管理;

  • 内置多种算法,而libgrape-lite仅包含LDBC Graphalytics基准测试中的6种分析算法;

  • 属性图及其扁平化/投影图支持;

  • 支持Java,从而使得能够在GraphScope上运行为Giraph/GraphX编写的应用程序。

代码组织结构如下:

  • apps 包含各种内置算法/应用程序。

  • core: core目录包含对libgrape-lite库的扩展,其组织结构与libgrape-lite目录相同。扩展文件都存放在libgrape-lite对应基础文件的相同目录下。具体来说,

    • core/app 包含与应用程序相关的类,这些类在实现新应用程序时作为基类继承。

    • core/communication 包含通信层的扩展。

    • core/cuda 包含一套用于GPU加速计算的图结构实现和GPU上的通信功能。

    • core/fragment 包含扩展的片段及其加载器。例如,可变图片段。

    • core/io 更多 io_adaptor适配器。

    • core/parallel 包含用于计算和通信的并行子层,例如用于线程并行执行的辅助类,以及如何在工作者之间管理和同步消息缓冲区。

    • core/serialization 扩展了libgrape-lite中的序列化功能,使其支持属性图。

    • core/utils 包含实用函数和类。

    • core/vertex_map 包含一些用于管理原始顶点ID与顶点内部标识符之间映射关系的vertex_maps。

    • core/worker 包含工作节点,该节点负责在本地执行应用程序并与其他工作节点通信。

  • frame are used to wrap the libgrape-lite library for integration into GraphScope. This is necessary because libgrape-lite heavily relies on Templates to define applications and graphs, which is inadequate for loading property graphs and applications in GraphScope scenarios. Property graphs usually have multiple label and property types, which cannot be determined before loading. For this reason, GraphScope has implemented JIT technology to compile property graphs and their associated applications at runtime. These frames serve as wrappers to facilitate these tasks.

  • java 包含Java实现。GraphScope支持使用Pregel/Giraph和GraphX API开发应用程序。此外,现有的Giraph/GraphX应用程序(jars)可以直接在GraphScope上运行而无需任何修改。了解更多关于Java支持的信息 here

  • benchmarks 包含与性能测试和基准测试相关的代码。

  • cmake 包含用于配置构建的CMake脚本。

  • test 包含测试用例和脚本。

Key components of libgrape-lite

libgrape-lite 的核心组件

上图展示了libgrape-lite(以及GraphScope中的分析引擎)的核心组件及其工作原理。具体来说,

  • Fragment 是图数据的一个分区,也是计算节点上图数据的处理对象。

  • MessageMessager 管理通信策略,负责显式或隐式地管理分片之间的消息通信和状态同步。

  • Application 是用户应用程序的主要逻辑。在应用中,用户可以通过 MessageManager 访问本地 Fragment 或发送/接收消息。

  • Worker,一个负责加载图数据(Fragment)、调用应用程序在本地Fragment上执行计算,并通过MessageManager与其他计算节点上的Worker进行通信的类。

进行修改

  • 我们鼓励您fork该代码库并在自己的fork上进行修改。

  • 从小改动开始会容易得多,比如修改特定算法、添加新算法,然后逐步进行更复杂的更改。建议避免在单次提交中进行大规模变更。

  • 如果你想为代码库做贡献,请参考Contributing to GraphScope获取更多详情。

构建分析引擎

通过gs命令行工具,您只需一条命令即可构建GraphScope的分析引擎。

# Clone a repo if needed
# git clone https://github.com/alibaba/GraphScope
# cd GraphScope
make analytical

分析引擎的代码是一个cmake项目,其根目录(/analytical_engine)下有一个CMakeLists.txt文件。使用gs构建后,您可以在analytical_engine/build/grape_engine目录下找到构建产物。

grape_engine一起的还有共享库,或者如果您选择构建测试,可能还会有一堆测试二进制文件。

您可以通过以下方式将其安装到指定位置

make analytical-install INSTALL_PREFIX=/usr/local

注意

分析引擎的CMakeLists.txt文件位于analytical_engine/CMakeLists.txt路径下。

如果您想进一步研究分析引擎或自定义构建,请查看此文件。

测试

分析引擎配备了一套测试套件,从单元测试到图算法正确性测试,以确保代码的正确性。您只需一条命令即可轻松使用新构件进行测试:

这里我们将工作目录设置为本地代码库。

export GRAPHSCOPE_HOME=`pwd`
# Here the `pwd` is the root path of GraphScope repository

了解更多关于GRAPHSCOPE_HOME的信息,请参阅运行测试

# git clone -b master --single-branch --depth=1 https://github.com/7br/gstest.git ${GS_TEST_DIR}
cd analytical_engine/build
../test/app_tests.sh --test_dir ${GS_TEST_DIR}

它会将测试数据集下载到${GS_TEST_DIR}目录(如果不存在则创建),并在不同图上运行多种算法,最后将结果与基准真值进行比对。