Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

HugeGraph Tasks V2.0

imbajin edited this page Jun 25, 2023 · 45 revisions

For Students & 开源之夏扩展的完整版本, 开源之夏原有任务不受影响, 这边是全新扩展出的更多任务, 随时更新ing

注: 开始任务前, 请务必先使用 + 阅读一下已有的 HugeGraph 相关文档/文章/Slide (参考资料), 把主流程和背景大概清楚后, 再开始阅读源码

必读部分

下列任务基本都位于 Server 主仓库 (github.com/apache/hugegraph), 基本都是核心的数据结构/存储结构/性能优化/新增功能/分布式存储这几块, 不同于开源之夏 OSPP 列表已有的任务(且 OSPP 活动限定一个 task 仅可 1 人参与), 特点如下:

  1. 下面新增的所有任务(不包括进阶要求)都是有大量的已有源码 + 设计文档可参考的, 大幅降低了参与的门槛 + 难度/工作量 (文档会同步到 Wiki)
  2. 给出了每个任务的评估难度/工作量等, 大家可根据个人情况自由选择(1 ~ N个, 无限制), 另建议每个任务 1 个同学参与 (组队至少按子项拆分)
  3. 多数任务有基础/进阶两个部分, 完成任一部分皆可获得奖金, 更灵活
  4. 在 OSPP 中提交了任务/中选的同学, 也可同时参与这部分新增任务 (前提是有余力)
  5. 需要注意同样需要提交基本的 proposal时间规划/背景说明, 有类似的 task 结项要求 (proposal 可简洁清晰化)
  6. 新增任务报名截止日期7 月 1号前, 鼓励大家提前准备/报名, 任务被提前确认预订后会及时更新状态为"已预订"

总体来说, 新增的任务是为了让更多的同学有机会参与开源/HugeGraph, 只是参与方式 + 任务量安排/门槛上更加灵活, 目前支持下面 2 种, 大家可以根据个人倾向自行选择:

任务参与方式:

  1. CCF协会-GLCC 开源活动中参与模式 (限制是平台赞助项目需要在 CCF 专属的代码平台[类似 gitee]进行提交与审阅/同步等, 其它待确定, 自赞助不受影响)
  2. Apache HugeGraph 基金会直接分配模式, 社区独立的任务模式 (无额外第三方平台, 灵活性最高)

注: 因与 OSPP 官方沟通后, 平台已经不允许再新增/修改任何 Task, 所以目前先考虑这两种方式, 有更好的方式或者平台提交任务可随时告知, 另外不确定 mentor/联系方式的任务可先联系 imbajin 并加学生群接收最新消息

0. 分布式存储的 2.0 大融合

在之前开源之夏的分布式存储任务基础上, 诚邀熟悉分布式存储/RocksDB/LSM 的同学参与其他相关任务, 这里会持续更新拆分 (或是有意报名 OSPP 对应项目担心落选的同学也可联系报名)

mentor: simon / zyj

1. Server 图存储优化与元信息独立化

背景:

HugeGraph 之前的元信息是存储在第三方的存储组件中, 没有单独的元信息存储节点(PD), 现在会引入新的 PD 节点(已有), 我们需要做的是让当前的 Server 的元信息能(可选)存储于 PD 之上, 并优化之前冗余/非必要的表结构, 进行 table struct 的整合, 最后是对异步等 Server Task 的存储进行拆分和优化

核心任务:

  1. Graph Schema 信息存储到元数据中心 (PD(Place Driver), 也可简单理解为 meta-server)

    关键描述: schema 等图的元信息的存储移植到元数据中心 PD 存储,后端存储不再使用m store存储 [依赖 PD]

  2. 存储表结构优化缩减到 6 个 (原 10 +)

    关键描述: 移除s store更改表映射关系,减少为: g+v、g+oe、g+ie、g+index、g+task、g+olap

  3. 任务存储结果拆分

    关键描述: 任务结果单独存储到 task_result 表中任务信息查询,只有查询单个任务时,才会 merge task_result表的结果信息

  4. 分布式异步任务调度器

    关键描述: 能支持多节点 server 运行时的任务(分布式)调度 [已有核心代码实现, 依赖 PD]

技能要求:

  1. 熟练在 Java + Linux 下开发, 理解当前 HugeGraph 的基本图(点边)存储结构和设计实现 + 读写流程
  2. 了解分布式系统中 MetaServer/PD 的设计作用和基本通信方式, 熟悉 etcd/zookeeper/RPC 更佳
  3. 需要有较强的源码阅读 + 问题分析/解决能力 (任务已有大量源码实现可参考/复用, 亦有基本的设计文档)

