暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Pick of the Week'22 |第 9 周看点支持构建 ARM 平台 Docker 镜像

501

每周五 Nebula 为你播报每周看点,每周看点由固定模块:产品动态、社区问答、推荐阅读,和随机模块:本周大事件构成。

到了月末,不知道你这个月的砖搬得怎样了?本周 Nebula 社区“风平浪静”,只是添加了若干好用的小功能。不过要留意本周的社区问答,一名叫做 MrSaviorBill 的小伙伴亲身示范了一把“模范”提问和“教科书式”的 Debug 过程。

本周大事件

Nebula Graph 第四期个人技能认证上线

随着使用图数据库的需求在各行各业的增加,拥有图数据库的使用技能对于体现开发人员的个人能力是一个很好的参考。因此,为了能体现你已经掌握了并且会使用新一代图数据库 Nebula Graph 这一技能,Nebula Graph 社区设有 NGCI(全称:Nebula Graph Certified Insider)和 NGCP(全称:Nebula Graph Certified Professional)两个不同难度的考试来考核用户使用 Nebula Graph 的熟练程度。

同之前限定 20 人参与认证考试的限额考核不同,这次参与认证的人数不再限制。所以,想一证在手来证明你的 Nebula 技能水平的小伙伴不要错过本次的认证考试哦~

考试详情参考之前的推文:《Nebula Graph 个人技能认证第 3 批认证名额开放》🔗。

本次考试范围为 2.16 新发布的 v3.0.0 版本,以下为 NGCP 的证书样本。(除了证书还有 Nebula 限量周边赠送哟

报名截止时间:下周二(03.01)早 10 点,拷贝链接:https://wj.qq.com/s2/8860123/e647 至浏览器访问或直接戳「阅读原文」来报名吧~

也可联系 Nebula 客服小姐姐:nebulagraphbot(同下二维码) 来获取报名链接。

产品动态

本周 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 研发的指引下“教科书”式地自我解决了该问题。

问题描述

  1. nebula 版本:2.6.2

  2. 安装部署方式:Docker-Compose

通过 nebula-exchange-2.6.1.jar 从 ClickHouse 导入数据至 Nebula 遇到几个问题。

问题 1

在 clickhouse_application.conf 中:

  1. 如果配置所有的 metad 节点地址,那么报错 UnknownHostException

  2. 如果只填写报错信息后的 metad 节点地址,那么不会报错,导入成功。

  3. 如果只填写另两个 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 --version
Docker version 20.10.12, build e91ed57

λ docker-compose --version
Docker Compose version v2.2.3

ClickHouse 环境

  1. 部署方式:docker-compose
  2. 部署版本:22.1.3.7
  3. 数据:官方 basketballplayer,额外添加一个存在中文属性的 player 顶点

Spark 环境

  1. Java 版本:OpenJDK 64-Bit Server VM, Java 1.8.0_252

  2. Scala 版本:Scala version 2.11.12

  3. Spark 版本:version 2.4.6

Nebula 环境

  1. 使用 docker-compose 部署,来源:$ git clone -b v2.6 https://github.com/vesoft-inc/nebula-docker-compose.git

  2. 修改项:--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);

配置信息

{
  # Spark 相关配置
  spark: {
    app: {
      name: Nebula Exchange 2.6.1
    }
    driver: {
      cores: 1
      maxResultSize: 1G
    }
    cores {
      max: 16
    }
  }

# Nebula Graph 相关配置
  nebula: {
    address:{
      # 以下为 Nebula Graph 的 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

  1. 填写所有 metad 地址报错,报错信息见问题描述

  2. 填写指定 metad 地址,成功,但是中文信息为 ?(下图所示)

(以上为 MrSaviorBill 提交的问题描述信息)

Nebula:问题产生的原因主要如下:

  1. metad0 识别不了,你可以在 Spark 节点中执行 telnet metad0 9559,肯定访问不了;

  2. 中文问题:你看可以用 spark shell 去读取一下 ClickHouse 数据看读进来的是否就是正常的中文,其次可以在命令中加入指定 spark worker 文件编码的参数 file.encoding 是utf-8。

以下为 MrSaviorBill 教科书级别的 Debug 过程:

问题 1 解决方法记录

根据 Nebula 研发的回答 1,Spark 在执行 Exchange 导入时,请求连接的是 metad0 9559。显然需要把 Docker 部署的 Spark 和 Nebula Graph 放置于同一个网络。在 Spark 容器内,执行 telnet metad0 9559

root@e4e8d6e543f4:/opt/bitnami/spark# telnet metad0 9559
telnet: could not resolve metad0/9559: Temporary failure in name resolution

修改 Nebula Graph 或者 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 配置全部地址

{
    # 以下为 Nebula Graph 的 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 解决!

👏 👏

推荐阅读
星云·小剧场

为什么给图数据库取名 Nebula ?

Nebula 是星云的意思,很大嘛,也是漫威宇宙里面漂亮的星云小姐姐。对了,Nebula 的发音是:[ˈnɛbjələ]

本文星云图讲解–《红与蓝波段的鹈鹕星云》

这团编录号为 IC 5070 的星云,和较大的北美洲星云之间,以一个满是黝黑尘埃的分子云相隔。因为鹈鹕星云是个特别活耀的恒星形成区和演化气体云之混合体,故常成为天文研究的焦点。

影像提供与版权:Mike Selby & Warren Keller

作者与编辑:Robert Nemiroff ( MTU ) & Jerry Bonnell ( UMCP )

END

要来交流图据库技吗?关注公众号后发送“加群”,Nebula 迷人小姐姐拉你进群~~


🙋‍♂️ 喜欢本文的话,、👍 在看

谢谢~~

文章转载自Nebula Graph Community,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论