跑louvain划分出现 read timed out 和 writing job aborted

nebula graph版本:3.2.1
nebula studio版本:3.4.1
spark版本:2.4
部署方式:分布式
硬盘:机械硬盘
是否为线上版本:Y

===========================

在跑louvain社区划分时,日志中先是出现
WARN yarn.Client:Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME
又出现
WARN scheduler.TaskSetManager: Lost task 97.0 in stage 50702.0 (TID 82998, Hadoop-udap147, executor 16): com.vesoft.nebula.client.graph.exception.IOErrorException: java.net.SocketTimeoutException: Read timed out
又出现:

ERROR scheduler.TaskSetManager: Task 89 in stage 50702.0 failed 4 times; aboreding job

再然后:

ERROR v2.WriteToDataSourceV2Exec: Data source writer com.vesoft.nebula.connector.writer.NebulaDataSourceVertexWriter@5d5358b7 aborted.

接着是:

Writing job aborted

warn和error的日志照片如下:


我不确定是不是由于并发太多导致的,我提交submit的资源配置是如下:

--executor-memory 10G --num-executors 100 --executor-cores 1 --driver-memory 15G

结合之前提过的问题,我目前想到尝试解决的方法如下:

  1. 将nebula-storage.conf中的 修改一下:
--rocksdb_db_options={"max_subcompactions":"48","max_background_jobs":"48"}

其中,两个值都为cpu核数的一半。

  1. 将结果写入方式由update改为insert,因为之前我遇到过类似问题:数据量大时,update方式就容易造成writing job aborted,而改用insert方式就顺利执行完。但前提需要为每个节点新增一个tag,并增加louvain属性,否则直接insert到原tag,会将点的其它属性消除。

那么给所有节点新增tag时,有没有方便的方法呢?目前我只知道两种方式:一是insert vertex,如INSERT VERTEX t2 (name, age) VALUES "13":("n3", 12), "14":("n4", 8); ,但这样我需要将所有VID都写在values后面,不太现实。第二种就是用importer工具,在importer.config文件中配置好节点csv数据源,并指定tag,这样又需要重新导入下数据。还有其他方式新增tag吗?

问题有点笨拙,感谢各位老师解答 :smile:

cc @nicole 老师,我昨天跑 louvain 也发现会停不下来(篮球数据集),还没去研究咋回事儿。

是的,我也发现最新的算法包跑的时间比较久,而且总是卡在某个地方(如:190/200),我查yarn任务看到它确实还在跑,当我加大资源时,没有卡住,但是出现了上面的问题。
之前的算法包比现在的快,只是为了用VID 字符串到数字的编码,目前选择用新的算法包。

我刚才又跑了两遍,发现如果在submit任务时设置num-executors 100,就不会卡住不动,日志刷新很快,而设置num-executors 60则会在运行时卡很久很久。

这次,我将资源设置为如下:

--executor-memory 5G --num-executors 100 --executor-cores 1 --driver-memory 30G

数据集中,边有228152,节点有120648。
算法划分结果采用update方式写入person节点louvain属性中。

11分钟跑完,但是出现了之前的问题,一个也没写进去:

我确定这些节点是在图空间中都存在的,也有louvain属性(int32),图空间的tag只有person一种。

这是之前发生一样问题的帖子:

也是由于update出现这个问题,我才转而采用insert方式将社区划分结果写入tag中,这样就得给每个节点新增一个tag。 :pensive:

再更新一下:

我设置的louvain属性是int32,要插入的编号一般都是86 + 11位手机号,我在想是不是int32存不下13位数字,于是将louvain属性改位string。再次运行。

结果写入方式仍然采用update,资源依旧是:

--executor-memory 5G --num-executors 100 --executor-cores 1 --driver-memory 30G