mentor: imbajin

Difficulty: middle (3 星⭐)

Size: middle (3.5 星⭐, 已有 7成源码实现)

Bonus: 8k/10k (核心/全部完成)

2. 边(Edge)的数据结构增强 (父子边)

背景:

HugeGraph 原本的边设计存储结构可参考已有文档, 那么之前的设计存在一些图定义上的不便之处, 例如 likes 作为一类 EdgeLabel, 只能唯一作用与两个 VertexLabel 之间(例如 Teacher–like–>Student), 然后其他的 VertexLabel只能选择单独新建其他名字标示 likes, 比如 (Student –like2 –> Dog), 从而边与边之间缺乏一种继承关系, 每个 EdgeLabel 都是孤立的, 在此背景下, 我们对 EdgeLabel 的存储结构进行优化调整, 使其能支持"父子边 & 通用边" 的 2 个功能 (进阶项: 可以对 VertexLabel 也进行类似的思考与优化)

核心任务:

  1. 边 Schema 支持"父子边"继承关系/功能

    关键描述: 边存储的 rowkey 结构增加子边类型,完成适配, 并思考新增了字段后产生的影响, 优化边的查询

  2. 支持 general 边(类型)

    关键描述: 增加 general 边类型,定义 schema 时不再需要指定边的 source/targetvertexlabel 类型

技能要求:

  1. 熟练在 Java + Linux 下开发, 理解当前 HugeGraph 的基本图(点边)存储结构和设计实现 + 读写流程
  2. 熟悉当前 HugeGraph 图点边存储的细节以及利弊点, 能结合需求思考图设计的考量点
  3. 需要有较强的源码阅读 + 问题分析能力 (任务已有大量源码实现可参考/复用, 亦有基本的设计文档)

mentor: cx/待定

Difficulty: middle (2.5星⭐)

Size: middle (3 星⭐, 已有 8成源码实现)

Bonus: 3k (完成进阶项则奖金至10k)

3/4. 图 OLTP 算法的增强与优化

背景:

了解了 HugeGraph 的读/查询流程之后, 可知道我们主要提供两种查询方式 :1 Gremlin/Cypher 的通用图语言查询 2 单独的 RESTful 图算法(例最短路径/K 步邻居/相似性等), 1和2各有利弊, 那么这个的任务是对 2 的大量已有算法进行优化可功能上的扩展: 例如减少它灵活性上的不足, 在查询返回结果里允许自定义过滤属性/跳过不必要的搜索/提前停止等, 以此优化查询性能, 它的另一个进阶的任务是可使得 OLTP 算法都能并行去执行 (目前大部分是串行/单线程模式)

核心任务:

  • 通用的 OLTP 算法优化

    关键描述:

    • 所有 OLTP 算法 API 支持顶点和边的属性过滤 (减少不必要的图搜索 + 返回数据量大小)
    • 所有 OLTP 算法 API 支持顶点和边完整信息跳过/返回 (当前版本仅返回点边id, 或部分属性)
    • 所有接口返回中增加 statistic 统计信息(例如: 遍历的顶点、边数量和耗时)
  • kout 算法查询增加 DFS 模式 (原本仅有 BFS 模式)

  • (进阶) 算法实现过程中,支持批量 + 并发(多线程)执行

技能要求:

  1. 熟练在 Java + Linux 下开发, 理解当前 HugeGraph 的基本图(点边)存储结构和设计实现 + 读写流程
  2. 熟悉当前 HugeGraph 的 OLTP 算法的基本设计和典型实现原理,
  3. 需要有较强的源码阅读 + 问题分析能力 (任务已有大量源码实现可参考/复用)

mentor: pzy/待定

Difficulty: middle (2.5星⭐)

Size: middle (2星 ⭐, 已有 9成源码实现)

Bonus: 3k/8k (完成基础/进阶任务)

5. 图 ConditionQuery 条件/索引查询优化

背景:

数据库中基本的概念是, 主键之外, 属性的查询要么需要进行全表扫描, 要么需要建立对应的 (二级)索引; 在 HugeGraph 中, 图的 unique 索引可用于数据查询移除 NoIndexException,如未完全命中索引,则可考虑使用某个索引+ConditionQuery.test的方式过滤, 如完全没有索引,则进行全表扫描+ConditionQuery.test方式过滤三种类型A、B、C, A、B建立了基于属性x的索引,当执行 g.V().has(x, ?)时,需要查询到A、B索引结果和C的非索引结果

