Skip to main content
Version: 3.11.0

Import data from MaxCompute

This topic provides an example of how to use Exchange to import NebulaGraph data stored in MaxCompute.

Data set​

This topic takes the basketballplayer dataset as an example.

Environment​

This example is done on MacOS. Here is the environment configuration information:

  • Hardware specifications:

    • CPU: 1.7 GHz Quad-Core Intel Core i7
    • Memory: 16 GB
  • Spark: 2.4.7, stand-alone

  • MaxCompute: Alibaba Cloud official version

  • NebulaGraph: 3.11.0. Deploy NebulaGraph with Docker Compose.

Prerequisites​

Before importing data, you need to confirm the following information:

  • NebulaGraph has been installed and deployed with the following information:

    • IP addresses and ports of Graph and Meta services.

    • The user name and password with write permission to NebulaGraph.

  • Exchange has been compiled, or download the compiled .jar file directly.

  • Spark has been installed.

  • Learn about the Schema created in NebulaGraph, including names and properties of Tags and Edge types, and more.

Steps​

Step 1: Create the Schema in NebulaGraph​

Analyze the data to create a Schema in NebulaGraph by following these steps:

  1. Identify the Schema elements. The Schema elements in the NebulaGraph are shown in the following table.

    ElementNameProperty
    Tagplayername string, age int
    Tagteamname string
    Edge Typefollowdegree int
    Edge Typeservestart_year int, end_year int
  2. Create a graph space basketballplayer in the NebulaGraph and create a Schema as shown below.

    ## Create a graph space.
    nebula> CREATE SPACE basketballplayer \
    (partition_num = 10, \
    replica_factor = 1, \
    vid_type = FIXED_STRING(30));

    ## Use the graph space basketballplayer.
    nebula> USE basketballplayer;

    ## Create the Tag player.
    nebula> CREATE TAG player(name string, age int);

    ## Create the Tag team.
    nebula> CREATE TAG team(name string);

    ## Create the Edge type follow.
    nebula> CREATE EDGE follow(degree int);

    ## Create the Edge type serve.
    nebula> CREATE EDGE serve(start_year int, end_year int);

For more information, see Quick start workflow.

Step 2: Modify configuration files​

After Exchange is compiled, copy the conf file target/classes/application.conf to set MaxCompute data source configuration. In this example, the copied file is called maxcompute_application.conf. For details on each configuration item, see Parameters in the configuration file.

{
# Spark configuration
spark: {
app: {
name: NebulaGraph Exchange 3.8.0
}
driver: {
cores: 1
maxResultSize: 1G
}
cores: {
max: 16
}
}

# NebulaGraph configuration
nebula: {
address:{
# Specify the IP addresses and ports for Graph and Meta services.
# If there are multiple addresses, the format is "ip1:port","ip2:port","ip3:port".
# Addresses are separated by commas.
graph:["127.0.0.1:9669"]
# the address of any of the meta services.
# if your NebulaGraph server is in virtual network like k8s, please config the leader address of meta.
meta:["127.0.0.1:9559"]
}
# The account entered must have write permission for the NebulaGraph space.
user: root
pswd: nebula
# Whether to use a password encrypted with RSA.
# enableRSA: true
# The key used to encrypt the password using RSA.
# privateKey: ""

# Fill in the name of the graph space you want to write data to in the NebulaGraph.
space: basketballplayer
connection: {
timeout: 3000
retry: 3
}
execution: {
retry: 3
}
error: {
max: 32
output: /tmp/errors
}
rate: {
limit: 1024
timeout: 1000
}
}
# Processing vertexes
tags: [
# Set the information about the Tag player.
{
name: player
type: {
# Specify the data source file format to MaxCompute.
source: maxcompute
# Specify how to import the data into NebulaGraph: Client or SST.
sink: client
}

# Table name of MaxCompute.
table:player

# Project name of MaxCompute.
project:project

# OdpsUrl and tunnelUrl for the MaxCompute service.
# The address is https://help.aliyun.com/document_detail/34951.html.
odpsUrl:"http://service.cn-hangzhou.maxcompute.aliyun.com/api"
tunnelUrl:"http://dt.cn-hangzhou.maxcompute.aliyun.com"

# AccessKeyId and accessKeySecret of the MaxCompute service.
accessKeyId:xxx
accessKeySecret:xxx

# Partition description of the MaxCompute table. This configuration is optional.
partitionSpec:"dt='partition1'"

# Ensure that the table name in the SQL statement is the same as the value of the table above. This configuration is optional.
sentence:"select id, name, age, playerid from player where id < 10"

# Specify the column names in the player table in fields, and their corresponding values are specified as properties in the NebulaGraph.
# The sequence of fields and nebula.fields must correspond to each other.
# If multiple column names need to be specified, separate them by commas.
fields:[name, age]
nebula.fields:[name, age]

# Specify a column of data in the table as the source of vertex VID in the NebulaGraph.
vertex:{
field: playerid
# udf:{
# separator:"_"
# oldColNames:[field-0,field-1,field-2]
# newColName:new-field
# }
# Add the specified prefix to the VID. For example, if the VID is `12345`, adding the prefix `tag1` will result in `tag1_12345`. The underscore cannot be modified.
# prefix:"tag1"
# Performs hashing operations on VIDs of type string.
# policy:hash
}

# The filtering rule. The data that matches the filter rule is imported into <ProductName />.
# filter: "name='Tom'"

# Batch operation types, including INSERT, UPDATE, and DELETE. defaults to INSERT.
#writeMode: INSERT

# Whether or not to delete the related incoming and outgoing edges of the vertices when performing a batch delete operation. This parameter takes effect when `writeMode` is `DELETE`.
#deleteEdge: false

# The number of data written to NebulaGraph in a single batch.
batch: 256

# The number of partitions to be created when the data is written to <ProductName />.
partition: 32
}

# Set the information about the Tag Team.
{
name: team
type: {
source: maxcompute
sink: client
}
table:team
project:project
odpsUrl:"http://service.cn-hangzhou.maxcompute.aliyun.com/api"
tunnelUrl:"http://dt.cn-hangzhou.maxcompute.aliyun.com"
accessKeyId:xxx
accessKeySecret:xxx
partitionSpec:"dt='partition1'"
sentence:"select id, name, teamid from team where id < 10"
fields:[name]
nebula.fields:[name]
vertex:{
field: teamid
}
batch: 256
partition: 32
}
]

# Processing edges
edges: [
# Set the information about the Edge Type follow.
{
# The corresponding Edge Type name in NebulaGraph.
name: follow

type:{
# Specify the data source file format to MaxCompute.
source:maxcompute

# Specify how to import the Edge type data into NebulaGraph.
# Specify how to import the data into NebulaGraph: Client or SST.
sink:client
}

# Table name of MaxCompute.
table:follow

# Project name of MaxCompute.
project:project

# OdpsUrl and tunnelUrl for MaxCompute service.
# The address is https://help.aliyun.com/document_detail/34951.html.
odpsUrl:"http://service.cn-hangzhou.maxcompute.aliyun.com/api"
tunnelUrl:"http://dt.cn-hangzhou.maxcompute.aliyun.com"

# AccessKeyId and accessKeySecret of the MaxCompute service.
accessKeyId:xxx
accessKeySecret:xxx

# Partition description of the MaxCompute table. This configuration is optional.
partitionSpec:"dt='partition1'"

# Ensure that the table name in the SQL statement is the same as the value of the table above. This configuration is optional.
sentence:"select * from follow"

# Specify the column names in the follow table in Fields, and their corresponding values are specified as properties in the NebulaGraph.
# The sequence of fields and nebula.fields must correspond to each other.
# If multiple column names need to be specified, separate them by commas.
fields:[degree]
nebula.fields:[degree]

# In source, use a column in the follow table as the source of the edge's source vertex.
source:{
field: src_player
# udf:{
# separator:"_"
# oldColNames:[field-0,field-1,field-2]
# newColName:new-field
# }
# Add the specified prefix to the VID. For example, if the VID is `12345`, adding the prefix `tag1` will result in `tag1_12345`. The underscore cannot be modified.
# prefix:"tag1"
# Performs hashing operations on VIDs of type string.
# policy:hash
}

# In target, use a column in the follow table as the source of the edge's destination vertex.
target:{
field: dst_player
# udf:{
# separator:"_"
# oldColNames:[field-0,field-1,field-2]
# newColName:new-field
# }
# Add the specified prefix to the VID. For example, if the VID is `12345`, adding the prefix `tag1` will result in `tag1_12345`. The underscore cannot be modified.
# prefix:"tag1"
# Performs hashing operations on VIDs of type string.
# policy:hash
}

# (Optional) Specify a column as the source of the rank.
#ranking: rank

# The filtering rule. The data that matches the filter rule is imported into <ProductName />.
# filter: "name='Tom'"

# Batch operation types, including INSERT, UPDATE, and DELETE. defaults to INSERT.
#writeMode: INSERT

# The number of partitions to be created when the data is written to <ProductName />.
partition:10

# The number of data written to NebulaGraph in a single batch.
batch:10
}

# Set the information about the Edge Type serve.
{
name: serve
type:{
source:maxcompute
sink:client
}
table:serve
project:project
odpsUrl:"http://service.cn-hangzhou.maxcompute.aliyun.com/api"
tunnelUrl:"http://dt.cn-hangzhou.maxcompute.aliyun.com"
accessKeyId:xxx
accessKeySecret:xxx
partitionSpec:"dt='partition1'"
sentence:"select * from serve"
fields:[start_year,end_year]
nebula.fields:[start_year,end_year]
source:{
field: playerid
}
target:{
field: teamid
}

# (Optional) Specify a column as the source of the rank.
#ranking: rank

partition:10
batch:10
}
]
}

Step 3: Import data into NebulaGraph​

Run the following command to import MaxCompute data into NebulaGraph. For a description of the parameters, see Options for import.

${SPARK_HOME}/bin/spark-submit --master "local" --class com.vesoft.nebula.exchange.Exchange <nebula-exchange.jar_path> -c <maxcompute_application.conf_path>
note

JAR packages are available in two ways: compiled them yourself, or download the compiled .jar file directly.

For example:

${SPARK_HOME}/bin/spark-submit --master "local" --class com.vesoft.nebula.exchange.Exchange /root/nebula-exchange/nebula-exchange/target/nebula-exchange_spark_2.4-3.8.0.jar -c /root/nebula-exchange/nebula-exchange/target/classes/maxcompute_application.conf

You can search for batchSuccess.<tag_name/edge_name> in the command output to check the number of successes. For example, batchSuccess.follow: 300.

Step 4: (optional) Validate data​

Users can verify that data has been imported by executing a query in the NebulaGraph client (for example, NebulaGraph Studio). For example:

LOOKUP ON player YIELD id(vertex);

Users can also run the SHOW STATS command to view statistics.

Step 5: (optional) Rebuild indexes in NebulaGraph​

With the data imported, users can recreate and rebuild indexes in NebulaGraph. For details, see Index overview.