Hologres数据源为您提供读取和写入Hologres双向通道的功能,本文为您介绍DataWorks的Hologres数据同步的能力支持情况。
使用限制
Hologres数据源仅支持使用Serverless资源组运行同步任务。
离线读写
Hologres Writer不支持将数据写入Hologres的外部表。
Hologres数据源连通性获取Hologres端点的逻辑:
当前地域的Hologres实例,Hologres端点获取顺序:any Tunnel > Single Tunnel > Public(公网)。
跨地域的Hologres实例,Hologres端点获取顺序:Public(公网)> Single Tunnel。
单表实时读
Hologres版本必须在2.1以上。
不支持Hologres分区表的增量同步。
不支持Hologres表DDL变更消息同步。
Hologres增量同步支持的数据类型包括以下类型:
INTEGER、BIGINT、TEXT、CHAR(n)、VARCHAR(n)、REAL、JSON、SERIAL、OID、INT4[]、INT8[]、FLOAT8[]、BOOLEAN[]、TEXT[]。
Hologres单表实时同步时,需开启源端的Hologres数据库的表Hologres Binlog,详情可参见订阅Hologres Binlog。
整库实时写
实时数据同步任务暂不支持同步没有主键的表。
MySQL整库实时同步数据至Hologres时,目前仅支持将数据写入分区表子表,暂不支持写入数据至分区表父表。
支持的字段类型
字段类型 | 离线读(Hologres Reader) | 离线写(Hologres Writer) | 实时写 |
UUID | 不支持 | 不支持 | 不支持 |
CHAR | 支持 | 支持 | 支持 |
NCHAR | 支持 | 支持 | 支持 |
VARCHAR | 支持 | 支持 | 支持 |
LONGVARCHAR | 支持 | 支持 | 支持 |
NVARCHAR | 支持 | 支持 | 支持 |
LONGNVARCHAR | 支持 | 支持 | 支持 |
CLOB | 支持 | 支持 | 支持 |
NCLOB | 支持 | 支持 | 支持 |
SMALLINT | 支持 | 支持 | 支持 |
TINYINT | 支持 | 支持 | 支持 |
INTEGER | 支持 | 支持 | 支持 |
BIGINT | 支持 | 支持 | 支持 |
NUMERIC | 支持 | 支持 | 支持 |
DECIMAL | 支持 | 支持 | 支持 |
FLOAT | 支持 | 支持 | 支持 |
REAL | 支持 | 支持 | 支持 |
DOUBLE | 支持 | 支持 | 支持 |
TIME | 支持 | 支持 | 支持 |
DATE | 支持 | 支持 | 支持 |
TIMESTAMP | 支持 | 支持 | 支持 |
BINARY | 支持 | 支持 | 支持 |
VARBINARY | 支持 | 支持 | 支持 |
BLOB | 支持 | 支持 | 支持 |
LONGVARBINARY | 支持 | 支持 | 支持 |
BOOLEAN | 支持 | 支持 | 支持 |
BIT | 支持 | 支持 | 支持 |
JSON | 支持 | 支持 | 支持 |
JSONB | 支持 | 支持 | 支持 |
实现原理
离线读
Hologres Reader支持两种读取模式:
JDBC模式(默认)
通过PSQL读取Hologres表中的数据,根据表的Shard Count发起多个并发,每个Shard对应一个Select并发任务:
Hologres在创建表时,在同一个
CREATE TABLE事务中,通过CALL set_table_property('table_name', 'shard_count', 'xx')配置表的Shard Count。默认情况下,使用数据库默认的Shard Count,具体数值取决于Hologres实例的配置。
Select语句通过表的内置列hg_shard_id的Shard筛选数据。
Arrow模式(useArrow=true)
通过Hologres的COPY OUT Arrow协议读取数据,支持LZ4压缩传输,性能更高:
需要Hologres版本 >= 4.0.18。
同样按照Shard Count拆分并发任务。
不支持函数列和常量列(只支持表中的物理列)。
自动启用压缩传输(版本满足时)。
离线写
Hologres Writer通过数据同步框架获取Reader生成的协议数据,根据writeMode(写入模式)和conflictMode(冲突策略)的配置决定写入数据时的通道和冲突解决策略。
写入模式(writeMode)
写入模式 | 实现方式 | 适用场景 | 版本要求 |
INSERT | 使用Holo Client批量写入(INSERT ON CONFLICT)。 | 实时场景(包含数据回撤)、通用写入场景。 | 所有版本 |
FIXED_COPY | 使用Holo Client Fixed Copy流式写入。 | 实时场景(不包含数据回撤)、也可以用作离线导入场景。 | Hologres >= 1.1 |
STAGE | 先写入Hologres Internal Stage(Arrow格式),再从Stage导入目标表。 | 离线同步推荐模式,大批量导入,性能最优。 | Hologres >= 4.1.0 |
COPY | 使用JDBC COPY FROM STDIN写入文本CSV数据。 | 兼容旧版本的批量导入场景。 | 所有版本 |
场景推荐
冲突处理模式(conflictMode)
您可以通过配置conflictMode,决定新导入的数据和已有数据的主键发生冲突时,如何处理新导入的数据:
conflictMode仅适用于有主键的表。具体写入原理和性能,详情请参考技术原理。
conflictMode为Replace(整行更新)模式时,新数据覆盖旧数据,整行所有列全部覆盖,没有配置列映射的字段会强制写入NULL。
conflictMode为Update(更新)模式时,新数据覆盖旧数据,只覆盖配置有列映射的字段。
conflictMode为Ignore(忽略)模式时,忽略新数据。
创建数据源
在进行数据同步任务开发时,您需要在DataWorks上创建一个对应的数据源,操作流程请参见数据源管理,详细的配置参数解释可在配置界面查看对应参数的文案提示。
数据同步任务开发
单表离线
支持数据来源:数据集成模块数据来源支持的所有数据源类型。
配置指导:向导模式配置、脚本模式配置。脚本模式配置的全量参数和脚本Demo请参见下文的附录:脚本Demo与参数说明。
单表实时
支持数据来源:DataHub、Hologres、Kafka、LogHub
配置指导:单表实时同步任务配置。
整库离线
支持数据来源:AnalyticDB for MySQL 3.0、ClickHouse、Doris、Hologres、Oracle、PolarDB、SQL Server
配置指导:整库离线同步任务配置
整库实时
支持数据来源:AnalyticDB for OceanBase、MongoDB、MySQL、Oracle、PolarDB、PolarDB-X 2.0、PostgreSQL
配置指导:整库实时同步任务配置
Serverless整库实时
支持数据来源:MySQL
配置指导:Serverless同步任务配置
实时任务同步常见问题:实时同步至Hologres常见问题。
附录:脚本Demo与参数说明
离线任务脚本配置方式
如果您配置离线任务时使用脚本模式的方式进行配置,您需要按照统一的脚本格式要求,在任务脚本中编写相应的参数,详情请参见脚本模式配置,以下为您介绍脚本模式下数据源的参数配置详情。
Reader脚本Demo
配置非分区表
配置从Hologres非分区表读取数据至内存,如下所示。
{ "transform": false, "type": "job", "version": "2.0", "steps": [ { "stepType": "holo", "parameter": { "datasource": "holo_db", "envType": 1, "column": [ "tag", "id", "title", "body" ], "where": "", "table": "holo_reader_basic_src" }, "name": "Reader", "category": "reader" }, { "stepType": "stream", "parameter": { "print": false, "fieldDelimiter": "," }, "name": "Writer", "category": "writer" } ], "setting": { "executeMode": null, "failoverEnable": null, "errorLimit": { "record": "0" }, "speed": { "concurrent": 2, "throttle": false } }, "order": { "hops": [ { "from": "Reader", "to": "Writer" } ] } }Hologres表的DDL语句,如下所示。
begin; drop table if exists holo_reader_basic_src; create table holo_reader_basic_src( tag text not null, id int not null, title text not null, body text, primary key (tag, id)); call set_table_property('holo_reader_basic_src', 'orientation', 'column'); call set_table_property('holo_reader_basic_src', 'shard_count', '3'); commit;
配置分区表
配置从Hologres分区表的子表读取数据至内存。
说明请注意partition的配置。
{ "transform": false, "type": "job", "version": "2.0", "steps": [ { "stepType": "holo", "parameter": { "selectedDatabase": "public", "partition": "tag=foo", "datasource": "holo_db", "envType": 1, "column": [ "tag", "id", "title", "body" ], "tableComment": "", "where": "", "table": "public.holo_reader_basic_part_src" }, "name": "Reader", "category": "reader" }, { "stepType":"stream", "parameter":{}, "name":"Writer", "category":"writer" } ], "setting":{ "errorLimit":{ "record":"0" }, "speed":{ "throttle":true, "concurrent":1, "mbps":"12" } }, "order":{ "hops":[ { "from":"Reader", "to":"Writer" } ] } }Hologres表的DDL语句,如下所示。
begin; drop table if exists holo_reader_basic_part_src; create table holo_reader_basic_part_src( tag text not null, id int not null, title text not null, body text, primary key (tag, id)) partition by list( tag ); call set_table_property('holo_reader_basic_part_src', 'orientation', 'column'); call set_table_property('holo_reader_basic_part_src', 'shard_count', '3'); commit; create table holo_reader_basic_part_src_1583161774228 partition of holo_reader_basic_part_src for values in ('foo'); # 确保分区表子表已经创建且导入数据。 postgres=# \d+ holo_reader_basic_part_src Table "public.holo_reader_basic_part_src" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+---------+-----------+----------+---------+----------+--------------+------------- tag | text | | not null | | extended | | id | integer | | not null | | plain | | title | text | | not null | | extended | | body | text | | | | extended | | Partition key: LIST (tag) Indexes: "holo_reader_basic_part_src_pkey" PRIMARY KEY, btree (tag, id) Partitions: holo_reader_basic_part_src_1583161774228 FOR VALUES IN ('foo')
Reader脚本参数
参数 | 描述 | 是否必选 | 默认值 |
database | Hologres实例内部数据库的名称。 | 是 | 无 |
table | Hologres的表名称,支持 | 条件必选 | 无 |
querySql | 自定义查询SQL,配置后table和column参数将被忽略。与 | 条件必选 | 无 |
column | 定义需要读取的数据列。 | 是 | 无 |
partition | 针对分区表,表示分区Column以及对应的Value,格式为 重要
| 否 | 空,表示非分区表。 |
where | 过滤条件,会拼接到SELECT语句的WHERE子句中。仅在table模式下生效。 | 否 | 空 |
useArrow | 是否使用Arrow列存格式进行高性能数据同步。启用后Reader使用COPY OUT Arrow协议读取数据,以列式格式直通下游Writer,性能更高。需要Hologres >= 4.0.18,版本不满足时自动降级为JDBC模式。Arrow模式不支持函数列和常量列。目前支持源端与目标端为MaxCompute、Hologres、Hive/OSS/HDFS(Parquet/ORC)这几种类型的整库离线同步和单表离线同步。详情请参见Arrow列存格式高性能同步。 | 否 | false |
compress | Arrow模式下是否启用LZ4压缩传输。仅在 | 否 | true(版本满足时自动设置) |
fetchSize | JDBC模式下每次从数据库获取的行数。 | 否 | 1000 |
jdbcReadTimeout | JDBC读取超时时间,单位为秒。 | 否 | 60 |
enableServerlessComputing | 是否启用Hologres Serverless Computing加速查询。注意:此参数控制的是Hologres实例的Serverless Computing能力,与DataWorks的Serverless资源组是不同的概念。 | 否 | false |
serverlessComputingQueryPriority | Hologres Serverless Computing查询优先级,范围1-10,数字越大优先级越高。仅在 | 否 | 3 |
serverlessComputingRequiredCores | Hologres Serverless Computing请求的核数。仅在 | 否 | 5 |
Writer脚本Demo
配置非分区表
配置从MySQL产生的数据导入至Hologres普通表,示例为通过INSERT模式导入的配置。
{ "type": "job", "version": "2.0", "steps": [ { "stepType": "mysql", "parameter": { "envType": 0, "useSpecialSecret": false, "column": [ "<column1>", "<column2>", ......, "<columnN>" ], "tableComment": "", "connection": [ { "datasource": "<mysql_source_name>",//mysql数据源名 "table": [ "<mysql_table_name>" ] } ], "where": "", "splitPk": "", "encoding": "UTF-8" }, "name": "Reader", "category": "reader" }, { "stepType": "holo", "parameter": { "selectedDatabase":"public", "schema": "public", "writeMode": "FIXED_COPY", "maxConnectionCount": 9, "truncate":true,//清理规则 "datasource": "<holo_sink_name>",//Hologres数据源名称 "conflictMode": "ignore", "envType": 0, "column": [ "<column1>", "<column2>", ......, "<columnN>" ], "tableComment": "", "table": "<holo_table_name>", "reShuffleByDistributionKey":false }, "name": "Writer", "category": "writer" } ], "setting": { "executeMode": null, "errorLimit": { "record": "0" }, "locale": "zh_CN", "speed": { "concurrent": 2,//作业并发数 "throttle": false//限流 } }, "order": { "hops": [ { "from": "Reader", "to": "Writer" } ] } }Hologres表的DDL语句,如下所示。
begin; drop table if exists mysql_to_holo_test; create table mysql_to_holo_test( tag text not null, id int not null, body text not null, brrth date, primary key (tag, id)); call set_table_property('mysql_to_holo_test', 'orientation', 'column'); call set_table_property('mysql_to_holo_test', 'distribution_key', 'id'); call set_table_property('mysql_to_holo_test', 'clustering_key', 'birth'); commit;
配置分区表
说明目前Hologres仅支持LIST分区,分区Column仅支持单个Column分区,且仅支持INT4或TEXT类型。
请确认该参数和表DDL的分区配置匹配。
配置从MySQL产生的数据同步至Hologres分区表的子表。
{ "type": "job", "version": "2.0", "steps": [ { "stepType": "mysql", "parameter": { "envType": 0, "useSpecialSecret": false, "column": [ "<column1>", "<column2>", ......, "<columnN>" ], "tableComment": "", "connection": [ { "datasource": "<mysql_source_name>", "table": [ "<mysql_table_name>" ] } ], "where": "", "splitPk": "<mysql_pk>",//mysql的pk字段 "encoding": "UTF-8" }, "name": "Reader", "category": "reader" }, { "stepType": "holo", "parameter": { "selectedDatabase": "public", "writeMode": "insert", "maxConnectionCount": 9, "partition": "ds=20201215",//Hologres分区键 "truncate": "false", "datasource": "<holo_sink_name>",//Hologres数据源名 "conflictMode": "ignore", "envType": 0, "column": [ "<column1>", "<column2>", ......, "<columnN>" ], "tableComment": "", "table": "<holo_table_name>", "reShuffleByDistributionKey":false }, "name": "Writer", "category": "writer" } ], "setting": { "executeMode": null, "failoverEnable": null, "errorLimit": { "record": "0" }, "speed": { "concurrent": 2,//作业并发数 "throttle": false//限流 } }, "order": { "hops": [ { "from": "Reader", "to": "Writer" } ] } }Hologres表的DDL语句,如下所示。
BEGIN; CREATE TABLE public.hologres_parent_table( a text , b int, c timestamp, d text, ds text, primary key(ds,b) ) PARTITION BY LIST(ds); CALL set_table_property('public.hologres_parent_table', 'orientation', 'column'); CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_table FOR VALUES IN('20201215'); CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_table FOR VALUES IN('20201216'); CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_table FOR VALUES IN('20201217'); COMMIT;
Writer脚本参数
基础参数
参数 | 描述 | 是否必选 | 默认值 |
database | Hologres实例内部数据库的名称。 | 是 | 无 |
table | Hologres的表名称,目前支持表名称中包含Schema,例如 | 是 | 无 |
writeMode | 写入模式,支持 | 是 | 无 |
conflictMode | 冲突处理模式,包括 | 是 | 无 |
column | 定义导入目标表的数据列,必须包含目标表的主键集合(serial自增主键和generated column可除外)。 | 是 | 无 |
partition | 针对分区表,表示分区Column以及对应的Value,格式为 说明
| 否 | 空,表示非分区表 |
reShuffleByDistributionKey | 在 Hologres 中,主键表的批量导入默认会触发表锁,这限制了多个连接的并发写入能力。开启 reShuffle 功能可以在离线同步场景下,允许不同的任务根据数据分片键将数据写入指定的 Holo shard,这样可以实现并发批量写入,从而显著提升写入性能。与传统 JDBC 模式的实时写入相比,启用该功能不仅能降低 Holo 服务端的负载,还能进一步提升写入效率。 重要 该功能仅在Serverless资源组开启。 | 否 | false |
truncate | 写入Holo表之前是否需要清空目标表。
| 否 | false |
partitionFormat | 动态分区值格式化规则。对于Date类型源数据,指定格式如 | 否 | 无 |
preSql | 写入前执行的SQL列表。不支持在分区父表上执行。 | 否 | 无 |
postSql | 写入后执行的SQL列表。 | 否 | 无 |
连接与性能参数
参数 | 描述 | 是否必选 | 默认值 |
maxConnectionCount | 写入并发连接数。该值会根据实际任务并发数自动调整( | 否 | 3 |
maxRetryCount | 失败重试次数。 | 否 | 10 |
jdbcReadTimeout | JDBC连接超时时间,单位为秒。 | 否 | 120 |
maxCommitSize | 单次提交的最大字节数(字节)。 | 否 | 2097152(2MB) |
maxCommitCount | 单次提交的最大记录数。 | 否 | 256 |
reShuffleByDistributionKey | 在Hologres中,主键表的批量导入默认会触发表锁,这限制了多个连接的并发写入能力。开启reShuffle功能可以在离线同步场景下,允许不同的任务根据数据分片键将数据写入指定的Holo shard,这样可以实现并发批量写入,从而显著提升写入性能。与传统JDBC模式的实时写入相比,启用该功能不仅能降低Holo服务端的负载,还能进一步提升写入效率。 重要 该功能仅在Serverless资源组开启。 | 否 | false |
removeU0000InTextColumnValue | 是否移除文本列值中的 | 否 | true |
Hologres Serverless Computing参数
以下参数用于控制Hologres实例的Serverless Computing能力,可加速Reader的查询读取以及STAGE模式Writer的INSERT FROM Stage操作。
注意:Hologres Serverless Computing与DataWorks Serverless资源组是不同的概念。前者是Hologres实例内部的弹性计算能力,后者是DataWorks运行同步任务的调度资源。
适用范围:读取端(Reader)所有模式均支持;写入端(Writer)仅STAGE模式支持。
参数 | 描述 | 是否必选 | 默认值 |
enableServerlessComputing | 是否启用Hologres Serverless Computing加速。 | 否 | false |
serverlessComputingQueryPriority | Serverless Computing查询优先级,范围1-10,数字越大优先级越高。 | 否 | 3 |
serverlessComputingRequiredCores | Serverless Computing请求的核数。设为0表示由引擎自动决定。 | 否 | 无(不设置) |
FIXED_COPY模式特有参数
参数 | 描述 | 是否必选 | 默认值 |
isBinaryFormat | 是否使用二进制格式进行数据传输。设置为true时使用二进制格式,具有更高的传输效率;设置为false时使用文本(CSV)格式。 | 否 | true |
checkRecordBeforePut | 写入前是否对Record进行校验(包括类型检查、长度检查等)。开启后可以在客户端提前发现脏数据。 | 否 | true |
maxCellBufferSize | 单行数据的最大缓冲区大小,单位为字节。需要保证能放下一行数据,否则会写入失败。 | 否 | 10485760(10MB) |
STAGE模式特有参数
参数 | 描述 | 是否必选 | 默认值 |
stageTTL | Internal Stage的生命周期,单位为秒。Stage超过该时间后会被自动清理。 | 否 | 86400(1天) |
stageFileSizeLimit | 单个Stage文件大小上限,单位为字节。超过该限制后会自动创建新文件。 | 否 | 67108864(64MB) |
stageMaxBatchSize | Record写入Arrow批次的最大行数。每凑够该行数后写入一个Arrow RecordBatch。 | 否 | 8192 |
stageCompress | 是否启用Arrow LZ4压缩。启用后可显著减少Stage存储空间和网络传输量。需要Hologres >= 4.2.8,版本不满足时自动关闭。 | 否 | true |
高级参数
参数 | 描述 | 是否必选 | 默认值 |
useArrow | 是否使用Arrow列存写入链路。设置为true时,如果Hologres版本 >= 4.1.0,会自动启用STAGE写入模式。Hologres Writer支持接收任意上游Reader产出的Arrow格式数据(ArrowTabularRecord),也支持接收普通行式Record(自动转换为Arrow格式写入Stage)。详情请参见Arrow列存格式高性能同步。 | 否 | false |
default.enable | 是否为NOT NULL但未设置值的列自动填充默认值。 | 否 | true |
enableWriteBitTypeWithString | 是否允许以字符串形式写入BIT类型数据。 | 否 | false |
holoClient | Holo Client高级配置项(Map格式),可设置底层HoloConfig的任意参数。例如 | 否 | 无 |