核心任务:

  1. 对部分命中(未完全命中)的查询进行优化, 避免抛出异常

    关键描述: 一个图查询如果部分命中索引, 应该基于命中索引后的部分再做"扫表"查询, 而不应直接抛出异常 or 直接扫全表

技能要求:

  1. 熟练在 Java + Linux 下开发, 理解当前 HugeGraph 的基本图(点边)存储结构和设计实现 + 读写流程
  2. 熟悉当前 HugeGraph 图索引存储的细节以及利弊点, 能结合需求思考图设计的考量点
  3. 需要有较强的源码阅读 + 问题分析能力 (任务已有大量源码实现可参考/复用)

mentor: wcb

Difficulty: hard (4星⭐)

Size: middle (2星 ⭐, 已有 9成源码实现)

Bonus: 3k

6. 图 Gremlin 的查询并行优化

背景:

HugeGraph 现在主要的查询语言 Gremlin 源自图查询语言框架 Tinkerpop, 它的 OLTP 查询基本都是使用的"单线程 + DFS"的查询方式, 自然在复杂的查询中就会显著遇到瓶颈, 业内有阿里的 GAIA: A System for Interactive Analysis on Distributed Graphs Using a High-Level Language 论文对这个问题进行了深入的探讨和重构, 我们需要部分实现图 Gremlin 查询的并行化

核心任务:

  1. 了解基本 Gremlin 查询性能分析方式 + 支持部分语句(step 算子)下的 Gremlin 并行化

    关键描述:

    • HugeGraphStep 中点/边查找支持批量+并发查询
    • HugeVertexStep 中临接点/边的查询支持批量+并发查询
  2. 在 Tinkerpop 社区/issue 中寻找/探索进一步的规划和可能方案尝试

  3. 包括不限于复用 GAIA-X 中的部分优秀设计/更好的设计方案, 对现有的单 step 并行进行更深的改造 (可选, 进阶项)

技能要求:

  1. 熟练在 Java + Linux 下开发, 理解当前 HugeGraph 的基本图(点边)存储结构和设计实现 + 读写流程
  2. 了解任何一门图查询语言, 熟悉 Tinkerpop Gremlin则更佳 (有教程可学习入门)
  3. 有基本的 Paper 阅读能力 + 良好的调研和沟通能力
  4. 需要有较强的源码阅读 + 问题分析能力 (任务已有大量源码实现可参考/复用, 亦有基本的设计文档)

mentor: suzhaojun

Difficulty: middle (3星⭐)

Size: low (1星 ⭐, 已有 9成源码实现)

Bonus: 3k (进阶项完成上升至 12k 起)

注: 进阶项任务难度上升至 5 星⭐, 工作量上升至 4 星⭐, 建议感兴趣的同学先阅读一下论文/代码看看理解情况.

7. 图的监控和性能观测优化

背景: 图引擎在线化,对于稳定性(SLA)要求高,需要完善的监控以及性能监测能力:

  • 在线问题排查:能够及时检测和解决图数据库或图处理系统中的线上问题,包括进程故障、异常行为等。
  • 统计分析:通过采集和分析关键指标,提供对系统在故障前、故障中和故障后的性能表现的深入理解,以便进行问题诊断和优化。
  • SLA保证:作为确保线上服务质量的重要手段,提供对图处理系统的监控和性能观测,以满足和监控系统的服务级别协议(SLA)要求。

核心任务:

  • 增加 arthas server 内嵌服务接口 (也就是说启动 HG Server 后可以直接使用 Arthas 动态观测/perf/debug, 无需单独安装)
  • 按照图名称、接口名称计算请求总数、成功数、失败数、平均响应时间、最大响应时间 (接口返回格式兼容 Prometheus 即可)
  • 增加白名单监控信息
  • Slow query 慢查询/慢日志的实现, 类似传统 DB 帮助用户能及时发现查询中的慢语句并方便分析溯源 (进阶项, 暂无参考)
  • 为 computer 增加 mertics 端点并返回 JVM mertics/superstep Stat/compute 耗时/input 耗时/output 耗时 等 (进阶项)

mentor: liu / JackyYangPassion

Difficulty: low (1.5 星⭐)

Size: medium (3星 ⭐, 已有 8成源码实现)

