DataX/adswriter/doc/adswriter.md
2023-03-21 18:45:57 +08:00

314 lines
9.1 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.

# DataX ADS写入
---
## 1 快速介绍
<br />
欢迎ADS加入DataX生态圈ADSWriter插件实现了其他数据源向ADS写入功能现有DataX所有的数据源均可以无缝接入ADS实现数据快速导入ADS。
ADS写入预计支持两种实现方式
* ADSWriter 支持向ODPS中转落地导入ADS方式优点在于当数据量较大时(>1KW)可以以较快速度进行导入缺点引入了ODPS作为落地中转因此牵涉三方系统(DataX、ADS、ODPS)鉴权认证。
* ADSWriter 同时支持向ADS直接写入的方式优点在于小批量数据写入能够较快完成(<1KW)缺点在于大数据导入较慢
注意
> 如果从ODPS导入数据到ADS请用户提前在源ODPS的Project中授权ADS Build账号具有读取你源表ODPS的权限同时ODPS源表创建人和ADS写入属于同一个阿里云账号。
-
> 如果从非ODPS导入数据到ADS请用户提前在目的端ADS空间授权ADS Build账号具备Load data权限。
以上涉及ADS Build账号请联系ADS管理员提供
## 2 实现原理
ADS写入预计支持两种实现方式
### 2.1 Load模式
DataX 将数据导入ADS为当前导入任务分配的ADS项目表随后DataX通知ADS完成数据加载该类数据导入方式实际上是写ADS完成数据同步由于ADS是分布式存储集群因此该通道吞吐量较大可以支持TB级别数据导入
![中转导入](http://aligitlab.oss-cn-hangzhou-zmf.aliyuncs.com/uploads/cdp/cdp/f805dea46b/_____2015-04-10___12.06.21.png)
1. DataX底层得到明文的 jdbc://host:port/dbname + username + password + table 以此连接ADS 执行show grants; 前置检查该用户是否有ADS中目标表的Load Data或者更高的权限注意此时ADSWriter使用用户填写的ADS用户名+密码信息完成登录鉴权工作
2. 检查通过后通过ADS中目标表的元数据反向生成ODPS DDL在ODPS中间project中以ADSWriter的账户建立ODPS表非分区表生命周期设为1-2Day), 并调用ODPSWriter把数据源的数据写入该ODPS表中
注意这里需要使用中转ODPS的账号AK向中转ODPS写入数据
3. 写入完成后以中转ODPS账号连接ADS发起Load Data From odps://中转project/中转table/' [overwrite] into adsdb.adstable [partition (xx,xx=xx)]; 这个命令返回一个Job ID需要记录
注意此时ADS使用自己的Build账号访问中转ODPS因此需要中转ODPS对这个Build账号提前开放读取权限
4. 连接ADS一分钟一次轮询执行 select state from information_schema.job_instances where job_id like $Job ID查询状态注意这个第一个一分钟可能查不到状态记录
5. Success或者Fail后返回给用户然后删除中转ODPS表任务结束
上述流程是从其他非ODPS数据源导入ADS流程对于ODPS导入ADS流程使用如下流程
![直接导入](http://aligitlab.oss-cn-hangzhou-zmf.aliyuncs.com/uploads/cdp/cdp/b3a76459d1/_____2015-04-10___12.06.25.png)
### 2.2 Insert模式
DataX 将数据直连ADS接口利用ADS暴露的INSERT接口直写到ADS该类数据导入方式写入吞吐量较小不适合大批量数据写入有如下注意点
* ADSWriter使用JDBC连接直连ADS并只使用了JDBC Statement进行数据插入ADS不支持PreparedStatement故ADSWriter只能单行多线程进行写入
* ADSWriter支持筛选部分列列换序等功能即用户可以填写列
* 考虑到ADS负载问题建议ADSWriter Insert模式建议用户使用TPS限流最高在1W TPS
* ADSWriter在所有Task完成写入任务后Job Post单例执行flush工作保证数据在ADS整体更新
## 3 功能说明
### 3.1 配置样例
* 这里使用一份从内存产生到ADS使用Load模式进行导入的数据
```
{
"job": {
"setting": {
"speed": {
"channel": 2
}
},
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"column": [
{
"value": "DataX",
"type": "string"
},
{
"value": "test",
"type": "bytes"
}
],
"sliceRecordCount": 100000
}
},
"writer": {
"name": "adswriter",
"parameter": {
"odps": {
"accessId": "xxx",
"accessKey": "xxx",
"account": "xxx@aliyun.com",
"odpsServer": "xxx",
"tunnelServer": "xxx",
"project": "transfer_project"
},
"writeMode": "load",
"url": "127.0.0.1:3306",
"schema": "schema",
"table": "table",
"username": "username",
"password": "password",
"partition": "",
"lifeCycle": 2,
"overWrite": true,
}
}
}
]
}
}
```
* 这里使用一份从内存产生到ADS使用Insert模式进行导入的数据
```
{
"job": {
"setting": {
"speed": {
"channel": 2
}
},
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"column": [
{
"value": "DataX",
"type": "string"
},
{
"value": "test",
"type": "bytes"
}
],
"sliceRecordCount": 100000
}
},
"writer": {
"name": "adswriter",
"parameter": {
"writeMode": "insert",
"url": "127.0.0.1:3306",
"schema": "schema",
"table": "table",
"column": ["*"],
"username": "username",
"password": "password",
"partition": "id,ds=2015"
}
}
}
]
}
}
```
### 3.2 参数说明 (用户配置规格)
* **url**
* 描述ADS连接信息格式为"ip:port"。
* 必选 <br />
* 默认值:无 <br />
* **schema**
* 描述ADS的schema名称。
* 必选:是 <br />
* 默认值:无 <br />
* **username**
* 描述ADS对应的username目前就是accessId <br />
* 必选:是 <br />
* 默认值:无 <br />
* **password**
* 描述ADS对应的password目前就是accessKey <br />
* 必选:是 <br />
* 默认值:无 <br />
* **table**
* 描述:目的表的表名称。
* 必选:是 <br />
* 默认值:无 <br />
* **partition**
* 描述:目标表的分区名称,当目标表为分区表,需要指定该字段。
* 必选:否 <br />
* 默认值:无 <br />
* **writeMode**
* 描述支持Load和Insert两种写入模式
* 必选:是 <br />
* 默认值:无 <br />
* **column**
* 描述:目的表字段列表,可以为["*"],或者具体的字段列表,例如["a", "b", "c"]
* 必选:是 <br />
* 默认值:无 <br />
* **overWrite**
* 描述ADS写入是否覆盖当前写入的表true为覆盖写入false为不覆盖(追加)写入。当writeMode为Load该值才会生效。
* 必选:是 <br />
* 默认值:无 <br />
* **lifeCycle**
* 描述ADS 临时表生命周期。当writeMode为Load时该值才会生效。
* 必选:是 <br />
* 默认值:无 <br />
* **batchSize**
* 描述ADS 提交数据写的批量条数当writeMode为insert时该值才会生效。
* 必选writeMode为insert时才有用 <br />
* 默认值32 <br />
* **bufferSize**
* 描述DataX数据收集缓冲区大小缓冲区的目的是攒一个较大的buffer源头的数据首先进入到此buffer中进行排序排序完成后再提交ads写。排序是根据ads的分区列模式进行的排序的目的是数据顺序对ADS服务端更友好出于性能考虑。bufferSize缓冲区中的数据会经过batchSize批量提交到ADS中一般如果要设置bufferSize设置bufferSize为batchSize数量的多倍。当writeMode为insert时该值才会生效。
* 必选writeMode为insert时才有用 <br />
* 默认值:默认不配置不开启此功能 <br />
### 3.3 类型转换
| DataX 内部类型| ADS 数据类型 |
| -------- | ----- |
| Long |int, tinyint, smallint, int, bigint|
| Double |float, double, decimal|
| String |varchar |
| Date |date |
| Boolean |bool |
| Bytes |无 |
注意:
* multivalue ADS支持multivalue类型DataX对于该类型支持待定
## 4 插件约束
如果Reader为ODPS且ADSWriter写入模式为Load模式时ODPS的partition只支持如下三种配置方式(以两级分区为例)
```
"partition":["pt=*,ds=*"] (读取test表所有分区的数据)
"partition":["pt=1,ds=*"] (读取test表下面一级分区pt=1下面的所有二级分区)
"partition":["pt=1,ds=hangzhou"] (读取test表下面一级分区pt=1下面二级分区ds=hz的数据)
```
## 5 性能报告(线上环境实测)
### 5.1 环境准备
### 5.2 测试报告
## 6 FAQ