社区动态
Pick of the Week'22 |第 9 周看点支持构建 ARM 平台 Docker 镜像
每周五 Nebula 为你播报每周看点,每周看点由固定模块:产品动态、社区问答、推荐阅读,和随机模块:本周大事件构成。
到了月末,不知道你这个月的砖搬得怎样了?本周 Nebula 社区“风平浪静”,只是添加了若干好用的小功能。不过要留意本周的社区问答,一名叫做 MrSaviorBill 的小伙伴亲身示范了一把“模范”提问和“教科书式”地 Debug 过程。
本周大事件
NebulaGraph 第四期个人技能认证上线
随着使用图数据库的需求在各行各业的增加,拥有图数据库的使用技能对于体现开发人员的个人能力是一个很好的参考。因此,为了能体现你已经掌握了并且会使用新一代图数据库 NebulaGraph 这一技能,NebulaGraph 社区设有 NGCI(全称:NebulaGraph Certified Insider)和 NGCP(NebulaGraph Certified Professional)两个不同难度的资格认证。
同之前限定 20 人参与认证考试的限额考核不同,这次参与认证的人数不再限制。所以,想一证在手来证明你的 Nebula 技能水平的小伙伴不要错过本次的认证考试哦~ 参与考试详情参考之前的推文:《NebulaGraph 个人技能认证第 3 批认证名额开放》
本次考试范围为 2.16 发布的 v3.0.0 版本,以下为 NGCP 的证书样本(除了证书还有 Nebula 限量周边赠送哟)
产品动态
本周 Nebula 主要有这些产品动态:
- 支持构建 ARM 平台的 Docker 镜像,标签:
部署
,具体 pr 见:https://github.com/vesoft-inc/nebula/pull/3939 - Storage 接口支持
LIMIT
下推,标签:性能优化
,pr 参见:https://github.com/vesoft-inc/nebula/pull/3839 - 使用
DROP SPACE
之后图空间将进行物理删除,标签:nGQL
,pr 参见:https://github.com/vesoft-inc/nebula/pull/3913
社区问答
Pick of the Week 每周会从官方论坛、知乎、微信群、微信公众号及开源中国等渠道精选问题同你分享。
主题分享
本周分享的主题是【nebula-exchange 报错如何 debug】,由社区用户 MrSaviorBill 提出,并在 Nebula 研发的引路下“教科书”式地自我解决问题。
MrSaviorBill:
问题描述
- nebula 版本:2.6.2
- 安装部署方式:Docker-Compose
通过 nebula-exchange-2.6.1.jar
从ClickHouse
导入数据至 Nebula
遇到几个问题。
问题 1:
在clickhouse_application.conf
中:
- 如果配置所有的
metad
节点地址,那么报错UnknownHostException
。 - 如果只填写报错信息后的
metad
节点地址,那么不会报错,导入成功 - 如果只填写另两个
metad
节点地址中的任意一个,那么报相同错UnknownHostException
。
报错信息如下:
22/02/21 08:07:21 ERROR MetaClient: Get Space Error: java.net.UnknownHostException: metad0
Exception in thread "main" com.facebook.thrift.transport.TTransportException: java.net.UnknownHostException: metad0
at com.facebook.thrift.transport.TSocket.open(TSocket.java:206)
at com.vesoft.nebula.client.meta.MetaClient.getClient(MetaClient.java:145)
at com.vesoft.nebula.client.meta.MetaClient.freshClient(MetaClient.java:165)
at com.vesoft.nebula.client.meta.MetaClient.getSpace(MetaClient.java:227)
at com.vesoft.nebula.client.meta.MetaClient.getTags(MetaClient.java:255)
at com.vesoft.nebula.exchange.MetaProvider.getLabelType(MetaProvider.scala:93)
at com.vesoft.nebula.exchange.utils.NebulaUtils$.getDataSourceFieldType(NebulaUtils.scala:31)
at com.vesoft.nebula.exchange.processor.VerticesProcessor.process(VerticesProcessor.scala:111)
at com.vesoft.nebula.exchange.Exchange$$anonfun$main$2.apply(Exchange.scala:150)
at com.vesoft.nebula.exchange.Exchange$$anonfun$main$2.apply(Exchange.scala:126)
at scala.collection.immutable.List.foreach(List.scala:392)
at com.vesoft.nebula.exchange.Exchange$.main(Exchange.scala:126)
at com.vesoft.nebula.exchange.Exchange.main(Exchange.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:845)
at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:161)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:184)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:920)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:929)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.net.UnknownHostException: metad0
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:607)
at com.facebook.thrift.transport.TSocket.open(TSocket.java:201)
... 24 more
问题 2:导入数据的所有中文显示为?
运行环境
Docker
环境
λ docker --version
Docker version 20.10.12, build e91ed57
λ docker-compose --version
Docker Compose version v2.2.3
ClickHouse
环境
- 部署方式:docker-compose 部署
- 版本:22.1.3.7
- 数据:官方
basketballplayer
,额外添加一个存在中文属性的 player 顶点
Spark
环境
java
版本:OpenJDK 64-Bit Server VM, Java 1.8.0_252
scala
版本:Scala version 2.11.12
spark
版本:version 2.4.6
Nebula
环境
使用 docker-compose 部署:
来源:
$ git clone -b v2.6 https://github.com/vesoft-inc/nebula-docker-compose.git
修改项:
--v=0
修改为--v=3
服务状态
创建 Schema
通过 Studio
界面连接并通过控制台界面创建 Schema
## 创建图空间
CREATE SPACE IF NOT EXISTS basketballplayer (partition_num = 10, replica_factor = 1, vid_type = FIXED_STRING(30));
## 创建 Tag player
CREATE TAG player(name string, age int);
## 创建 Tag team
CREATE TAG team(name string);
## 创建 Edge type follow
CREATE EDGE follow(degree int);
## 创建 Edge type serve
CREATE EDGE serve(start_year int, end_year int);
配置信息
1 填写所有 metad
地址(address
部分)
注: 有些为临时端口, 重启 docker-compose 后需要修改。
{
# 以下为 NebulaGraph 的 Graph 服务和 Meta 服务所在机器的 IP 地址及端口。
graph:["192.168.0.4:9669", "192.168.0.4:63264", "192.168.0.4:63271"]
meta:["192.168.0.4:63237", "192.168.0.4:63241", "192.168.0.4:63244"]
}
2 填写指定 metad
地址(address
部分)
注: 有些为临时端口, 重启 docker-compose 后需要修改。
{
# 以下为 NebulaGraph 的 Graph 服务和 Meta 服务所在机器的 IP 地址及端口。
# 全填写时报错信息 ERROR MetaClient: Get Space Error: java.net.UnknownHostException: metad0
# 填写 metad0 地址, 填写其它两个节点会报相同错误
graph:["192.168.0.4:9669"]
meta:["192.168.0.4:63237"]
}
3 配置文件(全)
{
# Spark 相关配置
spark: {
app: {
name: Nebula Exchange 2.6.1
}
driver: {
cores: 1
maxResultSize: 1G
}
cores {
max: 16
}
}
# NebulaGraph 相关配置
nebula: {
address:{
# 以下为 NebulaGraph 的 Graph 服务和 Meta 服务所在机器的 IP 地址及端口。
# # test 1
# graph:["192.168.0.4:9669", "192.168.0.4:63264", "192.168.0.4:63271"]
# meta:["192.168.0.4:63237", "192.168.0.4:63241", "192.168.0.4:63244"]
# test 2
graph:["192.168.0.4:9669"]
meta:["192.168.0.4:63237"]
}
user: root
pswd: nebula
space: basketballplayer
connection {
timeout: 3000
retry: 3
}
execution {
retry: 3
}
error: {
max: 32
output: /tmp/errors
}
rate: {
limit: 1024
timeout: 1000
}
}
tags: [
# 设置 Tag player 相关信息。
{
name: player
type: {
source: clickhouse
sink: client
}
url:"jdbc:clickhouse://192.168.0.4:20044/basketballplayer?characterEncoding=UTF-8"
user:"default"
password:""
numPartition:"5"
sentence:"select * from player"
fields: [name,age]
nebula.fields: [name,age]
vertex: {
field:playerid
}
batch: 256
partition: 32
}
{
name: team
type: {
source: clickhouse
sink: client
}
url:"jdbc:clickhouse://192.168.0.4:20044/basketballplayer?characterEncoding=UTF-8"
user:"default"
password:""
numPartition:"5"
sentence:"select * from team"
fields: [name]
nebula.fields: [name]
vertex: {
field:teamid
}
batch: 256
partition: 32
}
]
edges: [
{
name: follow
type: {
source: clickhouse
sink: client
}
url:"jdbc:clickhouse://192.168.0.4:20044/basketballplayer?characterEncoding=UTF-8"
user:"default"
password:""
numPartition:"5"
sentence:"select * from follow"
fields: [degree]
nebula.fields: [degree]
source: {
field:src_player
}
target: {
field:dst_player
}
batch: 256
partition: 32
}
{
name: serve
type: {
source: clickhouse
sink: client
}
url:"jdbc:clickhouse://192.168.0.4:20044/basketballplayer?characterEncoding=UTF-8"
user:"default"
password:""
numPartition:"5"
sentence:"select * from serve"
fields: [start_year,end_year]
nebula.fields: [start_year,end_year]
source: {
field:playerid
}
target: {
field:teamid
}
batch: 256
partition: 32
}
]
}
执行导入
上传配置文件和 nebula-exchange-2.6.1.jar
至 buckets-nebula-spark-master:/tmp
:
./bin/spark-submit --master spark://master:7077 --class com.vesoft.nebula.exchange.Exchange /tmp/nebula-exchange-2.6.1.jar -c /tmp/clickhouse_application.conf
- 填写所有 metad 地址报错,报错信息见问题描述
- 填写指定 metad 地址,成功,但是中文信息为
?
Nebula:问题产生的原因主要如下:
- metad0 识别不了,你可以在 Spark 节点中执行
telnet metad0 9559
,肯定访问不了 - 中文问题:你看可以用 spark shell 去读取一下 ClickHouse 数据看读进来的是否就是正常的中文,其次可以在命令中加入指定 spark worker 文件编码的参数
file.encoding
是utf-8
。
问题 1 解决方法记录
根据 Nebula 研发的回答 1,Spark
在执行Exchange
导入时,请求连接的是 metad0 9559
。显然需要把 Docker 部署的 Spark
和 NebulaGraph
放置于同一个网络。
在 Spark 容器内,执行 telnet metad0 9559
:
root@e4e8d6e543f4:/opt/bitnami/spark# telnet metad0 9559
telnet: could not resolve metad0/9559: Temporary failure in name resolution
修改 NebulaGraph
或者 Spark
的 docker-compose.yml
文件,连接至同一个 networks
后, 执行 telnet metad0 9559
:
root@9440bc008152:/opt/bitnami/spark# telnet metad0 9559
Trying 172.22.0.2...
Connected to metad0.
Escape character is '^]'.
修改 clickhouse_application.conf
配置全部地址
{
# 以下为 NebulaGraph 的 Graph 服务和 Meta 服务所在机器的 IP 地址及端口。
graph:["192.168.0.4:9669", "192.168.0.4:63264", "192.168.0.4:63271"]
meta:["192.168.0.4:63237", "192.168.0.4:63241", "192.168.0.4:63244"]
}
上传并进行导入
./bin/spark-submit --master spark://master:7077 --class com.vesoft.nebula.exchange.Exchange /tmp/nebula-exchange-2.6.1.jar -c /tmp/clickhouse_application.conf
导入成功,问题1
解决。
问题 2 解决方法记录
查询编码格式:
# 进入 spark shell
I have no name!@30c585604392:/opt/bitnami/spark/bin$ spark-shell
# 获取 file.encoding
scala> System.getProperty("file.encoding")
原因:Spark 编码格式不匹配
执行语句时添加参数:
./bin/spark-submit \
--master spark://master:7077 \
--conf spark.driver.extraJavaOptions=" -Dfile.encoding=utf-8 " \
--conf spark.executor.extraJavaOptions=" -Dfile.encoding=utf-8 " \
--class com.vesoft.nebula.exchange.Exchange /tmp/nebula-exchange-2.6.1.jar \
-c /tmp/clickhouse_application.conf
问题 2 解决!
推荐阅读
- 《NebulaGraph 的 KV 存储分离原理和性能测评》
- 推荐理由:经测试 KV 分离对于小 value 的查询延迟降低可高达 80.7%;对于大 value 的查询,可达到 52.5%。Nebula 的 KV 分离是如何做到这种性能提升的呢?
- 《高性能图计算系统 Plato 在 NebulaGraph 中的实践》
- 推荐理由:Nebula 基于开源的图计算框架 Plato 的二次开发,看 Nebula 是如何插上图计算的翅膀的吧~
星云·小剧场
为什么给图数据库取名 Nebula?
Nebula 是星云的意思,很大嘛,也是漫威宇宙里面漂亮的星云小姐姐。对了,Nebula 的发音是:[ˈnɛbjələ]
本文星云图讲解–《红与蓝波段的鹈鹕星云》
这团编录号为 IC 5070 的星云,和较大的北美洲星云之间,以一个满是黝黑尘埃的分子云相隔。因为鹈鹕星云是个特别活耀的恒星形成区和演化气体云之混合体,故常成为天文研究的焦点。
影像提供与版权:M. Petrasko, M. Evenden, U. Mishra (Insight Obs.) 作者与编辑:Robert Nemiroff (MTU) & Jerry Bonnell (UMCP)
交流图数据库技术?加入 Nebula 交流群请先填写下你的 Nebula 名片,Nebula 小助手会拉你进群~~