DataX/otswriter/doc/otswriter.md
2023-07-21 15:27:29 +08:00

351 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OTSWriter 插件文档
___
## 1 快速介绍
OTSWriter插件实现了向OTS写入数据目前支持了多版本数据的写入、主键自增列的写入等功能。
OTS是构建在阿里云飞天分布式系统之上的 NoSQL数据库服务提供海量结构化数据的存储和实时访问。OTS 以实例和表的形式组织数据,通过数据分片和负载均衡技术,实现规模上的无缝扩展。
## 2 实现原理
简而言之OTSWriter通过OTS官方Java SDK连接到OTS服务端并通过SDK写入OTS服务端。OTSWriter本身对于写入过程做了很多优化包括写入超时重试、异常写入重试、批量提交等Feature。
## 3 功能说明
### 3.1 配置样例
* 配置一个写入OTS作业:
`normal模式`
```
{
"job": {
"setting": {
},
"content": [
{
"reader": {},
"writer": {
"name": "otswriter",
"parameter": {
"endpoint":"",
"accessId":"",
"accessKey":"",
"instanceName":"",
"table":"",
// 可选 multiVersion||normal,可选配置默认normal
"mode":"normal",
//newVersion定义是否使用新版本插件 可选值true || false
"newVersion":"true",
//是否允许向包含主键自增列的ots表中写入数据
//与mode:multiVersion的多版本模式不兼容
"enableAutoIncrement":"true",
// 需要导入的PK列名区分大小写
// 类型支持STRINGINT,BINARY
// 必选
// 1. 支持类型转换,注意类型转换时的精度丢失
// 2. 顺序不要求和表的Meta一致
// 3. name全局唯一
"primaryKey":[
"userid",
"groupid"
],
// 需要导入的列名,区分大小写
// 类型支持STRINGINTDOUBLEBOOL和BINARY
// 必选
// 1.name全局唯一
"column":[
{"name":"addr", "type":"string"},
{"name":"height", "type":"int"}
],
// 如果用户配置了时间戳系统将使用配置的时间戳如果没有配置使用OTS的系统时间戳
// 可选
"defaultTimestampInMillionSecond": 142722431,
// 写入OTS的方式
// PutRow : 等同于OTS API中PutRow操作检查条件是ignore
// UpdateRow : 等同于OTS API中UpdateRow操作检查条件是ignore
"writeMode":"PutRow"
}
}
}
]
}
}
```
### 3.2 参数说明
* **endpoint**
* 描述OTS Server的EndPoint(服务地址)例如http://bazhen.cnhangzhou.ots.aliyuncs.com。
* 必选:是 <br />
* 默认值:无 <br />
* **accessId**
* 描述OTS的accessId <br />
* 必选:是 <br />
* 默认值:无 <br />
* **accessKey**
* 描述OTS的accessKey <br />
* 必选:是 <br />
* 默认值:无 <br />
* **instanceName**
* 描述OTS的实例名称实例是用户使用和管理 OTS 服务的实体,用户在开通 OTS 服务之后,需要通过管理控制台来创建实例,然后在实例内进行表的创建和管理。实例是 OTS 资源管理的基础单元OTS 对应用程序的访问控制和资源计量都在实例级别完成。 <br />
* 必选:是 <br />
* 默认值:无 <br />
* **table**
* 描述所选取的需要抽取的表名称这里有且只能填写一张表。在OTS不存在多表同步的需求。<br />
* 必选:是 <br />
* 默认值:无 <br />
* **newVersion**
* 描述version定义了使用的ots SDK版本。<br />
* true新版本插件使用com.alicloud.openservices.tablestore的依赖推荐
* false旧版本插件使用com.aliyun.openservices.ots的依赖**不支持多版本数据的读取**
* 必选:否 <br />
* 默认值false <br />
* **mode**
* 描述:是否为多版本数据,目前有两种模式。<br />
* normal对应普通的数据
* multiVersion写入数据为多版本格式的数据多版本模式下配置参数有所不同详见3.4节
* 必选:否 <br />
* 默认值normal <br />
* **enableAutoIncrement**
* 描述是否允许向包含主键自增列的ots表中写入数据。<br />
* true插件会扫描表中的自增列信息并在写入数据时自动添加自增列
* false写入含主键自增列的表时会报错
* 必选:否 <br />
* 默认值false <br />
* **isTimeseriesTable**
* 描述写入的对应表是否为时序表仅在mode=normal模式下生效。<br />
* true写入的数据表为时序数据表
* false写入的数据表为普通的宽表
* 必选:否 <br />
* 默认值false <br />
* 在写入时序数据表的模式下,不需要配置`primaryKey`字段,只需要配置`column`字段,配置样例:
```json
"column": [
{
"name": "_m_name", // 表示度量名称measurement字段
},
{
"name": "_data_source", // 表示数据源dataSource字段
},
{
"name": "_tags", // 表示标签字段会被解析为Map<String,String>类型
},
{
"name": "_time", // 表示时间戳字段会被解析为long类型的值
},
{
"name": "tag_a",
"isTag":"true" // 表示标签内部字段,该字段会被解析到标签的字典内部
},
{
"name": "column1", // 属性列名称
"type": "string" // 属性列类型,支持 bool string int double binary
},
{
"name": "column2",
"type": "int"
}
],
```
* **primaryKey**
* 描述: OTS的主键信息使用JSON的数组描述字段信息。OTS本身是NoSQL系统在OTSWriter导入数据过程中必须指定相应地字段名称。
OTS的PrimaryKey只能支持STRINGINT两种类型因此OTSWriter本身也限定填写上述两种类型。
DataX本身支持类型转换的因此对于源头数据非String/IntOTSWriter会进行数据类型转换。
配置实例:
```json
"primaryKey":[
"userid",
"groupid"
]
```
* 必选:是 <br />
* 默认值:无 <br />
* **column**
* 描述所配置的表中需要同步的列名集合使用JSON的数组描述字段信息。使用格式为
```json
{"name":"col2", "type":"INT"},
```
其中的name指定写入的OTS列名type指定写入的类型。OTS类型支持STRINGINTDOUBLEBOOL和BINARY几种类型 。
写入过程不支持常量、函数或者自定义表达式。
* 必选:是 <br />
* 默认值:无 <br />
* **writeMode**
* 描述:写入模式,目前支持两种模式,
* PutRow对应于OTS API PutRow插入数据到指定的行如果该行不存在则新增一行若该行存在则覆盖原有行。
* UpdateRow对应于OTS API UpdateRow更新指定行的数据如果该行不存在则新增一行若该行存在则根据请求的内容在这一行中新增、修改或者删除指定列的值。
* 必选:是 <br />
* 默认值:无 <br />
### 3.3 类型转换
目前OTSWriter支持所有OTS类型下面列出OTSWriter针对OTS类型转换列表:
| DataX 内部类型| OTS 数据类型 |
| -------- | ----- |
| Long |Integer |
| Double |Double|
| String |String|
| Boolean |Boolean|
| Bytes |Binary |
* 注意OTS本身不支持日期型类型。应用层一般使用Long报错时间的Unix TimeStamp。
### 3.4 multiVersion模式
#### 3.4.1 模式介绍
multiVersion模式解决了ots数据库中多版本数据的导入问题。支持Hbase的全量数据迁移到OTS
* 注意这种模式的数据格式比较特殊该writer需要reader也提供版本的输出
* 当前只有hbase reader 与 ots reader提供这种模式使用时切记注意
#### 3.4.2 配置样例
```
{
"job": {
"setting": {
},
"content": [
{
"reader": {},
"writer": {
"name": "otswriter",
"parameter": {
"endpoint":"",
"accessId":"",
"accessKey":"",
"instanceName":"",
"table":"",
// 多版本模式,插件会按照多版本模式去解析所有配置
"mode":"multiVersion",
"newVersion":"true",
// 配置PK信息
// 考虑到配置成本并不需要配置PK在RecordLine中的位置要求
// Record的格式固定,PK一定在行首PK之后是columnName格式如下
// 如:{pk0,pk1,pk2,pk3}, {columnName}, {timestamp}, {value}
"primaryKey":[
"userid",
"groupid"
],
// 列名前缀过滤
// 描述hbase导入过来的数据cf和qulifier共同组成columnName
// OTS并不支持cf所以需要将cf过滤掉
// 注意:
// 1.该参数选填,如果没有填写或者值为空字符串,表示不对列名进行过滤。
// 2.如果datax传入的数据columnName列不是以前缀开始则将该Record放入脏数据回收器中
"columnNamePrefixFilter":"cf:"
}
}
}
]
}
}
```
## 4 约束限制
### 4.1 写入幂等性
OTS写入本身是支持幂等性的也就是使用OTS SDK同一条数据写入OTS系统一次和多次请求的结果可以理解为一致的。因此对于OTSWriter多次尝试写入同一条数据与写入一条数据结果是等同的。
### 4.2 单任务FailOver
由于OTS写入本身是幂等性的因此可以支持单任务FailOver。即一旦写入FailDataX会重新启动相关子任务进行重试。
## 5 FAQ
* 1.如果使用多版本模式value为null应该怎么解释
* : 表示删除指定的版本
* 2.如果ts列为空怎么办
* :插件记录为垃圾数据
* 3.Record的count和期望不符
* : 插件异常终止
* 4.在普通模式下采用UpdateRow的方式写入数据如果不指定TS相同行数的数据怎么写入到OTS中
* : 后面的覆盖前面的数据