MySQL同步到MRS Hudi
支持的源端和目的端数据库版本
源端数据库 |
目的端数据库 |
---|---|
MySQL数据库(5.6、5.7、8.x版本) |
|
数据库账号权限要求
在使用Migration进行同步时,源端和目的端所使用的数据库账号需要满足以下权限要求,才能启动实时同步任务。不同类型的同步任务,需要的账号权限也不同,详细可参考表2进行赋权。
类型名称 |
权限要求 |
---|---|
源数据库连接账号 |
需要具备如下最小权限:SELECT、SHOW DATABASES、REPLICATION SLAVE、REPLICATION CLIENT,即执行SQL: GRANT SELECT, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '用户名'@'%'; |
目标数据库连接账号 |
MRS用户需要拥有Hadoop和Hive组件的读写权限,建议参照下图所示角色及用户组配置MRS用户。
图1 MRS Hudi最小化权限
具体MRS集群角色权限管理请参考《MRS集群用户权限模型》。 |
- 建议创建单独用于Migration任务连接的数据库账号,避免因为数据库账号密码修改,导致的任务连接失败。
- 连接源和目标数据库的账号密码修改后,请同步修改管理中心对应的连接信息,避免任务连接失败后自动重试,导致数据库账号被锁定影响使用。
支持的同步对象范围
在使用Migration进行同步时,不同类型的链路,支持的同步对象范围不同,详细情况可参考表3。
注意事项
除了数据源版本、连接账号权限及同步对象范围外,您还需要注意的事项请参见表4。
类型名称 |
使用和操作限制 |
---|---|
数据库限制 |
目标数据库中的库名、表名、字段名仅支持数字、字母和下划线,且字段名必须以字母或下划线开头,建议尽量使用常规字符避免任务失败。 |
使用限制 |
通用:
全量同步阶段:
增量同步阶段:
常见故障排查: 在任务创建、启动、全量同步、增量同步、结束等过程中,如有遇到问题,可先参考常见问题章节进行排查。 |
其他限制 |
支持目标数据库中的表比源数据库多列场景,但是需要避免以下场景可能导致的任务失败。 目标数据库多的列要求非空且没有默认值,源数据库insert数据,同步到目标数据库后多的列为null,不符合目标数据库要求。 |
操作步骤
本小节以RDS for MySQL到MRS Hudi的实时同步为示例,介绍如何配置Migration实时集成作业。配置作业前请务必阅读使用前自检概览, 确认已做好所有准备工作。
- 参见新建实时集成作业创建一个实时集成作业并进入作业配置界面。
- 选择数据连接类型:源端选MySQL,目的端选Hudi。
图2 选择数据连接类型
- 选择集成作业类型:同步类型默认为实时,同步场景包含整库和分库分表场景。
图3 选择集成作业类型
同步场景相关介绍请参见同步场景。
- 配置网络资源:选择已创建的MySQL、MRS Hudi数据连接和已配置好网络连接的资源组。
图4 选择数据连接及资源组
无可选数据连接时,可单击“新建”跳转至管理中心数据连接界面,单击“创建数据连接”创建数据连接,详情请参见配置DataArts Studio数据连接参数进行配置。
无可选资源组时,可单击“新建”跳转至购买资源组页面创建资源组配置,详情请参见购买创建数据集成资源组增量包进行配置。
- 检测网络连通性:数据连接和资源组配置完成后需要测试整个迁移任务的网络连通性,可通过以下方式进行数据源和资源组之间的连通性测试。
- 单击展开“源端配置”触发连通性测试,会对整个迁移任务的连通性做校验。
- 单击源端和目的端数据源和资源组中的“测试”按钮进行检测。
网络连通性检测异常可先参考数据源和资源组网络不通如何排查?章节进行排查。
- 配置源端参数。
各同步场景下选择需要同步库表的方式请参考表5。
表5 选择需要同步的库表 同步场景
配置方式
整库
选择需要迁移的MySQL库表。图5 选择库表
库与表均支持自定义选择,即可选择一库一表,也可选择多库多表。
分库分表
添加逻辑表。- 逻辑表名:即最终写入到Hudi的表名。
- 源库过滤条件:支持填入正则表达式,在所有MySQL实例中通过该正则表达式过滤出要写入目标端Hudi汇聚表的所有分库。
- 源表过滤条件:支持填入正则表达式,在过滤出的源端分库中再次过滤出要写入目标端Hudi汇聚表的所有分表。
图6 添加逻辑表
已添加的逻辑表支持预览表结构及来源库表,单击“操作”列的预览即可。预览逻辑表时,源表数量越多,等待时间可能越长,请耐心等待。
图7 逻辑表预览
- 配置目的端参数。
- 源库表和目标匹配策略。
各同步场景下源端库表和目标端库表的匹配策略请参考表6。
表6 源库表和目标匹配策略 同步场景
配置方式
整库
- 库匹配策略。
- 与来源库同名:数据将同步至与来源MySQL库名相同的Hudi库中。
- 自定义:数据将同步至自行指定的Hudi库中。
- 表匹配策略。
- 与来源表同名:数据将同步至与来源MySQL表名相同的Hudi表中。
- 自定义:数据将同步至自行指定的Hudi表中。
图8 整库场景下源库表和目标匹配策略
说明:自定义匹配策略时,支持用内置变量#{source_db_name}和#{source_table_name}标志来源MySQL的库名和表名,其中表匹配策略必须包含#{source_table_name}。
分库分表
- 目标端库名:数据将同步至指定的Hudi库中。
- 表匹配策略:默认与源端配置中填写的逻辑表同名。
图9 分库分表场景下源库表和目标匹配策略
- 库匹配策略。
- Hudi参数配置。
其余Hudi目的端参数说明请参考表7。
图10 Hudi目的端配置项
表7 Hudi目的端配置项 配置项
默认值
单位
配置说明
数据存储路径
-
-
Hudi自动建表时的warehouse路径,每张表会在warehouse路径下创建子目录。支持填写HDFS和OBS路径,路径格式参考:
- OBS路径:obs://bucket/warehouse
- HDFS路径:/tmp/warehouse
Hudi表属性全局配置
-
-
支持通过参数配置部分高级功能,参数详情可参考Hudi高级配置一览表。
表8 Hudi高级配置一览表 参数名
参数类型
默认值
单位
参数说明
index.type
string
BLOOM
-
Hudi表索引类型。
支持BLOOM和BUCKET索引,数据量较大场景下强烈建议使用BUCKET索引性能更好。
hoodie.bucket.index.num.buckets
int
256
个
Hudi表单分区下Bucket桶数。
说明:使用Hudi BUCKET表时需要设置Bucket桶数,桶数设置关系到表的性能,需要格外引起注意。
- 非分区表桶数 = MAX(单表数据量大小(G)/2G*2,再向上取整,4)
- 分区表桶数 = MAX(单分区数据量大小(G)/2G*2,再后向上取整,1)
其中,要注意的是:
- 需要使用的是表的总数据大小,而不是压缩以后的文件大小。
- 桶的设置以偶数最佳,非分区表最小桶数请设置4个,分区表最小桶数请设置1个。
changelog.enabled
boolean
false
-
Hudi changelog功能开关,开启后Migration作业可输出DELETE和UPDATE BEFORE数据。
logical.delete.enabled
boolean
true
-
逻辑删除开关,changelog开启时必须关闭逻辑删除。
hoodie.write.liststatus.optimized
boolean
true
-
写log文件时是否开启liststatus优化。涉及到大表和分区数据量多的作业,在启动时list会非常耗时,可能导致作业启动超时,建议关闭。
hoodie.index.liststatus.optimized
boolean
false
-
定位数据时是否开启liststatus优化。涉及到大表和分区数据量多的作业,在启动时list会非常耗时,可能导致作业启动超时,建议关闭。
compaction.async.enabled
boolean
true
-
异步compaction开关。compaction操作一定程度会影响实时任务的写入性能,如果用户使用外置的compaction操作对hudi进行compaction,可以考虑设置为false关闭实时处理集成作业的compaction操作。
compaction.schedule.enabled
boolean
true
-
生成compaction计划的开关。compaction计划必须由本服务生成,计划的执行可以交给Spark。
compaction.delta_commits
int
40
次
生成compaction request的频率。compaction request生成频率降低可以使得compaction频率降低从而提升作业性能。如果hudi增量数据较小。可以考虑增大该值。
说明:例如配置为40,即每40次commit生成一个compaction request,因为Migration每分钟生成1个commit,那么每个compaction request将间隔40分钟。
clean.async.enabled
boolean
true
-
做历史版本数据文件清理的开关。
clean.retain_commits
int
30
次
要保留的commit数。这些commit关联的数据文件版本将被保留 num_of_commits * time_between_commits 这么长的时间,建议配置为2倍的compaction.delta_commits。
说明:例如配置为80,因为Migration每分钟生成1个commit,那么超过80分钟后如果有旧版本数据文件 ,则会生成clean request,且在执行clean时保留最近80个commit。
hoodie.archive.automatic
boolean
true
-
Hudi commit文件老化开关。
archive.min_commits
int
40
次
将旧版commit归档到日志文件中时要保留不归档的最小commit数。
建议配置成clean.retain_commits + 1。
说明:例如配置成81,那么在触发归档动作时,将会保留最近81次commit文件。
archive.max_commits
int
50
次
触发归档动作的commit数。
建议配置成archive.min_commits + 20。
说明:例如配置成101,那么将在生成101个commit文件后触发归档commit文件动作。
- 为了达到Migration作业性能最优,建议使用Hudi Bucket索引的MOR表,并根据实际数据量配置Bucket桶数。
- 为了保证Migration作业的稳定性,建议将Hudi Compaction单独拆成Spark作业交由MRS执行,在Migration任务里仅开启生成compaction计划,具体可以参考如何配置Hudi Compaction的Spark周期任务?。
- 源库表和目标匹配策略。
- 刷新源表和目标表映射,检查映射关系是否正确,同时可根据需求修改表属性、添加附加字段,并通过“自动建表”能力在目的端Hudi数据库中建出相应的表。
图11 源表与目标表映射
- 同步主键
- 表属性编辑
单击操作列“表属性编辑”可配置Hudi表属性,包含表类型,分区类型及表自定义属性。
图12 Hudi单表表属性配置
- 表类型:MERGE_ON_READ、COPY_ON_WRITE。
- 分区类型:无分区、时间分区、自定义分区。
其中时间分区需要用户指定一个源端表名,选择一个时间转换格式。
比如时间分区用户指定一个源端表名src_col_1,选择一个时间转换格式,日(yyyyMMdd)、月(yyyyMM)、年(yyyy),自动建表时会在Hudi表默认创建一个cdc_partition_key的字段,系统会根据配置的时间转换格式将源端字段(src_col_1)的值格式化后写入cdc_partition_key中。
- 表自定义属性:支持通过参数配置单表的部分高级功能,参数详情可参考Hudi高级配置一览表。
- 附加字段编辑:单击操作列“附加字段编辑”可为迁移后的Hudi表中增加自定义字段,同时附加字段也会额外加入到Hudi表的建表中。用户可以在已有的源表字段基础上添加多个附加字段,并自定义字段名、选择字段类型、填写字段值。
- 字段名称:目的端Hudi表新增字段的名称。
- 字段类型:目的端Hudi表新增字段的类型。
- 字段值:目的端Hudi表新增字段的取值来源。
表9 附加字段取值方式 类型
示例
常量
任意字符
内置变量
- 源端host ip地址:source.host
- 源端schema名称:source.schema
- 源端table名称:source.table
- 目的端schema名称:target.schema
- 目的端table名称:target.table
字段变量
源表中的任一字段
udf方法
- substring(#col, pos[, len]): 截取源端col列的子串, 范围在[pos, pos+len)。
- date_format(#col, time_format[, src_tz, dst_tz]): 将源端col列按time_format格式化, 可选转换时区。
- now([tz]): 获取指定时区的当前时间。
- if(cond_exp, str1, str2): 满足条件表达式cond_exp时返回str1, 否则返回str2。
- concat(#col[, #str, ...]): 拼接多个参数, 可为源端列或字符串。
- from_unixtime(#col[, time_format]): 将unix时间戳按time_format格式化。
- unix_timestamp(#col[, precision, time_format]): 将时间转成unix时间戳, 可显式定义时间格式及转换后精度。
- 自动建表:单击“自动建表”可按照已配置映射规则在目的端数据库自动建表,成功后表建立方式会显示为使用已有表。
图13 自动建表
- Migration仅支持自动建表,不支持自动建库和模式,需用户自行在目的端手动建出库和模式后再使用本功能建表。
- 自动建表时对应的字段类型映射关系请参见字段映射关系章节。
- 自动建出的Hudi表会带有3个审计字段,分别是cdc_last_update_date、logical_is_deleted、_hoodie_event_time,并会以_hoodie_event_time作为Hudi表的预聚合键。
- 配置DDL消息处理规则。
实时集成作业除了能够同步对数据的增删改等DML操作外,也支持对部分表结构变化(DDL)进行同步。针对支持的DDL操作,用户可根据实际需求配置为正常处理/忽略/出错。
- 正常处理:Migration识别到源端库表出现该DDL动作时,作业自动同步到目的端执行该DDL操作。
- 忽略:Migration识别到源端库表出现该DDL动作时,作业忽略该DDL,不同步到目的端表中。
- 出错:Migration识别到源端库表出现该DDL动作时,作业抛出异常。
图14 DDL配置
- 配置任务属性。
表10 任务配置参数说明 参数
说明
默认值
执行内存
作业执行分配内存,跟随处理器核数变化而自动变化。
8GB
处理器核数
范围:2-32。
每增加1处理核数,则自动增加4G执行内存和1并发数。
2
并发数
作业执行支持并发数。该参数无需配置,跟随处理器核数变化而自动变化。
1
自动重试
作业失败时是否开启自动重试。
否
最大重试次数
“自动重试”为是时显示该参数。
1
重试间隔时间
“自动重试”为是时显示该参数。
120秒
是否写入脏数据
选择是否记录脏数据,默认不记录脏数据,当脏数据过多时,会影响同步任务的整体同步速度。
链路是否支持写入脏数据,以实际界面为准。
- 否:默认为否,不记录脏数据。
- 是:允许脏数据,即任务产生脏数据时不影响任务执行。
允许脏数据并设置其阈值时:
- 若产生的脏数据在阈值范围内,同步任务将忽略脏数据(即不会写入目标端),并正常执行。
- 若产生的脏数据超出阈值范围,同步任务将失败退出。
说明:
脏数据认定标准:脏数据是对业务没有意义,格式非法或者同步过程中出现问题的数据;单条数据写入目标数据源过程中发生了异常,则此条数据为脏数据。 因此只要是写入失败的数据均被归类于脏数据。
例如,源端是VARCHAR类型的数据写到INT类型的目标列中,则会因为转换不合理导致脏数据不会成功写入目的端。用户可以在同步任务配置时,配置同步过程中是否写入脏数据,配置脏数据条数(单个分片的最大错误记录数)保证任务运行,即当脏数据超过指定条数时,任务失败退出。
否
脏数据策略
“是否写入脏数据”为是时显示该参数,当前支持以下策略:
- 不归档:不对脏数据进行存储,仅记录到任务日志中。
- 归档到OBS:将脏数据存储到OBS中,并打印到任务日志中。
不归档
脏数据写入连接
“脏数据策略”选择归档到OBS时显示该参数。
脏数据要写入的连接,目前只支持写入到OBS连接。
-
脏数据目录
脏数据写入的OBS目录。
-
脏数据阈值
是否写入脏数据为是时显示该参数。
用户根据实际设置脏数据阈值。
说明:- 脏数据阈值仅针对每个并发生效。比如阈值为100,并发为3,则该作业可容忍的脏数据条数最多为300。
- 输入-1表示不限制脏数据条数
100
添加自定义属性
支持通过自定义属性修改部分作业参数及开启部分高级功能,详情可参见任务性能调优章节。
-
- 提交并运行任务。
作业配置完毕后,单击作业开发页面左上角“提交”,完成作业提交。
图15 提交作业
提交成功后,单击作业开发页面左上角“启动”按钮,在弹出的启动配置对话框按照实际情况配置同步位点参数,单击“确定”启动作业。
图16 启动配置
表11 启动配置参数 参数
说明
同步模式
- 增量同步:从指定时间位点开始同步增量数据。
- 全量+增量:先同步全量数据,随后实时同步增量数据。
时间
增量同步需要设置该参数,指示增量同步起始的时间位点。
说明:配置的位点时间早于Binlog日志最早时间点时,默认会以日志最新时间点开始消费。
- 监控作业。
通过单击作业开发页面导航栏的“前往监控”按钮,可前往作业监控页面查看运行情况、监控日志等信息,并配置对应的告警规则,详情请参见实时集成任务运维。
图17 前往监控
性能调优
若链路同步速度过慢,可参考参见任务性能调优章节章节中对应链路文档进行排查及处理。