Bonus: 3k/6k (完成基础/进阶)

8. 存储引擎 RocksDB 改进与优化

背景:

RocksDB 作为 HugeGraph 未来主要的单机/分布式后端存储底座(存储引擎), 因为设计和定位原因(对应 InnoDB/Myisam), 所以它自身并不会提供类似完整 Database 那样整套的组件, 甚至也没有命令行工具, 只有裸的 API 调用, 但这样对上层图的调用/性能分析/问题定位等带来了很大的影响, 用户也很难 cover 它, 另外的一个问题是由于之前 rocksdb-jni设计上的历史问题, 导致存在大量的胶水配置代码, 使得 HG 修改/新增/调整 RocksDB 的参数, 既不动态化, 也很不灵活, 有许多 hard-code, 综上原因, 我们很需要对原生 RocksDB 进行优化, 可供用户选择 RocksDB Plus的选择, 从而在"性能 + 功能 + 易用性"各方面实现提升

任务描述:

  • 根据已有资料和文档, 梳理 RocksDB 存在的局限性和不足
  • 根据代码/文档/slide, 分析 RocksDB Plus 的数据结构优化和改进点
  • HugeGraph 适配 RocksDB Plus, 类似提供一个进阶选择 (同时保持对 RocksDB 兼容)
  • 编写基本的 perf 代码, 能进行简单性能测试和对比 (可借助 loader/jmeter 等压测工具)
  • 帮助 HugeGraph 的 CI 中加入 perf 部分, 这样每次 CI 运行都能有一个 perf 情况对比分析, 观测读写性能影响, 可参考业内做法 (加分项)

技能要求:

  1. 熟悉 HugeGraph 的编译/运行流程, 熟悉 rocksdb 后端的初始化/启动完整过程
  2. 熟悉 Java/Linux 编程, 了解/可阅读 C++/Makefile/JNI更佳
  3. 了解 BTree/LSM/SkipList/Trie Tree 至少 1~2 种数据结构设计, 了解文件存储/编码压缩更佳
  4. 了解 RocksDB/HBase/TiKV 等存储设计(包括 memtable/wal/compaction/LSM读写流程), 熟悉源码更佳
  5. 需要有较强的问题分析解决能力, 了解性能分析/定位方式/火焰图更佳

mentor: imbajin + lp

Difficulty: middle (3.5星 ⭐)

Size: middle (3星 ⭐, 需调试和适配, 已有 6 成代码参考)

Bonus: 6k (已发布至 GLCC)

注: 此任务也是 OSPP 并发集合优化的同类, 与并发集合中的加分项直接关联 (但并不绑定)

9. 图功能优化 & 支持子图功能

补充 ing

任务描述:

  • 子图(subgraph) 简单可以理解为全图的任一部分, 这里我们需要按照"顶点 + 边label + 属性"过滤生成一张子图, 增加子图 Job
  • auth Server删除system graph删除更新权限接口增加租户管理员
  • 增加schema模板,创建图空间时,可指定schema模板查询schema groovy格式返回属性改名

mentor: zgx

Difficulty: medium (3 星⭐)

Size: medium (3星 ⭐, 已有 8成源码实现)

Bonus: 3 ~ 8k (完成部分/全部)

10. 图的容器化增强和完善 (SaaS前置任务)

任务描述:

核心是参考已有的 docker-issue, 完成 TODO ✅ 项待完成部分, 更好的让用户和开发者能使用 HugeGraph, 以及为后续的云(SaaS)化做铺垫

  • use docker-slim to slim the image
  • keep the tags same with server (like hugegraph/hugegraph:1.0.0)
  • use a script to run server & hubble together OR use docker-compose to manage them
  • use docker-compose to manage computer, it needs to contain etcd and hugegraph-server
  • pre-load some data or graphs in container so that users can traverse the graph with one step (docker run)
  • use DockerHub(autobuild), currently it's not free to use (Submit a OSS request)
  • support Cassandra(Docker) as backend (compose with HugeGraph)

技能要求:

  1. 熟悉 HugeGraph 的编译/运行流程, 熟悉基本的初始化/启动过程
  2. 会使用/阅读 Shell, 需要熟悉 Docker 使用, 能编写 Dockerfile 更佳
  3. 了解 Docker-Compose/K8s 更佳 (加分项)
  4. 需要有较强的问题分析解决能力 (容器相关问题需要定位)

mentor: coderzc/imbajin

