200 亿数据 90 万/s 写入 NebulaGraph 优化总结

3台机器配置:8C 16G 500GSSD
nebula版本:3.6.0

通过如下优化写入速度:90w/s

  1. 将所有的 UPSERT 操作转成 INSERT 操作,因为 UPSERT 会变成三个操作:查询、重组、写入
  2. 将多个 INSERT 组成一条语句(我这里用 2,000 条顶点插入合成一条,不断地试出来,不同的机器不一样)
  3. 调整 VID 为 hash 数值,并且插入前排序(感谢群里的 @Nebula初学者 提供思路),因为 Memtable 是有序链表,提前排序有助于加速写入 Memtable
  4. 调整 space 的 partition 数据,按照官网的来 硬盘的数据量 x 20,我感觉如果 partition 太少可能会照成数据不均匀,那么就没法充分利用多机器的服务能力
  5. 关闭 wal 日志写入(这个有可能丢数据,我当前的场景是可以允许丢失部分数据)
  6. 关闭 compact 数据压缩,等导入完毕之后手工做一次 compact
  7. 如果能多磁盘尽量配置多块,在 nebula-storage.conf 中的 --data_path 可以指定多目录

相关参数:

  • nebula-graphx.conf 文件:调整单批写入顶点或者边的数量
    • --max_plan_depth=2048
    • –max_allowed_statements=2048
  • nebula-storage.conf文件:关闭 wal 和 compact
    • --rocksdb_column_family_options={"disable_auto_compactions":"true","write_buffer_size":"67108864","max_write_buffer_number":"4","max_bytes_for_level_base":"268435456"}
    • --rocksdb_disable_wal=true
6 个赞

你好,问下这样写入的数据,查询效率怎么样呢?

因为数据没导完,还没真实去试。我感觉应该不会太差,首先我们这边的场景是通过某个顶点做图遍历,另外前面的调参仅仅只是为了大批量写入的时候尽量不做其他磁盘操作比如关闭wal和自动compact,这里面就是compact会影响查询,但是会在导入以后会再进行一次手工compact。此外还可以通过配置将尽量多的sst的index和filter加载到cache中,也有加速度效果。

赞,现在是几块硬盘哈?是 local disk 哈?

您好,请教下这个是转换为多少位的hash值呢?32位?会不会增加内存的占用呀?

你好,partition 的数据量为硬盘的数据量x20 这句没看懂,是说硬盘的数量X20 么 ,是说单台机器硬盘的数量x20 还是集群总硬盘数量x20啊。感谢!

这个。总的

我们是改成了64位,因为我们数据量比较大有200亿的顶点,64位的hash冲突会少很多,我个人理解nebula在处理hash冲突的时候是做覆盖处理,也就是相同的顶点

12块local disk

1 个赞

是平均90w/s吗

这里不要直接复制粘贴,应该是英文的--max_allowed_statements=2048 :joy:

1 个赞