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

每周看点

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

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

本周大事件

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

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

同之前限定 20 人参与认证考试的限额考核不同,这次参与认证的人数不再限制。所以,想一证在手来证明你的 Nebula 技能水平的小伙伴不要错过本次的认证考试哦~ 参与考试详情参考之前的推文:《Nebula Graph 个人技能认证第 3 批认证名额开放》

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

每周看点

产品动态

本周 Nebula 主要有这些产品动态:

社区问答

Pick of the Week 每周会从官方论坛、知乎、微信群、微信公众号及开源中国等渠道精选问题同你分享。

主题分享

本周分享的主题是【nebula-exchange 报错如何 debug】,由社区用户 MrSaviorBill 提出,并在 Nebula 研发的引路下“教科书”式地自我解决问题。

MrSaviorBill:

问题描述

  • nebula 版本:2.6.2
  • 安装部署方式:Docker-Compose

通过 nebula-exchange-2.6.1.jarClickHouse导入数据至 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

spark-version

问题 2:导入数据的所有中文显示为?

运行环境

Docker 环境

λ docker --version
Docker version 20.10.12, build e91ed57

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

docker-version

docker-compose-version

ClickHouse 环境

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

clickhouse-version

Spark 环境

  • java 版本:OpenJDK 64-Bit Server VM, Java 1.8.0_252
  • scala 版本:Scala version 2.11.12
  • spark 版本:version 2.4.6

spark-version

Nebula 环境

使用 docker-compose 部署:

来源:

$ git clone -b v2.6 https://github.com/vesoft-inc/nebula-docker-compose.git

修改项:

  • --v=0 修改为 --v=3

服务状态

nebula-graph-ps

nebula-graph-service-status

创建 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 后需要修改。

{
    # 以下为 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"]
}

2 填写指定 metad 地址(address 部分)

注: 有些为临时端口, 重启 docker-compose 后需要修改。

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

# 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.jarbuckets-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 地址,成功,但是中文信息为?

vertex-info-cn

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

  1. metad0 识别不了,你可以在 Spark 节点中执行 telnet metad0 9559,肯定访问不了
  2. 中文问题:你看可以用 spark shell 去读取一下 ClickHouse 数据看读进来的是否就是正常的中文,其次可以在命令中加入指定 spark worker 文件编码的参数 file.encodingutf-8

问题 1 解决方法记录

根据 Nebula 研发的回答 1,Spark 在执行Exchange导入时,请求连接的是 metad0 9559。显然需要把 Docker 部署的 SparkNebula 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 或者 Sparkdocker-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-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

vertex-info-cn2

问题 2 解决!

推荐阅读

星云·小剧场

为什么给图数据库取名 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 小助手会拉你进群~~

关注公众号


这是一个从 https://nebula-graph.com.cn/posts/nebula-graph-weekly-pickup-2022-02-25/ 下的原始话题分离的讨论话题