结果不再出现上面的ERROR writer.NebulaDataSourceVertexWriter: failed execs:List(UPDATE VERTEX ON prson"“8618673XXX15”SET louvain'8613XXX72X816

而是下面的报错:

查看nebula-storage.error日志:


上面写Storage Error: More than one request trying to add/update/delete one edge/vertex at the same time

貌似和帖子最开始报错一样,这是并发太多导致的嘛?

再次更新下 :joy:
我又多跑了几次,发现有时候会运行着就卡住不动,一卡3个小时,yarn上显示还在运行,3.0.0和3.1.0jar包都会出现这个问题,所以不排除是我数据或服务器原因。

将结果写入方式由update改为insert,一开始也是运行着不动了,我又结束任务重新运行,然后10分钟跑完,但是同样出现上面的read timed out,然后一直duplicate(1),duplicate(2)… 随后writing job aborted。但最后查图库写进去8W数据,即8W节点的louvain字段是有值的。

最后总结下我的问题:

  1. 跑louvain算法时,算法结果update或Insert节点中,都会随机出现卡住(日志停住,任务还在运行),可能是数据中有超级节点?或者yarn资源有问题?不清楚。。。但也会出现10min跑完,然后报下面错。

  2. 如果不卡住,顺利跑完,则会出现read timed outwriting job aborted报错,详细日志见上述图片(可能有点乱,抱歉)。update方式时,报错后louvain字段都没写进去;insert方式时,报错后部分写进去。我猜。。还是并发多导致的。。
    nebula-storage.ERROR日志出现过:Storage Error: More than one request trying to add/update/delete one edge/vertex at the same timevertex conflict 11:16:14:86136XXXXXXXX

各位老师,麻烦帮忙看下这个问题怎么解决 :beer:

这个问题好难搞,刚才跑了一下10分钟跑完,再跑就一直这样,偶尔才会跑通。这是所谓的数据倾斜吗?一个执行器分配了大的数据量而导致卡死吗?下面是卡到(4/100)不动了。 :sob:

我需要更改配置文件中的分区数吗?目前我的图空间分区是400,算法包配置文件中partitionNumber是100

要改的

配置文件中的partitionNumber由100改为800后,还是卡住,应该怎么改呢?

  1. 第一次采用update模式没将数据update进去是这个原因, 13位数字超过了int32的范围,你查看下executor里面的日志,会有写入失败的原因的, 查找日志关键词为 ”failed to write xxx for xxx“。
  1. 这个错误文档中有描述,https://docs.nebula-graph.com.cn/3.4.0/20.appendix/0.FAQ/#storage_error_more_than_one_request_trying_to_addupdatedelete_one_edgevertex_at_he_same_time 不是并发导多致的,你可以调整下面提到的shuffle partition
  1. 你如果数据集中vid是string类型的,需要在算法中做编解码,中间涉及到数据集的shuffle操作,你可以在提交命令中增加 --spark.sql.shuffle.partitions=400 的参数,提高编码之后的图计算任务的并发度。
  2. read time out 这个问题看到你发的graphd日志中有对应的 session not exists的info,你的数据库服务有更改session过期时间吗,是不是这个配置(session_idle_timeout_secs)很小导致 图计算任务中因存在数据倾斜导致第二波数据写入和第一波数据写入时间间隔超过了session过期时间?

汤圆姐,我在submit的时候增加了--conf spark.sql.shuffle.partitions=400,(总结就是图空间分区为400,算法包application文件中partitionNum也是400,spark-submit中也是400)。此外,louvain算法encodeId设置为True(图中VID是13位数字,但是是string类型)。
报警告no parts succeed,error message,然后报错storage hosts is empty


show hosts storage是有ip的:

记得上次我的storage服务起来要好久,有时起不来,清蒸让我add hosts ,我还没添加,因为我看上图中可以查出来。是这个问题吗?
备注:我目前图库是3.2.1,算法包3.0.0和3.1.0来回试,考虑要不要升级下图库。

补充一下在studioshow hosts的结果:



这是先后两次点击运行的结果。我有疑问是:为什么status有online也有offline呢?前后两次查询是变动的。还有就是为什么每个distribution中图空间个数不一样呢?这和我上面的我问题是不是有联系呢?实验室环境的show hosts中的status一直是online状态,且每个distribution中的图空间是一样的。 :thinking:

我看了176上的nebula-storaged.graph-node176.root.log.INFO.20230317-200123.3273日志:

下面是176上的nebula-storaged.INFO的日志:

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。