Difficulty: low (1.5星⭐)

Size: middle (3星 ⭐, 需要调试和测试 Docker)

Bonus: 2~5k (视 TODO 项完成数)

备注: 如果熟悉 k8s, saas 化的同学, 可以完成后承接下一个 K8s/SaaS 化的任务 (会独立拆分出来, bonus 单独为 12k+)

11. 重构官网

任务描述:

mentor: coderzc

Difficulty: middle (2.5 星⭐)

Size: medium (3星 ⭐, 需要适配和调试)

Bonus: 6k

12. JanusGraph 的新增功能合入 HugeGraph

背景: JanusGraph(前身叫Titan 算是分布式图存储的第一代奠基), 社区以海外用户为主, 但是整体结构上其实殊途同归, 也同为 Java 语言开发, 和 HugeGrpah 的关系类似 "LevelDB" VS "RocksDB", 所以我们希望推动两个社区的更多的复用和合作, 首先就可以从 JG 的功能 --> HG 开始

任务描述:

  • 根据已有资料和文档, 梳理最新版 JanusGraph 代码新增的功能特性 (比较重要的)
  • 梳理出核心特性上的区别, 整理为文档, 参与 HG X JG 社区联合沟通
  • 移植核心的 feature/bug-fix 等到 HG 中来, 能改进则更佳
  • 有良好的英语表达能力, 能在有稿子 + Slide 的前提下, 进行简单的分享与 QA (进阶)

mentor: ? + javeme/imbajin

Difficulty: middle (2.5星 ⭐)

Size: middle (3.5星 ⭐, 需要阅读两边的源码, 调试和适配)

Bonus: 3~12k (视完成度/合并数)

注: 同时熟悉两个社区结构和设计的同学是最佳, 这部分也是基于已有代码进行适配和优化

13. HugeGraph 的序列化优化/性能优化

补充 ing, 先列一下关键点

  1. 支持高频属性值的常量枚举编码
  2. 增加按需延迟反序列化类BackendProps包裹原始字节
  3. 序列化将各bytes替换为bytebuffer减少碎片
  4. 堆外内存优化gremlin dedup/emit等等step
  5. 邻接边的缓存结构更加精细化,比如以顶点Id为key,增加命中率
  6. 优化带目标点id条件的邻接边查询
  7. 优化根据顶点查边时,如果顶点类型无该类型边则直接返回空

mentor: zyxxoo/javeme/coderzc

Difficulty: middle (2~3.5星 ⭐)

Size: middle (1~3.5星 ⭐, 根据 task 不同)

Bonus: 2~12k (视完成度/合并数)

x. 图 Gremlin 的版本升级和新适配

补充 ing

背景:

目前 HugeGraph 使用的是 3.5.1 的 TinkerPop, 最新稳定版本是 3.6.x, 修复了大量 Gremlin查询的 Bug, 优化了不少 perf/api 相关的优化, 所以 HugeGraph 需要能适配升级到新的 Gremlin 版本, 并梳理出主要的变化和提升对比

x. 分布式锁与柔性事务的初步实现

补充 ing

FAQ (其他)

  1. 已有的代码 + 文档参考在哪? 什么时候可以参与/报名/开始任务, 可以提前开始参与提交代码么?

    A: 参考代码也在 GitHub (原 HugeGraph Org 下), 初步重构 + 设置好权限后, 在 6.1 前后就会公开给可参与的同学, 然后不同于 OSPP 的任务有开始时间, 新增任务可以随时开始, 完成即可提前结束, 确认完成后即可结项领取对应的开源礼品 + 奖金等

  2. 新增的任务是否也需要等截止期才能确定是否选中? 可否提前联系 mentor, 待定的 task 联系谁?

    A: 不是, 不同于 OSPP, 新增的任务可以被提前预订选择, 提交了 proposal 之后, 导师和同学都很认可, 则确定无误即可提前占坑(6.10之后), 已确定任务的 task 会更新为 "已预订", 方便同学及时了解状态

  3. 有些 mentor 还是待定或者没有具体的联系方式, 如何沟通?

    A: 这部分因为部分 mentor 人选可能还有调整, 所有不确定 mentor 或联系方式的任务可先联系 imbajin, 或公众号加学生群, 之后会及时更新同步信息

  4. 已经毕业了, 这部分新增任务可以参与么?

    A: OSPP/CCF 限定在校学生, 而属于 HugeGraph 基金会渠道的方式都可参与, 不受平台限制

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /