GraphScope analytics in Java:打破大规模图计算的跨语言障碍

JAVA图算法(4种)-你都清楚吗? 在深度优先搜索中,从起始节点开始,沿着一个路径一直访问未访问过的节点,直到到达不能再继续前进的节点为止,然后回溯到前一个节点,继续探索其他未访问的分支。在广度优先搜索中,从起始节点开始,首先访问它的所有直接邻居节点,然后再依次访问这些邻居节点的邻居节点,依次进行层级遍历,直到遍历完所有节点。最小生成树(Minimum Spanning Tree,MST)是图论中一个重要的概念,它是一个连通图的子图,包含原图中的所有顶点,但是只包含足以构成一棵树的边,且这些边的权重之和最小。该算法适用于没有负权边的图。 阅读详情

本文中我们将分享大规模图计算上的跨语言探索,GraphScope 的高效图分析 Java 开发包 GRAPE-JDK。

1. 图分析上跨语言的需求与挑战

图分析是图计算任务中的重要场景,例如大家熟悉的单源最短路径就是一种常见的图分析算法。GraphScope 的图分析引擎源自于GRAPE[1],其内置了常见的图分析算法如 SSSP,PageRank 等,用户可以直接进行调用。但在实际生产场景中,业务逻辑在通用算法上一般还有一些定制实现,而业务侧开发者往往在大数据生态中对 Java 更有经验。要求 Java 用户跨越 Java 与 C++ 之间的语言障碍来完成图计算业务逻辑的开发无疑增加了开发成本,提高了开发难度。如何平衡 Java 的灵活性和图计算 C++ 引擎的高效性?因此,允许用户使用 Java 进行自定义图算法的实现,并且高效地运行在 GraphScope 图分析引擎上,是一个十分现实的需求。

为了满足用户对于跨语言图分析的需求,我们需要在 C++ 实现的图分析引擎 GRAPE 基础上开发 Java SDK。在这样的场景下,使用 JVM 的标准的跨语言编程框架 Java Native Interface(JNI)[2] 是常见的方案。JNI 存在的原因是因为在 Java 中,我们无法像在 C++ 中那样以非常底层的方法访问系统的硬件资源,而为了能够使用这些硬件资源,我们就需要 Java 和 C++ 之间的桥接代码来使用 native library 中可执行代码。JNI 就是 JVM 上的 FFI (Foreign Function Interface) 标准框架。

JNI:让 Java 调用 native library

因此我们可以找到一种简单直观的解决方案:使用 Raw JNI 手写 Java 和 C++ 的桥接代码,将图计算引擎的 C++ 接口封装为 Java 接口,暴露给用户使用。 但是事实上这个 naive (baseline) 方案存在着各种问题,并不能够满足大规模图计算的实际需求,主要面临的挑战在以下三个方面:

挑战1: JNI编程的困难

直接基于 JNI 进行跨语言编程存在开发困难,调试困难和维护困难的问题。

  • 开发困难:为了使得 Java 能够和 C++ 进行交互/通信,程序猿需要编写大量的机械单调,枯燥无味的 JNI 代码,如下图所示。JNI 代码中经常涉及到指针转换,更加增加了出错的风险。

JNIEXPORT void JNICALL Java_com_alibaba_graphscope_stdcxx_StdVector_1cxx_10x8cbe72bf_nativeClear(JNIEnv*, jclass, jlong ptr) {
    reinterpret_cast<std::vector<gs::VertexArrayDefault<double>>*>(ptr)->clear();
}
  • 调试困难:编写出来的JNI代码需要通过c++/c编译器编译成动态库,以供JVM载入并调用其中定义的函数。JNI代码的编译调试也是较为痛苦的过程。

  • 维护困难:维护JNI代码的成本也是较高昂的。由于JNI代码高度依赖于C++ native code,因此当图计算引擎的C++接口和实现发生变动时,程序猿必须手动更改JNI实现以进行适配。

挑战2: 跨语言访问的巨大开销

JNI 虽然提供了充足的 API 以供 Java 和 C++ 之间进行通信,但是由于其本身跨语言的特性,JNI 带来的开销也是巨大的。根据我们的调研,JNI 在实际大规模图计算场景中可能引入的开销主要来自于以下几个方面调用的开销。

  • JNI 调用本身的开销[3]。在 JNI 函数中调用本身就有着较大开销,包括在 JNI 代码实现中访问 Java Object,都是导致非常耗时的操作。

  • Java native 方法无法被 JVM inline。在 Java 中,对于代码的优化基本都来自于 JVM,对于高频调用的 Java 方法,JVM 可以通过 inline 来避免函数调用的开销。但是对于 JNI 实现的 native 方法,JVM 无法对其进行优化。而在图计算这样 data-intensive 的场景中,从 Java 通过 JNI 访问存储在 C++ 内存中的数据是非常频繁热点的操作,因此无法被 inline 的 native 方法会是程序执行过程中很大的一部分开销。

  • Java native 方法无法被 JIT 进行优化。native 方法已经被 C++/C 编译器进行编译为二进制,JVM 当然无法对其进行 JIT 优化。

挑战3: 对用户自定义类型的支持

在一些复杂的实际生产场景中,用户往往对自定义点,边上的数据类型,甚至消息类型有着较强的需求。仅仅依靠 JNI 是做不到这一点的,因为每当用户定义新的数据类型,我们都需要在 C++ 中进行实现,然后再编写 JNI 方法映射到 Java 中。

2. 设计与实现

为了攻克这些难点,GraphScope 团队与阿里云程序语言与编译器 - JVM 团队紧密合作,设计并实现了一套性能高效、用户友好的跨语言图计算解决方案。同时在 GRAPE-JDK 开发过程中也催生了一套现代的、先进的 FFI (Foreign Function Interface) 框架:FastFFI(在 github:alib

GraphScope从安装到编译: 10分钟教你在本地使用和开发GraphScope GraphScope 已经支持在主流的操作系统上部署并使用。本文将详细介绍本地安装 GraphScope 的两种方式: 1)直接通过 pip 安装已发布的二进制包;2)从源码编译构建最新版本的 GraphScope。 通过 pip 安装 GraphScope GraphScope 每个版本的 Python 发布包[1] 包含了客户端与服务端运行时所需的必要组件以及依赖。在安装 GraphScope 前,确保当前环境满足以下前置条件: Linux 系统:ubuntu 18.04 或更高版本 、centos7 阅读详情

相关推荐

Fel是轻量级的高效的表达式计算引擎

Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。 Fel是开放的,引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。 Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成java代码和编译模块都是可以扩展和替换的) Fel基于Java1.5开发,适用于Java1.5及以上版本。

GraphScope:GraphScope

阿里巴巴的一站式大型图形计算系统 GraphScope是一个统一的分布式图形计算平台,它提供了一个一站式环境,可通过用户友好的Python界面在计算机集群上执行各种图形操作。 GraphScope通过结合几个重要的阿里巴巴技术,使计算集群上的大规模图形数据的多阶段处理变得简单:包括 , 和用于分析,交互式和图神经网络(GNN)计算的 (GL) ,以及提供有效内存数据传输的商店。 请访问我们的网站以了解更多信息。 入门 我们为提供了托管的JupyterLab。 立即在浏览器中 ! GraphScope可以在容器内由管理的群集上运行。 为了快速入门,我们可以设置一个本地Kubernetes集群,并利用预构建的Docker映像,如下所示。 先决条件 若要在本地计算机上运行GraphScope,需要以下依赖项或工具。 码头工人 Python> = 3.6(含pip) 本地Kubernet

避坑指南:ROS2 Humble摄像头标定常见错误排查(从‘CALIBRATE’按钮不变绿到保存文件找不到)

本文详细解析了ROS2 Humble环境下摄像头标定的常见问题及解决方案,从CALIBRATE按钮不变绿到标定文件保存失败等疑难杂症。提供硬件准备、参数设置、实时诊断到结果验证的全流程指导,特别针对Ubuntu2204系统和usb_cam驱动的兼容性问题给出实用建议,帮助开发者高效完成内参标定。

weixin_29193359的博客 398

【HSCNN解析】HSCNN:从欠采样光谱图重建高光谱图的CNN网络

本文介绍HSCNN,是一个将欠采样光谱图重建为高光谱图的纯CNN网络,2017年提出。

上个大学哪有不疯的?硬撑罢了! 1623

关于Vscode配置Unity环境时的一些报错问题(持续更新)

3.找到设置文件,添加如下代码,用于告诉VSCode)在处理 C# 项目时优先使用 C# 扩展来加载和管理项目,而不是使用 C# Dev Kit 或其他扩展。1.很可能是unity的插件版本问题,打开window > package manager将。2.很可能是项目文件的问题,建议unity打开edit > perfercenes。3.手动重装其他版本的.Net框架(去官网找,多下几个无所谓的)解决:(由于造成问题不一样,所以建议都尝试一次)下载net请求超时(一般都会超时很正常的)

bug制造机 1888

Android13配置selinux让system应用可读sys,proc,SN号

Android13预置的system应用,需要读/sys, /proc目录,读(SN)serial number号, 需要修改selinux配置,否则会报avc错.其修改方法会比Android11复杂一些.。

zmlovelx(帅得不敢出门 程序员群31843264) 2654

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3966

全网最详细教程,手把书教你使用YOLOv10训练自己的数据集和推理(附YOLOv10网络结构图)

YOLOv10,由清华大学多媒体智能组只开发,是一款亳秒级实时端到端目标检测的开源模型。该模型在保持性能不变的情况下,与YOLOv9相比,延迟减少了46%,参数减少了25%,非常适合需要快速检测物体的应用,如实时视频分析、自动驾驶和智能医疗等领域。这些改进使得YOLOv10在实时物体检测领域达到了新的技术水平。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

ROS入门教程(七)—— Gazebo与RViz联合仿真

通过Gazebo与RViz联合仿真实现机器人运动。

吾门的博客 1万+

Oracle EBS R12 主 / 辅助分类帐(主 / 辅助帐套)落地

本文提供了Oracle EBS R12主/辅助分类帐实施的全套文档模板,包含主帐套(法定帐套)和辅助帐套的完整配置清单、科目映射规则模板、4类典型调整分录示例(存货跌价、折旧差异、往来重分类、外币折算)以及税会/IFRS案例分录。重点阐述了主/辅助帐套的配置要点、SLA子分类帐关键配置、科目映射规则(一对一、多对一、重分类等类型)以及调整分录的自动生成逻辑。文档可直接用于项目实施,包含总体架构图、科目映射矩阵表、会计规则集配置等交付物,并附有Excel版模板便于直接使用。适用于需要实现多准则并行记账、税务调

金牌架构师 386

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 图计算 101:图及图计算漫谈
下一篇: 图计算101:图计算的类型、语言与系统
graphscope
博客等级 码龄5年 33粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值