Skip to main content
Version: 3.12.0

Import data from ClickHouse

This topic provides an example of how to use Exchange to import data stored on ClickHouse into NebulaGraph.

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

  • ClickHouse: docker deployment yandex/clickhouse-server tag: latest(2021.07.01)

  • NebulaGraph: 3.12.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 ClickHouse data source configuration. In this example, the copied file is called clickhouse_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 ClickHouse.
source: clickhouse
# Specify how to import the data of vertexes into NebulaGraph: Client or SST.
sink: client
}

# JDBC URL of ClickHouse
url:"jdbc:clickhouse://192.168.*.*:8123/basketballplayer"

user:"user"
password:"123456"

# The number of ClickHouse partitions
numPartition:"5"

sentence:"select * from player"

# 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: clickhouse
sink: client
}
url:"jdbc:clickhouse://192.168.*.*:8123/basketballplayer"
user:"user"
password:"123456"
numPartition:"5"
sentence:"select * from team"
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 ClickHouse.
source: clickhouse

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

# JDBC URL of ClickHouse
url:"jdbc:clickhouse://192.168.*.*:8123/basketballplayer"

user:"user"
password:"123456"

# The number of ClickHouse partitions.
numPartition:"5"

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 vertexes.
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 vertexes.
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 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 Edge Type serve.
{
name: serve
type: {
source: clickhouse
sink: client
}
url:"jdbc:clickhouse://192.168.*.*:8123/basketballplayer"
user:"user"
password:"123456"
numPartition:"5"
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

batch: 256
partition: 32
}
]
}

Step 3: Import data into NebulaGraph​

Run the following command to import ClickHouse data into NebulaGraph. For descriptions 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 <clickhouse_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/clickhouse_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.