您的位置 首页 > 德语词汇

nebula是什么意思,一文读懂分布式图数据库Nebula的架构和应用

大家好,今天给各位分享nebula是什么意思的一些知识,其中也会对一文读懂分布式图数据库Nebula的架构和应用进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

本文介绍的图和日常生活中常见的图片有所不同。通常,在英文中,为了区分这两种不同的图,前者会称为Image,后者称为Graph。在中文中,前者会强调为“图片”,后者会强调为“拓扑图”、“网络图”等。

nebula是什么意思,一文读懂分布式图数据库Nebula的架构和应用

一张图(Graph)由一些小圆点(称为顶点或节点,即Vertex)和连接这些圆点的直线或曲线(称为边,即Edge)组成。“图(Graph)“这一名词最早由西尔维斯特在1878年提出。

图数据库是专门存储庞大的图形网络并从中检索信息的数据库。它可以将图中的数据高效存储为点(Vertex)和边(Edge),还可以将属性(Property)附加到点和边上。

例如企查查或者BOSS直聘这类的公司,用图来建模商业股权关系网络。这个网络中,点通常是一个自然人或者是一家企业,边通常是某自然人与某企业之间的股权关系。点上的属性可以是自然人姓名、年龄、身份证号等。边上的属性可以是投资金额、投资时间、董监高等职位关系。

图关系还可以是类似《权力的游戏》这样电视剧中的人物关系网:点为人物,边为人物之间的互动关系;点的属性为人物姓名、年龄、阵营等,边的属性(距离)为两个人物之间的互动次数,互动越频繁距离越近。

NebulaGraph是一款开源的、分布式的、易扩展的原生图数据库,能够承载数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。

NebulaGraph由三种服务构成:Graph服务、Meta服务和Storage服务,是一种存储与计算分离的架构。

本文将介绍在Centos7操作系统上通过RPM安装Nebula。

wgethttps://oss-cdn.nebula-graph.com.cn/package/2.6.1/nebula-graph-2.6.1.el7.x86_64.rpm

安装RPM包。

sudorpm-ivhnebula-graph-2.6.1.el7.x86_64.rpm4.3.2启动NebulaGraph服务

NebulaGraph使用脚本nebula.service管理服务,包括启动、停止、重启、中止和查看。

nebula.service的默认路径是/usr/local/nebula/scripts,如果修改过安装路径,请使用实际路径。

nebula.service脚本的语法如下。

sudo/usr/local/nebula/scripts/nebula.service\n[-v][-c<config_file_path>]\n<start|stop|restart|kill|status>\n<metad|graphd|storaged|all>

参数说明如下。

我们使用以下命令启用NebulaGraph的所有服务,包括Meta服务、Graph服务和Storage服务。

sudo/usr/local/nebula/scripts/nebula.servicestartall\n

查看所有服务的状态,可以看到此时NebulaGraph的服务都已经正常启动。

sudo/usr/local/nebula/scripts/nebula.servicestatusall\n\n#返回结果\n[WARN]Themaximumfilesallowedtoopenmightbetoofew:1024\n[INFO]nebula-metad(de03025):Runningas62568,Listeningon9559\n[INFO]nebula-graphd(de03025):Runningas62658,Listeningon9669\n[INFO]nebula-storaged(de03025):Runningas62673,Listeningon9779\n4.3.3连接NebulaGraph

