DataX GDBWriter
1 快速介绍
GDBWriter插件实现了写入数据到GDB实例的功能。GDBWriter通过Gremlin Client
连接远程GDB实例,获取Reader的数据,生成写入DSL语句,将数据写入到GDB。
2 实现原理
GDBWriter通过DataX框架获取Reader生成的协议数据,使用g.addV/E(GDB___label).property(id, GDB___id).property(GDB___PK1, GDB___PV1)...
语句写入数据到GDB实例。
可以配置Gremlin Client
工作在session模式,由客户端控制事务,在一次事务中实现多个记录的批量写入。
3 功能说明
因为GDB中点和边的配置不同,导入时需要区分点和边的配置。
3.1 点配置样例
- 这里是一份从内存生成点数据导入GDB实例的配置
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"column" : [
{
"random": "1,100",
"type": "double"
},
{
"random": "1000,1200",
"type": "long"
},
{
"random": "60,64",
"type": "string"
},
{
"random": "100,1000",
"type": "long"
},
{
"random": "32,48",
"type": "string"
}
],
"sliceRecordCount": 1000
}
},
"writer": {
"name": "gdbwriter",
"parameter": {
"host": "gdb-endpoint",
"port": 8182,
"username": "root",
"password": "***",
"writeMode": "INSERT",
"labelType": "VERTEX",
"label": "#{1}",
"idTransRule": "none",
"session": true,
"maxRecordsInBatch": 64,
"column": [
{
"name": "id",
"value": "#{0}",
"type": "string",
"columnType": "primaryKey"
},
{
"name": "vertex_propKey",
"value": "#{2}",
"type": "string",
"columnType": "vertexSetProperty"
},
{
"name": "vertex_propKey",
"value": "#{3}",
"type": "long",
"columnType": "vertexSetProperty"
},
{
"name": "vertex_propKey2",
"value": "#{4}",
"type": "string",
"columnType": "vertexProperty"
}
]
}
}
}
]
}
}
3.2 边配置样例
- 这里是一份从内存生成边数据导入GDB实例的配置
注意 下面配置导入边时,需要提前在GDB实例中写入点,要求分别存在id为
person-{{i}}
和book-{{i}}
的点,其中i取值0~100。
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"column" : [
{
"random": "100,200",
"type": "double"
},
{
"random": "1,100",
"type": "long"
},
{
"random": "1,100",
"type": "long"
},
{
"random": "2000,2200",
"type": "long"
},
{
"random": "60,64",
"type": "string"
}
],
"sliceRecordCount": 1000
}
},
"writer": {
"name": "gdbwriter",
"parameter": {
"host": "gdb-endpoint",
"port": 8182,
"username": "root",
"password": "***",
"writeMode": "INSERT",
"labelType": "EDGE",
"label": "#{3}",
"idTransRule": "none",
"srcIdTransRule": "labelPrefix",
"dstIdTransRule": "labelPrefix",
"srcLabel":"person-",
"dstLabel":"book-",
"session":false,
"column": [
{
"name": "id",
"value": "#{0}",
"type": "string",
"columnType": "primaryKey"
},
{
"name": "id",
"value": "#{1}",
"type": "string",
"columnType": "srcPrimaryKey"
},
{
"name": "id",
"value": "#{2}",
"type": "string",
"columnType": "dstPrimaryKey"
},
{
"name": "edge_propKey",
"value": "#{4}",
"type": "string",
"columnType": "edgeProperty"
}
]
}
}
}
]
}
}
3.3 参数说明
-
host
- 描述:GDB实例连接域名,对应阿里云控制台->“图数据库 GDB”->“实例管理”->“基本信息” 中的"内网地址";
- 必选:是
- 默认值:无
-
port
- 描述:GDB实例连接端口
- 必选:是
- 默认值:8182
-
username
- 描述:GDB实例账号名
- 必选:是
- 默认值:无
-
password
- 描述:图实例账号名对应密码
- 必选:是
- 默认值:无
-
label
- 描述:类型名,即点/边名称; label支持从源列中读取,如#{0},表示取第一列字段作为label名。源列索引从0开始;
- 必选:是
- 默认值:无
-
labelType
- 描述:label类型;
- 枚举值"VERTEX"表示点
- 枚举值"EDGE"表示边
- 必选:是
- 默认值:无
- 描述:label类型;
-
srcLabel
- 描述:当label为边时,表示起点的点名称;srcLabel支持从源列中读取,如#{0},表示取第一列字段作为label名。源列索引从0开始;
- 必选:labelType为边,srcIdTransRule为none时可不填写,否则必填;
- 默认值:无
-
dstLabel
- 描述:当label为边时,表示终点的点名称;dstLabel支持从源列中读取,如#{0},表示取第一列字段作为label名。源列索引从0开始;
- 必选:labelType为边,dstIdTransRule为none时可不填写,否则必填;
- 默认值:无
-
writeMode
- 描述:导入id重复时的处理模式;
- 枚举值"INSERT"表示会报错,错误记录数加1;
- 枚举值"MERGE"表示更新属性值,不计入错误;
- 枚举值"SKIP"表示跳过,不计入错误
- 必选:是
- 默认值:INSERT
- 描述:导入id重复时的处理模式;
-
idTransRule
- 描述:主键id转换规则;
- 枚举值"labelPrefix"表示将映射的值转换为{label名}{源字段}
- 枚举值"none"表示映射的值不做转换
- 必选:是
- 默认值:“none”
- 描述:主键id转换规则;
-
srcIdTransRule
- 描述:当label为边时,表示起点的主键id转换规则;
- 枚举值"labelPrefix"表示映射的值转换为为{label名}{源字段}
- 枚举值"none"表示映射的值不做转换,此时srcLabel 可不填写
- 必选:label为边时必选
- 默认值:“none”
- 描述:当label为边时,表示起点的主键id转换规则;
-
dstIdTransRule
- 描述:当label为边时,表示终点的主键id转换规则;
- 枚举值"labelPrefix"表示映射的值转换为为{label名}{源字段}
- 枚举值"none"表示映射的值不做转换,此时dstLabel 可不填写
- 必选:label为边时必选
- 默认值:“none”
- 描述:当label为边时,表示终点的主键id转换规则;
-
session
- 描述:是否使用
Gremlin Client
的session模式写入数据 - 必选:否
- 默认值:false
- 描述:是否使用
-
maxRecordsInBatch
- 描述:使用
Gremlin Client
的session模式时,一次事务处理的记录数 - 必选:否
- 默认值:16
- 描述:使用
-
column
- 描述:点/边字段映射关系配置
- 必选:是
- 默认值:无
-
column -> name
- 描述:点/边映射关系的字段名
- 必选:是
- 默认值:无
-
column -> value
- 描述:点/边映射关系的字段值;
- #{N}表示直接映射源端值,N为源端column索引,从0开始;#{0}表示映射源端column第1个字段;
- test-#{0} 表示源端值做拼接转换,#{0}值前/后可添加固定字符串;
- #{0}-#{1}表示做多字段拼接,也可在任意位置添加固定字符串,如test-#{0}-test1-#{1}-test2
- 必选:是
- 默认值:无
- 描述:点/边映射关系的字段值;
-
column -> type
- 描述:点/边映射关系的字段值类型;
- 主键id只支持string类型,GDBWriter插件会强制转换,源id必须保证可转换为string;
- 普通属性支持类型:int, long, float, double, boolean, string
- 必选:是
- 默认值:无
- 描述:点/边映射关系的字段值类型;
-
column -> columnType
- 描述:点/边映射关系字段对应到GDB点/边数据的类型,支持以下几类枚举值:
- 公共枚举值:
- primaryKey:表示该字段是主键id
- 点枚举值:
- vertexProperty:labelType为点时,表示该字段是点的普通属性
- vertexSetProperty:labelType为点时,表示该字段是点的SET属性,value是SET属性中的一个属性值
- vertexJsonProperty:labelType为点时,表示是点json属性,value结构请见备注json properties示例,点配置最多只允许出现一个json属性;
- 边枚举值:
- srcPrimaryKey:labelType为边时,表示该字段是起点主键id
- dstPrimaryKey:labelType为边时,表示该字段是终点主键id
- edgeProperty:labelType为边时,表示该字段是边的普通属性
- edgeJsonProperty:labelType为边时,表示是边json属性,value结构请见备注json properties示例,边配置最多只允许出现一个json属性;
- 公共枚举值:
- 必选:是
- 默认值:无
- 备注:json properties示例
{"properties":[ {"k":"name","t":"string","v":"tom"}, {"k":"age","t":"int","v":"20"}, {"k":"sex","t":"string","v":"male"} ]} # json格式同样支持给点添加SET属性,格式如下 {"properties":[ {"k":"name","t":"string","v":"tom","c":"set"}, {"k":"name","t":"string","v":"jack","c":"set"}, {"k":"age","t":"int","v":"20"}, {"k":"sex","t":"string","v":"male"} ]}
- 描述:点/边映射关系字段对应到GDB点/边数据的类型,支持以下几类枚举值:
4 性能报告
4.1 环境参数
GDB实例规格
- 16core 128GB, 1TB SSD
DataX压测机器
- cpu: 4 * Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz
- mem: 16GB
- net: 千兆双网卡
- os: CentOS 7, 3.10.0-957.5.1.el7.x86_64
- jvm: -Xms4g -Xmx4g
4.2 数据特征
{
id: random double(1~10000)
from: random long(1~40000000)
to: random long(1~40000000)
label: random long(20000000 ~ 20005000)
propertyKey: random string(len: 120~128)
propertyName: random string(len: 120~128)
}
- 点/边都有一个属性,属性key和value都是长度120~128字节的随机字符串
- label是范围20000000 ~ 20005000的随机整数转换的字符串
- id是浮点数转换的字符串,防止重复
- 边包含关联起点和终点,测试边时已经提前导入twitter数据集的点数据(4200W)
4.3 任务配置
分点和边的配置,具体配置与上述的示例配置相似,下面列出关键的差异点
- 增加并发任务数量
“channel”: 32
- 使用session模式
“session”: true
- 增加事务批量处理记录个数
“maxRecordsInBatch”: 128
4.4 测试结果
点导入性能:
- 任务平均流量: 4.07MB/s
- 任务总计耗时: 412s
- 记录写入速度: 15609rec/s
- 读出记录总数: 6400000
边导入性能:
- 任务平均流量: 2.76MB/s
- 任务总计耗时: 1602s
- 记录写入速度: 10000rec/s
- 读出记录总数: 16000000
5 约束限制
- 导入边记录前要求GDB中已经存在边关联的起点/终点
- GDBWriter插件与用户查询DSL使用相同的GDB实例端口,导入时可能会影响查询性能
FAQ
- 使用SET属性需要升级GDB实例到
1.0.20
版本及以上。 - 边只支持普通单值属性,不能给边写SET属性数据。