DLF提供了元数据导出工具,可以帮您将DLF元数据导出到Hive Metastore元数据中。
前提条件
已有一个EMR集群,且Metastore服务配置的元数据库与导出的目标RDS库要一致。同步任务会使用EMR集群的Metastore服务,以Spark作业的方式运行在该EMR集群上实现导出。
所有元数据的location路径建议都在oss上,如果location的路径为hdfs,则库表location的hdfs namespace必须与EMR集群的hdfs namespace一致,否则导出会报错(即location为hdfs时,不支持跨集群元数据导出)。
请保证目标RDS库中已经存在元数据表,RDS元数据初始化参照配置自建RDS。
操作步骤
1. 准备配置文件
请参照如下示例,根据自己的环境准备一份yaml文件,yaml文件准备好之后,上传到自己的一个oss路径下。
!!com.aliyun.dlf.migrator.app.config.MigratorConfig
clientInfo:
accessKeyId: <替换为access key>
accessKeySecret: <替换为access key secret>
endPoint: dlf-vpc.cn-hangzhou.aliyuncs.com
regionId: cn-hangzhou
catalogId: <替换为catalogId,默认为阿里云账号uid>
mysql:
connectionUri: jdbc:mysql://emr-header-1:3306/hivemeta
driver: com.mysql.cj.jdbc.Driver
userName: root
password: xxxx
runOptions:
batchSize: 100
lowerCaseTableNames: false
schema: hivemeta
records: oss://xxxx/migrator/validate/log/
objectTypes:
- database
- table
- partition
- function
operations:
- validate
fixIfInConsistence: true
fixMode: to_hive
validateDatabases: [db1,db2]
excludeTables: [aa,bb]
excludeTablePrefixes: [xx,yy]
ignoreValidateCreateTime: true
skipFixTime: 1
ignoreDropOperation: false
配置项说明
DLF SDK Client 相关信息
参数名称 | 是否必填 | 描述 |
accessKeyId | 必填 | 用户阿里云账号的 Access Key Id。 |
asscessKeySecret | 必填 | 用户阿里云账号的 Access Key Secret。 |
endPoint | 必填 | DLF的EndPoint;一般为 dlf-vpc.[region-id].aliyuncs.com。 |
catalog | 必填 | DLF数据目录。 |
阿里云账号需要有读写 DLF 元数据所有库和表的权限,如ListDatabase、ListTables等(权限配置可以在DLF控制台->数据权限->数据授权进行操作)。
MySQL 元数据库相关信息
参数名称 | 是否必选 | 参数说明 |
connectionUrl | 必选 | 元数据库 JDBC 连接信息。 |
driver | 必选 | mysql driver,一般不需要改。 |
userName | 必选 | 数据库用户名。 |
password | 必选 | 数据库密码。 |
RunOptions 运行时参数
参数名称 | 是否必选 | 参数说明 |
schema | 必选 | hive元数据库的名称。 说明 MySQL connectionUrl中的库名要与schema保持一致,修改时要同时修改。 |
batchSize | 必选 | 批量调用 DLF SDK 的批次大小,最大不能超过 500,太大可能会超时,太小效率慢,一般 100 左右可以。 |
lownerCaseTableNames | 必选 | 客户的RDS元数据库里面的表是大写还是小写,目前需要客户自行判断。false表示RDS元数据表名为大写。 |
records | 必选 | 工具的运行结果日志存放路径,日志包含处理的记录和错误信息。 |
objectTypes | 必选 | 导出对象的类型列表,可以包含 database、function、table、partition。 |
operations | 必选 | 固定填validate。 |
fixIfInConsistence | 必选 | 固定填true。 |
fixMode | 必选 | to_hive,以DLF元数据为基准,对比hive元数据;to_dlf, 以hive元数据为基准,对比DLF元数据。 |
validateDatabases | 可选 | 指定对比的库名列表,则只会对比该列表下的库并进行补偿。 |
excludeTablePrefixes | 可选 | 对比是排除的表列表,则不会对比列表下的表。 |
excludeTables | 可选 | 对比时排除的表前缀列表,则不会对比列表下前缀开头的表。 |
compareTotalNumber | 可选 | 默认为false。是否输出DLF与RDS两边元数据数量的最终比对结果。 |
ignoreValidateCreateTime | 可选 | 对比两边元数据时,忽略对比create time。 |
skipFixTime(单位min) | 可选 | 只对比skipFixTime之前创建的元数据,skipFixTime之间之内创建的表则不会进行对比。默认值为4h。 |
ignoreDropOperation | 可选 | 如果不想删除目标元数据,则该选项设置为true。 |
locationMappings | 可选 | 对象 location 映射支持,应用于要修改替换database、table、partition 等对象 location 信息的场景。 |
source | 可选 | 表示要替换的路径(建议/结尾),示例如下:
|
target | 可选 | 表示目标路径,示例如下:
|
hiveConfPath | 可选 | 集群环境中hive配置文件地址,默认/etc/ecm/hive-conf/hive-site.xml。 |
kerberosInfo | 可选 | 如果任务运行在Kerberos集群,则需要runOptions下添加此配置:
|
2. 准备执行导出Spark任务
登录到EMR集群header节点。
获取导出工具的jar包。
wget https://dlf-lib.oss-cn-hangzhou.aliyuncs.com/migrator_jar/application-1.1.jar
编写Spark任务执行脚本。
vim /root/migrator_validate.sh
填写如下内容。
#!/bin/bash
source /etc/profile
spark-submit --master yarn --deploy-mode client --driver-memory 12G --executor-memory 8G --executor-cores 2 --num-executors 4 --conf spark.sql.shuffle.partitions=200 --conf spark.sql.adaptive.enabled=false --class com.aliyun.dlf.migrator.app.MigratorApplication application-1.1.jar oss://xxxx/migrator_config_validate.yml
最后的配置文件参数,即为上一步骤上传到oss的配置文件路径。
修改执行脚本权限。
chmod +x /root/migrator_validate.sh
3. 运行导出任务
手动运行:直接运行上述脚本。
定时运行:
crontab -e
0 22 * * * nohup sh /root/migrator_validate.sh > /root/validate.txt 2>&1 &
示例中配置的cron为每天晚上22:00执行。