mirror of
https://github.com/alibaba/DataX.git
synced 2025-05-18 01:49:37 +08:00
246 lines
8.1 KiB
Markdown
246 lines
8.1 KiB
Markdown
# DataX TDengineWriter
|
||
|
||
简体中文| [English](./tdenginewriter.md)
|
||
|
||
## 1 快速介绍
|
||
|
||
TDengineWriter插件实现了写入数据到TDengine数据库目标表的功能。底层实现上,TDengineWriter通过JDBC连接TDengine,按照TDengine的SQL语法,执行insert语句/schemaless语句,将数据写入TDengine。
|
||
|
||
TDengineWriter可以作为数据迁移工具供DBA将其它数据库的数据导入到TDengine。
|
||
|
||
|
||
|
||
## 2 实现原理
|
||
|
||
TDengineWriter 通过 DataX 框架获取 Reader生成的协议数据,通过JDBC Driver连接TDengine,执行insert语句/schemaless语句,将数据写入TDengine。
|
||
|
||
在TDengine中,table可以分成超级表、子表、普通表三种类型,超级表和子表包括colum和tag,子表的tag列的值为固定值,普通表与关系型数据库中表的概念一致。(详细请参考:[数据模型](https://www.taosdata.com/docs/cn/v2.0/architecture#model) )
|
||
|
||
TDengineWriter支持向超级表、子表、普通表中写入数据,按照table的类型和column参数中是否包含tbname,使用以下方法进行写入:
|
||
|
||
1. table为超级表,column中指定tbname:使用自动建表的insert语句,使用tbname作为子表的名称。
|
||
2. table为超级表,column中未指定tbname:使用schemaless写入,TDengine会根据超级表名、tag值计算一个子表名称。
|
||
3. table为子表:使用insert语句写入,ignoreTagUnmatched参数为true时,忽略record中tag值与table的tag值不一致的数据。
|
||
4. table为普通表:使用insert语句写入。
|
||
|
||
|
||
|
||
## 3 功能说明
|
||
### 3.1 配置样例
|
||
|
||
配置一个写入TDengine的作业
|
||
先在TDengine上创建超级表:
|
||
|
||
```sql
|
||
create database if not exists test;
|
||
create table test.weather (ts timestamp, temperature int, humidity double) tags(is_normal bool, device_id binary(100), address nchar(100));
|
||
```
|
||
|
||
使用下面的Job配置,将数据写入TDengine:
|
||
|
||
```json
|
||
{
|
||
"job": {
|
||
"content": [
|
||
{
|
||
"reader": {
|
||
"name": "streamreader",
|
||
"parameter": {
|
||
"column": [
|
||
{
|
||
"type": "string",
|
||
"value": "tb1"
|
||
},
|
||
{
|
||
"type": "date",
|
||
"value": "2022-02-20 12:00:01"
|
||
},
|
||
{
|
||
"type": "long",
|
||
"random": "0, 10"
|
||
},
|
||
{
|
||
"type": "double",
|
||
"random": "0, 10"
|
||
},
|
||
{
|
||
"type": "bool",
|
||
"random": "0, 50"
|
||
},
|
||
{
|
||
"type": "bytes",
|
||
"value": "abcABC123"
|
||
},
|
||
{
|
||
"type": "string",
|
||
"value": "北京朝阳望京"
|
||
}
|
||
],
|
||
"sliceRecordCount": 1
|
||
}
|
||
},
|
||
"writer": {
|
||
"name": "tdenginewriter",
|
||
"parameter": {
|
||
"username": "root",
|
||
"password": "taosdata",
|
||
"column": [
|
||
"tbname",
|
||
"ts",
|
||
"temperature",
|
||
"humidity",
|
||
"is_normal",
|
||
"device_id",
|
||
"address"
|
||
],
|
||
"connection": [
|
||
{
|
||
"table": [
|
||
"weather"
|
||
],
|
||
"jdbcUrl": "jdbc:TAOS-RS://192.168.56.105:6041/test"
|
||
}
|
||
],
|
||
"batchSize": 100,
|
||
"ignoreTagsUnmatched": true
|
||
}
|
||
}
|
||
}
|
||
],
|
||
"setting": {
|
||
"speed": {
|
||
"channel": 1
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3.2 参数说明
|
||
|
||
* jdbcUrl
|
||
* 描述:数据源的JDBC连接信息,TDengine的JDBC信息请参考:[Java连接器的使用](https://www.taosdata.com/docs/cn/v2.0/connector/java#url)
|
||
* 必选:是
|
||
* 默认值:无
|
||
* username
|
||
* 描述:用户名
|
||
* 必选:是
|
||
* 默认值:无
|
||
* password
|
||
* 描述:用户名的密码
|
||
* 必选:是
|
||
* 默认值:无
|
||
* table
|
||
* 描述:表名的集合,table应该包含column参数中的所有列(tbname除外)。注意,column中的tbname会被当作TDengine中子表名使用。
|
||
* 必选:是
|
||
* 默认值:无
|
||
* column
|
||
* 描述:字段名的集合,字段的顺序应该与record中column的
|
||
* 必选:是
|
||
* 默认值:无
|
||
* batchSize
|
||
* 描述:每batchSize条record为一个batch进行写入
|
||
* 必选:否
|
||
* 默认值:1
|
||
* ignoreTagsUnmatched
|
||
* 描述:当table为TDengine中的一张子表,table具有tag值。如果数据的tag值与table的tag值不想等,数据不写入到table中。
|
||
* 必选:否
|
||
* 默认值:false
|
||
|
||
|
||
### 3.3 类型转换
|
||
|
||
datax中的数据类型,可以映射到TDengine的数据类型
|
||
|
||
| DataX 内部类型 | TDengine 数据类型 |
|
||
| -------------- | ----------------------------------------- |
|
||
| INT | TINYINT, SMALLINT, INT |
|
||
| LONG | TIMESTAMP, TINYINT, SMALLINT, INT, BIGINT |
|
||
| DOUBLE | FLOAT, DOUBLE |
|
||
| STRING | TIMESTAMP, BINARY, NCHAR |
|
||
| BOOL | BOOL |
|
||
| DATE | TIMESTAMP |
|
||
| BYTES | BINARY |
|
||
|
||
|
||
|
||
### 3.4 各数据源到TDengine的参考示例
|
||
|
||
下面是一些数据源到TDengine进行数据迁移的示例
|
||
|
||
| 数据迁移示例 | 配置的示例 |
|
||
| ------------------ | ------------------------------------------------------------ |
|
||
| TDengine到TDengine | [超级表到超级表,指定tbname](../src/test/resources/t2t-1.json) |
|
||
| TDengine到TDengine | [超级表到超级表,不指定tbname](../src/test/resources/t2t-2.json) |
|
||
| TDengine到TDengine | [超级表到子表](../src/test/resources/t2t-3.json) |
|
||
| TDengine到TDengine | [普通表到普通表](../src/test/resources/t2t-4.json) |
|
||
| RDBMS到TDengine | [普通表到超级表,指定tbname](../src/test/resources/dm2t-1.json) |
|
||
| RDBMS到TDengine | [普通表到超级表,不指定tbname](../src/test/resources/dm2t-3.json) |
|
||
| RDBMS到TDengine | [普通表到子表](../src/test/resources/dm2t-2.json) |
|
||
| RDBMS到TDengine | [普通表到普通表](../src/test/resources/dm2t-4.json) |
|
||
| OpenTSDB到TDengine | [metric到普通表](../src/test/resources/o2t-1.json) |
|
||
|
||
|
||
|
||
|
||
## 4 性能报告
|
||
|
||
### 4.1 环境准备
|
||
|
||
#### 4.1.1 数据特征
|
||
|
||
建表语句:
|
||
|
||
单行记录类似于:
|
||
|
||
#### 4.1.2 机器参数
|
||
|
||
* 执行DataX的机器参数为:
|
||
1. cpu:
|
||
2. mem:
|
||
3. net: 千兆双网卡
|
||
4. disc: DataX 数据不落磁盘,不统计此项
|
||
|
||
* TDengine数据库机器参数为:
|
||
1. cpu:
|
||
2. mem:
|
||
3. net: 千兆双网卡
|
||
4. disc:
|
||
|
||
#### 4.1.3 DataX jvm 参数
|
||
|
||
-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError
|
||
|
||
### 4.2 测试报告
|
||
|
||
#### 4.2.1 单表测试报告
|
||
|
||
| 通道数 | DataX速度(Rec/s) | DataX流量(MB/s) | DataX机器网卡流出流量(MB/s) | DataX机器运行负载 | DB网卡进入流量(MB/s) | DB运行负载 | DB TPS |
|
||
| ------ | ---------------- | --------------- | --------------------------- | ----------------- | -------------------- | ---------- | ------ |
|
||
| 1 | | | | | | | |
|
||
| 4 | | | | | | | |
|
||
| 8 | | | | | | | |
|
||
| 16 | | | | | | | |
|
||
| 32 | | | | | | | |
|
||
|
||
说明:
|
||
|
||
1.
|
||
|
||
#### 4.2.4 性能测试小结
|
||
|
||
|
||
|
||
|
||
## 5 约束限制
|
||
|
||
1.
|
||
|
||
|
||
|
||
## FAQ
|
||
|
||
### 源表和目标表的字段顺序一致吗?
|
||
|
||
是的,TDengineWriter按照column中字段的顺序解析来自datax的数据。
|