NebulaGraph支持多种类型客户端,包括CLI客户端、GUI客户端和流行编程语言开发的客户端,详情可以查看[NebulaGraph生态工具概览](https://docs.nebula-graph.com.cn/2.6.1/20.appendix/6.eco-tool-version/)。接下来将介绍如何使用原生CLI客户端NebulaConsole来连接NebulaGraph数据库。

首先在Github的[NebulaConsole下载页面](https://github.com/vesoft-inc/nebula-console/releases)根据机器的系统和CPU架构选择对应的二进制文件。我使用的机器的CPU架构是x86_64的,因此这里选择下载amd64的二进制文件。

为了方便使用,将文件重命名为nebula-console。

wgethttps://github.com/vesoft-inc/nebula-console/releases/download/v2.6.0/nebula-console-linux-amd64-v2.6.0\nmvnebula-console-linux-amd64-v2.6.0nebula-console

为nebula-console二进制文件赋予可执行权限。

chmod+xnebula-console

nebula-console的语法如下。

./nebula-console-addr<ip>-port<port>-u<username>-p<password>[-t120][-e"nGQL_statement"|-ffilename.nGQL]

参数说明如下。

./nebula-console-addr192.168.1.12-port9669-uroot-pnebula

看到以下输出说明连接成功。

接下来将使用下图的数据集演示NebulaGraph基础的操作语法,包括用于Schema创建和常用增删改查操作的语句。nGQL(NebulaGraphQueryLanguage)是NebulaGraph使用的的声明式图查询语言,支持灵活高效的图模式,而且nGQL是为开发和运维人员设计的类SQL查询语言,易于学习。

下表为basketballplayer数据集的结构示例,包括两种类型的点(playerteam)和两种类型的边(servefollow)。

本文将使用下图的数据集演示基础操作的语法。

执行如下语句创建名为basketballplayer的图空间。

(root@nebula)[(none)]>CREATESPACEbasketballplayer(partition_num=15,replica_factor=1,vid_type=fixed_string(30));

选择图空间basketballplayer。

(root@nebula)[(none)]>USEbasketballplayer;

查看创建的图空间。

(root@nebula)[basketballplayer]>SHOWSPACES;\n+--------------------+\n|Name|\n+--------------------+\n|"basketballplayer"|\n+--------------------+4.3.4.2创建Tag和Edgetype

Tag和Edgetype的作用,类似于关系型数据库中“点表”和“边表”的表结构。创建Tag:player和team,以及Edgetype:follow和serve。

CREATETAGplayer(namestring,ageint);\nCREATETAGteam(namestring);\nCREATEEDGEfollow(degreeint);\nCREATEEDGEserve(start_yearint,end_yearint);4.3.4.3插入点和边

可以使用INSERT语句,基于现有的Tag插入点,或者基于现有的Edgetype插入边。

INSERTVERTEXplayer(name,age)VALUES"player100":("TimDuncan",42);\nINSERTVERTEXplayer(name,age)VALUES"player101":("TonyParker",36);\nINSERTVERTEXplayer(name,age)VALUES"player102":("LaMarcusAldridge",33);\nINSERTVERTEXteam(name)VALUES"team203":("TrailBlazers"),"team204":("Spurs");\n\n

插入代表球员和球队之间关系的边。

INSERTEDGEfollow(degree)VALUES"player101"->"player100":(95);\nINSERTEDGEfollow(degree)VALUES"player101"->"player102":(90);\nINSERTEDGEfollow(degree)VALUES"player102"->"player100":(75);\nINSERTEDGEserve(start_year,end_year)VALUES"player101"->"team204":(1999,2018),"player102"->"team203":(2006,2015);\n\n4.3.4.4创建索引

MATCH和LOOKUP语句的执行都依赖索引,但是索引会导致写性能大幅降低(降低90%甚至更多)。请不要随意在生产环境中使用索引,除非很清楚使用索引对业务的影响。

必须为“已写入但未构建索引”的数据重建索引,否则无法在MATCH和LOOKUP语句中返回这些数据,参见[重建索引](https://docs.nebula-graph.com.cn/2.6.1/3.ngql-guide/14.native-index-statements/4.rebuild-native-index/)。

原生索引可以基于指定的属性查询数据,创建原生索引分为以下3种情况:

关于创建索引的详细内容可以查看[CREATEINDEX](https://docs.nebula-graph.com.cn/2.6.1/3.ngql-guide/14.native-index-statements/1.create-native-index/#tagedge_type)

为TAGteam的创建索引,需要重建索引确保对已存在数据生效,注意在重建索引之前我们等待20s,因为新创建的索引并不会立刻生效,因为创建索引是异步实现的,NebulaGraph需要在下一个心跳周期才能完成索引的创建。

#为Tagteam创建索引team_index_1。\nCREATETAGINDEXteam_index_1ONteam();\n#重建索引确保能对已存在数据生效。\n:sleep20\nREBUILDTAGINDEXteam_index_1;

为TAGplayer的name属性创建单属性索引,为name和age属性创建复合属性索引。

#为Tagplayer的name属性创建单属性索引player_index_1。\n#索引长度为10。即只使用属性name的前10个字符来创建索引。\nCREATETAGINDEXplayer_index_1ONplayer(name(20));\n#重建索引确保能对已存在数据生效。\nREBUILDTAGINDEXplayer_index_1;\n\n#为Tagplayer的name和age属性创建复合属性索引player_index_2。\nCREATETAGINDEXplayer_index_2ONplayer(name,age);\n#重建索引确保能对已存在数据生效。\n:sleep20\nREBUILDTAGINDEXplayer_index_2;

新创建的索引并不会立刻生效,创建新的索引并尝试立刻使用(例如LOOKUP或者REBUILDINDEX)通常会失败(报错can'tfindxxxinthespace)。因为创建步骤是异步实现的,NebulaGraph要在下一个心跳周期才能完成索引的创建。可以使用如下方法之一:

为EDGEtype创建索引的方式和点相同,只是把关键字改成EDGE即可。

#为EDGEfollow的degree属性创建索引,并重建索引。\nCREATEEDGEINDEXfollow_index_1onfollow(degree);\n:sleep20\nREBUILDEDGEINDEXfollow_index_1;\n\n#为EDGEserve创建索引,并重建索引。\nCREATEEDGEINDEXserve_index_1onserve();\n:sleep20\nREBUILDEDGEINDEXserve_index_1;\n\n\n#为EDGEserve创建复合属性索引,并重建索引。\nCREATEEDGEINDEXserve_index_2onserve(start_year,end_year);\n:sleep20\nREBUILDEDGEINDEXserve_index_2;4.3.4.5查看索引

查看为TAGplayer和team创建的索引。

(root@nebula)[basketballplayer]>SHOWTAGINDEXES;\n+------------------+----------+-----------------+\n|IndexName|ByTag|Columns|\n+------------------+----------+-----------------+\n|"player_index_1"|"player"|["name"]|#单属性索引\n|"player_index_2"|"player"|["name","age"]|#复合属性索引\n|"team_index_1"|"team"|[]|#TAG索引\n+------------------+----------+-----------------+

查看为EDGEfollow和serve创建的索引。

(root@nebula)[basketballplayer]>SHOWEDGEINDEXES;\n+------------------+----------+----------------------------+\n|IndexName|ByEdge|Columns|\n+------------------+----------+----------------------------+\n|"follow_index_1"|"follow"|["degree"]|#单属性索引\n|"serve_index_1"|"serve"|[]|#EDGE索引\n|"serve_index_2"|"serve"|["start_year","end_year"]|#复合属性索引\n+------------------+----------+----------------------------+4.3.4.6删除索引

删除TAGplayer的索引player_index_2。

(root@nebula)[basketballplayer]>DROPTAGINDEXplayer_index_2;

删除EDGEserve的索引serve_index_2。

(root@nebula)[basketballplayer]>DROPEDGEINDEXserve_index_2;4.3.4.7查询数据

查询数据主要有以下4种语句:

从TAGplayer中VID为player101的球员开始,沿着边follow找到连接的球员。

(root@nebula)[basketballplayer]>GOFROM"player101"OVERfollow;\n+-------------+\n|follow._dst|\n+-------------+\n|"player100"|\n|"player102"|\n+-------------+4.3.4.7.2FETCH语句示例

查询TAGplayer中VID为player100的球员的属性值。

(root@nebula)[basketballplayer]>FETCHPROPONplayer"player100";\n+----------------------------------------------------+\n|vertices_|\n+----------------------------------------------------+\n|("player100":player{age:42,name:"TimDuncan"})|\n+----------------------------------------------------+

获取连接player102和team203的边serve的所有属性值。

(root@nebula)[basketballplayer]>FETCHPROPONserve"player102"->"team203";\n+-----------------------------------------------------------------------+\n|edges_|\n+-----------------------------------------------------------------------+\n|[:serve"player102"->"team203"@0{end_year:2015,start_year:2006}]|\n+-----------------------------------------------------------------------+4.3.4.7.3LOOKUP语句示例

列出TAGplayer的所有VID。

(root@nebula)[basketballplayer]>LOOKUPONplayer;\n+-------------+\n|VertexID|\n+-------------+\n|"player100"|\n|"player102"|\n|"player103"|\n+-------------+

列出EDGEserve所有边的起始点、目的点和rank。

(root@nebula)[basketballplayer]>LOOKUPONserve;\n+-------------+-----------+---------+\n|SrcVID|DstVID|Ranking|\n+-------------+-----------+---------+\n|"player101"|"team204"|0|\n|"player102"|"team203"|0|\n+-------------+-----------+---------+

LOOKUP也可以基于where条件进行过滤,例如在EDGEserve中查询start_year==2006的属性值。

(root@nebula)[basketballplayer]>LOOKUPONservewhereserve.start_year==2006;\n+-------------+-----------+---------+\n|SrcVID|DstVID|Ranking|\n+-------------+-----------+---------+\n|"player102"|"team203"|0|\n+-------------+-----------+---------+4.3.4.7.4MATCH语句示例

通过MATCH语句分别查询TAGplayer和team的属性值。

#查询Tag为player的点的属性值\n(root@nebula)[basketballplayer]>MATCH(x:player)returnx;\n+-----------------------------------------------------------+\n|x|\n+-----------------------------------------------------------+\n|("player100":player{age:42,name:"TimDuncan"})|\n|("player101":player{age:36,name:"TonyParker"})|\n|("player102":player{age:33,name:"LaMarcusAldridge"})|\n+-----------------------------------------------------------+\n\n#查询Tag为team的点的属性值\n(root@nebula)[basketballplayer]>MATCH(x:team)returnx;\n+------------------------------------------+\n|x|\n+------------------------------------------+\n|("team203":team{name:"TrailBlazers"})|\n|("team204":team{name:"Spurs"})|\n+------------------------------------------+

也可以根据索引所在的属性进行查询,例如我们查询TAGplayer的name字段名为Tonyparker的属性值。

(root@nebula)[basketballplayer]>MATCH(v:player{name:"TonyParker"})RETURNv;\n+-----------------------------------------------------+\n|v|\n+-----------------------------------------------------+\n|("player101":player{age:36,name:"TonyParker"})|\n+-----------------------------------------------------+

由于TAGteam上的name属性并没有建立索引,因此无法根据name属性进行查询。

(root@nebula)[basketballplayer]>MATCH(v:team{name:'Spurs'})RETURNv;\n[ERROR(-1005)]:IndexNotFound:Novalidindexfound

使用MATCH查询EDGEserve的属性值。

(root@nebula)[basketballplayer]>MATCH()-[e:serve]-()RETURNe;\n+-----------------------------------------------------------------------+\n|e|\n+-----------------------------------------------------------------------+\n|[:serve"player101"->"team204"@0{end_year:2018,start_year:1999}]|\n|[:serve"player102"->"team203"@0{end_year:2015,start_year:2006}]|\n+-----------------------------------------------------------------------+4.3.4.7.5实际的查询例子

使用以下语句查询和TonyParker有关的球员和球队。

(root@nebula)[basketballplayer]>MATCHp=(v:player{name:"TonyParker"})-->(v2)RETURNp\n+-------------------------------------------------------------------------------------------------------------------------------------------+\n|p|\n+-------------------------------------------------------------------------------------------------------------------------------------------+\n|<("player101":player{age:36,name:"TonyParker"})-[:serve@0{end_year:2018,start_year:1999}]->("team204":team{name:"Spurs"})>|\n|<("player101":player{age:36,name:"TonyParker"})-[:follow@0{degree:95}]->("player100":player{age:42,name:"TimDuncan"})>|\n|<("player101":player{age:36,name:"TonyParker"})-[:follow@0{degree:90}]->("player102":player{age:33,name:"LaMarcusAldridge"})>|\n+-------------------------------------------------------------------------------------------------------------------------------------------+

和TonyParker有关系的球员和球队在下图中用绿色方框标识。

用户可以使用UPDATE语句或UPSERT语句修改现有数据。UPSERT是UPDATE和INSERT的结合体。当使用UPSERT更新一个点或边,如果它不存在,数据库会自动插入一个新的点或边。

首先查询TAGplayer现在的属性值。

(root@nebula)[basketballplayer]>match(n:player)returnn;\n+-----------------------------------------------------------+\n|n|\n+-----------------------------------------------------------+\n|("player100":player{age:42,name:"Tim"})|\n|("player101":player{age:36,name:"TonyParker"})|\n|("player102":player{age:33,name:"LaMarcusAldridge"})|\n+-----------------------------------------------------------+

用UPDATE修改VID为player100的球员的name属性,然后用FETCH语句检查结果。

(root@nebula)[basketballplayer]>UPDATEVERTEX"player100"SETplayer.name="Tim";\n\n(root@nebula)[basketballplayer]>FETCHPROPONplayer"player100";\n+---------------------------------------------+\n|vertices_|\n+---------------------------------------------+\n|("player100":player{age:42,name:"Tim"})|\n+---------------------------------------------+

执行UPSERT语句,分别对已存在的player101和未存在的player103进行操作,通过MATCH查询可以看到在UPSERT修改了原本player101的值,新插入的player103。

(root@nebula)[basketballplayer]>UPSERTVERTEX"player101"SETplayer.name="CRIS",player.age=18;\n(root@nebula)[basketballplayer]>UPSERTVERTEX"player103"SETplayer.name="THOMAS",player.age=20;\n\n\n(root@nebula)[basketballplayer]>match(n:player)returnn;\n+-----------------------------------------------------------+\n|n|\n+-----------------------------------------------------------+\n|("player101":player{age:18,name:"CRIS"})|\n|("player100":player{age:42,name:"Tim"})|\n|("player102":player{age:33,name:"LaMarcusAldridge"})|\n|("player103":player{age:20,name:"THOMAS"})|\n+-----------------------------------------------------------+4.3.4.9删除点和边

删除点。

nebula>DELETEVERTEX"player101";

删除边。

nebula>DELETEEDGEfollow"player101"->"team204";4.3.4.10删除TAG和EDGE

删除TAG/EDGE前要确保TAG/EDGE不包含任何索引,否则DROPTAG时会报冲突错误[ERROR(-8)]:Conflict!

#删除TAG的索引\nDROPTAGINDEXplayer_index_1;\nDROPTAGINDEXteam_index_1;\n\n#删除TAG\nDROPTAGplayer;\nDROPTAGteam;

删除EDGE。

#删除EDGE的索引\nDROPEDGEINDEXfollow_index_1\nDROPEDGEINDEXserve_index_1\n\n#删除EDGE\nDROPEDGEfollow;\nDROPEDGEserve;5部署NebulaGraph集群

在生产环境中,为了保证服务的高可用和高性能,通常会以集群的方式部署NebulaGraph。

在3台服务器上都部署Graph服务、Meta服务和Storage服务,这3个服务是NebulaGraph的核心组件。在ydt-net-nebula1服务器上部署NebulaDashboard和NebulaGraphStudio服务用于可视化操作和监控。

主机名IP地址角色ydt-net-nebula111.8.38.149NebulaGraph,NebulaDashboard,NebulaGraphStudioydt-net-nebula211.8.38.150NebulaGraphydt-net-nebula311.8.38.151NebulaGraph

分别修改3台机器的nebula-graphd.conf,nebula-storaged.conf,nebula-metad.conf配置文件,这3个配置文件中都只需要修改--meta_server_addrs和__local_ip两个参数。

在3台服务器上使用以下命令启用NebulaGraph的所有服务,包括Meta服务、Graph服务和Storage服务。

sudo/usr/local/nebula/scripts/nebula.servicestartall5.4验证Nebula集群状态

通过NebulaConsole连接任何一个已启动Graph服务的机器,执行命令SHOWHOSTS检查集群状态。

#连接Graph服务\n./nebula-console--addr11.8.38.149--port9669-uroot-pnebula\n\n#查看集群状态\n(root@nebula)[(none)]>SHOWHOSTS;\n+---------------+------+----------+--------------+--------------------------------------------+--------------------------------------------+\n|Host|Port|Status|Leadercount|Leaderdistribution|Partitiondistribution|\n+---------------+------+----------+--------------+--------------------------------------------+--------------------------------------------+\n|"11.8.38.149"|9779|"ONLINE"|0|"Novalidpartition"|"Novalidpartition"|\n|"11.8.38.150"|9779|"ONLINE"|0|"Novalidpartition"|"Novalidpartition"|\n|"11.8.38.151"|9779|"ONLINE"|0|"Novalidpartition"|"Novalidpartition"|\n|"Total"|||0|"Novalidpartition"|"Novalidpartition"|\n+---------------+------+----------+--------------+--------------------------------------------+--------------------------------------------+6安装NebulaDashboard

NebulaDashboard是一款用于监控NebulaGraph集群中机器和服务状态的可视化工具。

NebulaDashboard由以下5种服务组成,通过[这个地址](https://oss-cdn.nebula-graph.com.cn/nebula-graph-dashboard/1.0.1/nebula-graph-dashboard-1.0.1.x86_64.tar.gz)下载压缩包并解压后可以在目录nebula-graph-dashboard看到5个子目录,分别对应5个服务的目录。除了node-exporter服务需要在3台服务器上都部署,其余服务只需要在ydt-net-nebula1上部署。

在目录node-exporter内执行如下命令启动服务:

nohup./node-exporter--web.listen-address=":9100"&6.2部署nebula-stats-exporter服务

在目录nebula-stats-exporter内修改文件config.yaml,配置所有服务的HTTP端口。

version:v0.0.2\nnebulaItems:\n-instanceName:metad0\nendpointIP:11.8.38.149\nendpointPort:9559\ncomponentType:metad\n-instanceName:metad1\nendpointIP:11.8.38.150\nendpointPort:9559\ncomponentType:metad\n-instanceName:metad2\nendpointIP:11.8.38.151\nendpointPort:9559\ncomponentType:metad\n-instanceName:graphd0\nendpointIP:11.8.38.149\nendpointPort:9669\ncomponentType:graphd\n-instanceName:graphd1\nendpointIP:11.8.38.150\nendpointPort:9669\ncomponentType:graphd\n-instanceName:graphd2\nendpointIP:11.8.38.151\nendpointPort:9669\ncomponentType:graphd\n-instanceName:storaged0\nendpointIP:11.8.38.149\nendpointPort:9779\ncomponentType:storaged\n-instanceName:storaged1\nendpointIP:11.8.38.150\nendpointPort:9779\ncomponentType:storaged\n-instanceName:storaged2\nendpointIP:11.8.38.151\nendpointPort:9779\ncomponentType:storaged

执行如下命令启动服务:

nohup./nebula-stats-exporter--listen-address=":9200"--bare-metal--bare-metal-config=./config.yaml&6.3部署prometheus服务

在目录prometheus内修改文件prometheus.yaml,配置node-exporter服务和nebula-stats-exporter服务的IP地址和端口。

global:\nscrape_interval:5s#收集监控数据的间隔时间。默认为1分钟。\nevaluation_interval:5s#告警规则扫描时间间隔。默认为1分钟。\nscrape_configs:\n-job_name:'node-exporter'\nstatic_configs:\n-targets:[\n'11.8.38.149:9100',#node-exporter服务的IP地址和端口。\n'11.8.38.150:9100',\n'11.8.38.151:9100'\n]\n-job_name:'nebula-stats-exporter'\nstatic_configs:\n-targets:[\n'11.8.38.149:9200',#nebula-stats-exporter服务的IP地址和端口。\n]

执行如下命令启动服务:

nohup./prometheus--config.file=./prometheus.yaml&6.4部署nebula-http-gateway服务

在目录nebula-http-gateway内执行如下命令启动服务:

nohup./nebula-httpd&6.5部署nebula-graph-dashboard服务

在目录nebula-graph-dashboard/static/内修改文件custom.json,配置Graph服务的IP地址和端口。

{\n"connection":{\n"ip":"11.8.38.149",\n"port":9669\n},\n"alias":{\n"ip:port":"instance1"\n},\n"chartBaseLine":{\n\n}\n}

在目录nebula-graph-dashboard内执行如下命令启动服务:

npmrunstart6.6访问NebulaDashboard界面

在浏览器输入http://11.8.38.149:7003访问GraphDashboard界面。用户名:root,密码:nebula。在NebulaDashboard界面上我们可以看到CPU,内存,磁盘使用率和上下行流量等信息。

NebulaGraphStudio是一款可以通过Web访问的图数据库开源可视化工具,搭配NebulaGraph内核使用,提供构图、数据导入、编写nGQL查询、图探索等一站式服务。

在安装NebulaGraphStudio之前需要确保安装版本为v10.16.0+以上的Node.js。

#下载并解压Node压缩包\nwgethttps://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.xz\ntar-xzvfnode-v16.13.0-linux-x64.tar.xz\n\n#`node`及`npm`命令需要安装在`/usr/bin/`目录下,以防出现RPM安装时node命令找不到的情况,可以使用以下命令建立软连接。\nln-s/root/node-v16.13.0-linux-x64/bin/node/usr/bin/node\nln-s/root/node-v16.13.0-linux-x64/bin/npm/usr/bin/npm7.2部署NebulaGraphStudio

下载RPM安装包。

wgethttps://oss-cdn.nebula-graph.com.cn/nebula-graph-studio/3.1.0/nebula-graph-studio-3.1.0.x86_64.rpm

使用sudorpm-ivh命令安装RPM包。

sudorpm-ivhnebula-graph-studio-3.1.0.x86_64.rpm

当屏幕返回以下信息时,表示PRM版Studio已经成功启动。

eggstartedonhttp://0.0.0.0:7001nohup:把输出追加到"nohup.out"7.3访问NebulaGraphStudio

在浏览器地址栏输入http://11.8.38.149:7001访问NebulaGraphStudio界面,填写NebulaGraph数据库的连接信息后,点击连接按钮。

如果能看到如下图所示的界面,表示已经成功连接到NebulaGraph数据库。

我们可以在控制台中执行nGQL语句。

执行命令的结果可以通过可视化的方式进行展现。

接下来通过查询和TonyParker有关系的球员,同样可以以可视化的方式展示结果。

NebulaExchange是一款ApacheSpark应用,用于在分布式环境中将集群中的数据批量迁移到NebulaGraph中,能支持多种不同格式(CSV,JSON,Parquet,Neo4j,MySQL等等)的批式数据和流式数据的迁移。

接下来将用一个示例说明如何使用NebulaExchange将存储在HDFS或本地的CSV文件数据导入NebulaGraph。关于本地CSV的导入也可以使用NebulaImport,详细信息参见[使用NebulaImporter](https://docs.nebula-graph.com.cn/2.6.1/nebula-importer/use-importer/)。

下载[basketballplayer数据集](https://docs-cdn.nebula-graph.com.cn/dataset/dataset.zip)。

解压后可以看到有4张表,数据结构和Nebula快速入门章节中介绍的一样,有player和team两个TAG,follow和serve两个EDGEtype。

使用NebulaConsole创建一个图空间basketballplayer,并创建一个Schema,如下所示。

##创建图空间\nnebula>CREATESPACEbasketballplayer\\\n(partition_num=10,\\\nreplica_factor=1,\\\nvid_type=FIXED_STRING(30));\n\n##选择图空间basketballplayer\nnebula>USEbasketballplayer;\n\n##创建Tagplayer\nnebula>CREATETAGplayer(namestring,ageint);\n\n##创建Tagteam\nnebula>CREATETAGteam(namestring);\n\n##创建Edgetypefollow\nnebula>CREATEEDGEfollow(degreeint);\n\n##创建Edgetypeserve\nnebula>CREATEEDGEserve(start_yearint,end_yearint);8.3修改NebulaExchange配置文件

在root/csv_application.conf创建NebulaExchange配置文件,设置CVS数据源相关配置。本地和HDFS导入CSV除了path路径不同以外,其余配置都一样。如果你使用的是basketballplayer数据集,那么只需要修改Nebula的连接信息和CSVpath路径即可。

{\n#Spark相关配置\nspark:{\napp:{\nname:NebulaExchange2.6.0\n}\ndriver:{\ncores:1\nmaxResultSize:1G\n}\nexecutor:{\nmemory:1G\n}\n\ncores{\nmax:16\n}\n}\n\n#NebulaGraph相关配置\nnebula:{\naddress:{\n#指定Graph服务和所有Meta服务的IP地址和端口。\n#如果有多台服务器,地址之间用英文逗号(,)分隔。\n#格式:"ip1:port","ip2:port","ip3:port"\ngraph:["11.8.38.149:9669","11.8.38.150:9669","11.8.38.151:9669"]\nmeta:["11.8.38.149:9559","11.8.38.150:9559","11.8.38.151:9559"]\n}\n\n#指定拥有NebulaGraph写权限的用户名和密码。\nuser:root\npswd:nebula\n\n#指定图空间名称。\nspace:basketballplayer\nconnection{\ntimeout:3000\nretry:3\n}\nexecution{\nretry:3\n}\nerror:{\nmax:32\noutput:/tmp/errors\n}\nrate:{\nlimit:1024\ntimeout:1000\n}\n}\n\n#处理点\ntags:[\n#设置Tagplayer相关信息。\n{\n#指定NebulaGraph中定义的Tag名称。\nname:player\ntype:{\n#指定数据源,使用CSV。\nsource:csv\n\n#指定如何将点数据导入NebulaGraph:Client或SST。\nsink:client\n}\n\n#指定CSV文件的路径。\n#如果文件存储在HDFS上,用双引号括起路径,以hdfs://开头,例如"hdfs://ip:port/xx/xx"。\n#如果文件存储在本地,用双引号括起路径,以file://开头,例如"file:///tmp/xx.csv"。\n#path:"hdfs://192.168.*.*:9000/data/vertex_player.csv"\npath:"/root/dataset/vertex_player.csv"\n\n#如果CSV文件没有表头,使用[_c0,_c1,_c2,...,_cn]表示其表头,并将列指示为属性值的源。\n#如果CSV文件有表头,则使用实际的列名。\nfields:[_c1,_c2]\n\n#指定NebulaGraph中定义的属性名称。\n#fields与nebula.fields的顺序必须一一对应。\nnebula.fields:[age,name]\n\n#指定一个列作为VID的源。\n#vertex的值必须与上述fields或者csv.fields中的列名保持一致。\n#目前,NebulaGraph2.6.1仅支持字符串或整数类型的VID。\nvertex:{\nfield:_c0\n#policy:hash\n}\n\n#指定的分隔符。默认值为英文逗号(,)。\nseparator:","\n\n#如果CSV文件有表头,请将header设置为true。\n#如果CSV文件没有表头,请将header设置为false。默认值为false。\nheader:false\n\n#指定单批次写入NebulaGraph的最大点数量。\nbatch:256\n\n#指定Spark分片数量。\npartition:32\n}\n\n#设置Tagteam相关信息。\n{\n#指定NebulaGraph中定义的Tag名称。\nname:team\ntype:{\n#指定数据源,使用CSV。\nsource:csv\n\n#指定如何将点数据导入NebulaGraph:Client或SST。\nsink:client\n}\n\n#指定CSV文件的路径。\n#如果文件存储在HDFS上,用双引号括起路径,以hdfs://开头,例如"hdfs://ip:port/xx/xx"。\n#如果文件存储在本地,用双引号括起路径,以file://开头,例如"file:///tmp/xx.csv"。\n#path:"hdfs://192.168.*.*:9000/data/vertex_team.csv"\npath:"/root/dataset/vertex_team.csv"\n\n#如果CSV文件没有表头,使用[_c0,_c1,_c2,...,_cn]表示其表头,并将列指示为属性值的源。\n#如果CSV文件有表头,则使用实际的列名。\nfields:[_c1]\n\n#指定NebulaGraph中定义的属性名称。\n#fields与nebula.fields的顺序必须一一对应。\nnebula.fields:[name]\n\n#指定一个列作为VID的源。\n#vertex的值必须与上述fields或者csv.fields中的列名保持一致。\n#目前,NebulaGraph2.6.1仅支持字符串或整数类型的VID。\nvertex:{\nfield:_c0\n#policy:hash\n}\n\n#指定的分隔符。默认值为英文逗号(,)。\nseparator:","\n\n#如果CSV文件有表头,请将header设置为true。\n#如果CSV文件没有表头,请将header设置为false。默认值为false。\nheader:false\n\n#指定单批次写入NebulaGraph的最大点数量。\nbatch:256\n\n#指定Spark分片数量。\npartition:32\n}\n\n\n#如果需要添加更多点,请参考前面的配置进行添加。\n]\n#处理边\nedges:[\n#设置Edgetypefollow相关信息。\n{\n#指定NebulaGraph中定义的Edgetype名称。\nname:follow\ntype:{\n#指定数据源,使用CSV。\nsource:csv\n\n#指定如何将点数据导入NebulaGraph:Client或SST。\nsink:client\n}\n\n#指定CSV文件的路径。\n#如果文件存储在HDFS上,用双引号括起路径,以hdfs://开头,例如"hdfs://ip:port/xx/xx"。\n#如果文件存储在本地,用双引号括起路径,以file://开头,例如"file:///tmp/xx.csv"。\n#path:"hdfs://192.168.*.*:9000/data/edge_follow.csv"\npath:"/root/dataset/edge_follow.csv"\n\n#如果CSV文件没有表头,使用[_c0,_c1,_c2,...,_cn]表示其表头,并将列指示为属性值的源。\n#如果CSV文件有表头,则使用实际的列名。\nfields:[_c2]\n\n#指定NebulaGraph中定义的属性名称。\n#fields与nebula.fields的顺序必须一一对应。\nnebula.fields:[degree]\n\n#指定一个列作为起始点和目的点的源。\n#vertex的值必须与上述fields或者csv.fields中的列名保持一致。\n#目前,NebulaGraph2.6.1仅支持字符串或整数类型的VID。\nsource:{\nfield:_c0\n}\ntarget:{\nfield:_c1\n}\n\n#指定的分隔符。默认值为英文逗号(,)。\nseparator:","\n\n#指定一个列作为rank的源(可选)。\n\n#ranking:rank\n\n#如果CSV文件有表头,请将header设置为true。\n#如果CSV文件没有表头,请将header设置为false。默认值为false。\nheader:false\n\n#指定单批次写入NebulaGraph的最大边数量。\nbatch:256\n\n#指定Spark分片数量。\npartition:32\n}\n\n#设置Edgetypeserve相关信息。\n{\n#指定NebulaGraph中定义的Edgetype名称。\nname:serve\ntype:{\n#指定数据源,使用CSV。\nsource:csv\n\n#指定如何将点数据导入NebulaGraph:Client或SST。\nsink:client\n}\n\n#指定CSV文件的路径。\n#如果文件存储在HDFS上,用双引号括起路径,以hdfs://开头,例如"hdfs://ip:port/xx/xx"。\n#如果文件存储在本地,用双引号括起路径,以file://开头,例如"file:///tmp/xx.csv"。\n#path:"hdfs://192.168.*.*:9000/data/edge_serve.csv"\npath:"/root/dataset/edge_serve.csv"\n\n#如果CSV文件没有表头,使用[_c0,_c1,_c2,...,_cn]表示其表头,并将列指示为属性值的源。\n#如果CSV文件有表头,则使用实际的列名。\nfields:[_c2,_c3]\n\n#指定NebulaGraph中定义的属性名称。\n#fields与nebula.fields的顺序必须一一对应。\nnebula.fields:[start_year,end_year]\n\n#指定一个列作为起始点和目的点的源。\n#vertex的值必须与上述fields或者csv.fields中的列名保持一致。\n#目前,NebulaGraph2.6.1仅支持字符串或整数类型的VID。\nsource:{\nfield:_c0\n}\ntarget:{\nfield:_c1\n}\n\n#指定的分隔符。默认值为英文逗号(,)。\nseparator:","\n\n#指定一个列作为rank的源(可选)。\n#ranking:_c5\n\n#如果CSV文件有表头,请将header设置为true。\n#如果CSV文件没有表头,请将header设置为false。默认值为false。\nheader:false\n\n#指定单批次写入NebulaGraph的最大边数量。\nbatch:256\n\n#指定Spark分片数量。\npartition:32\n}\n\n]\n#如果需要添加更多边,请参考前面的配置进行添加。\n}8.4向NebulaGraph导入数据

通过[这个连接](https://repo1.maven.org/maven2/com/vesoft/nebula-exchange/2.6.0/)下载编译完成的NebulaExchangejar包。

在[Spark官方下载页面](https://archive.apache.org/dist/spark/spark-2.4.7/)下载Spark2.4.7版本压缩包。

运行spark-submit以local方式在本地运行Spark程序将CSV文件数据导入到NebulaGraph中。

好了,文章到此结束,希望可以帮助到大家。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023