导入导出Hive数据库
操作场景
在大数据应用场景中,企业可能需要将Hive中的数据库及数据库下的所有表迁移到另一个集群上,例如从测试环境迁移到生产环境、从旧集群迁移到新集群、或进行跨地域数据同步等。传统的迁移方式需要逐个导出和导入表,操作繁琐且容易出错。如何快速、完整地将整个数据库(包括表结构、表数据、权限信息等)迁移到目标集群?Hive提供数据库导入导出功能(Dump/Load命令),可以实现完整数据库的迁移,简化数据迁移操作,提高迁移效率。
本文介绍如何使用Hive的导入导出功能迁移数据库。
- Load命令:Hive提供的数据库导入命令,用于将Dump命令导出的数据库快照导入到目标集群的指定数据库中。Load命令会恢复数据库的完整结构,包括表定义、表数据、权限等。
- 复制策略(Replication Policy):Hive数据库导入导出功能使用的策略机制,用于标识数据库的复制关系。设置复制策略后,数据库可以被导出到目标集群,并支持增量复制。
- 跨集群互信:在Kerberos安全模式下,源集群和目标集群之间建立的信任关系,允许跨集群访问资源。跨集群导入导出Hive数据库时,需要配置跨集群互信。
约束与限制
- 本章节内容适用于MRS 3.2.0及之后版本。
- Hive数据库导入导出功能目前不支持对加密表、HBase外部表、Hudi表、视图表及物化视图表进行导入导出操作。
前提条件
- 如果是跨集群对Hive数据库进行导入导出,且目标集群和源集群都开启了Kerberos认证,需配置跨集群互信。
- 如果使用Dump/Load命令导入导出其他用户创建的数据库,需要授予用户对应数据库的权限:
- 集群未启用Ranger鉴权,需登录FusionInsight Manager授予该用户所属角色管理员权限,详细操作请参考创建Hive用户并绑定角色章节。
- 集群启用了Ranger鉴权,需参考添加Hive的Ranger访问权限策略章节授予用户对应数据库的Repl Dump/Load操作权限。
- 还需在源端集群和目标集群启用集群间拷贝功能。
- 需配置源端集群访问目标集群HDFS服务地址参数。
登录源端集群的FusionInsight Manager,选择“集群 > 服务 > Hive > 配置”,搜索“hdfs.site.customized.configs”,新增自定义参数“dfs.namenode.rpc-address.haclusterX”,值为“目标集群的NameNode实例主节点业务IP:RPC端口”;新增自定义参数“dfs.namenode.rpc-address.haclusterX1”,值为“目标集群的NameNode实例备节点的业务IP:RPC端口”,NameNode RPC端口默认为“25000”。保存配置后需滚动重启Hive服务。
操作步骤
- 以Hive客户端安装用户登录源端集群安装客户端的节点。
- 执行以下命令,切换到客户端安装目录,例如安装目录为“/opt/client”,请用户根据实际情况修改。
cd /opt/client - 执行以下命令配置环境变量。
source bigdata_env
- 如果集群开启了Kerberos认证,执行以下命令认证用户,否则跳过此步骤。
kinit Hive业务用户 - 执行以下命令登录Hive客户端。
beeline
- 执行以下命令创建数据库“dump_db”。
create database dump_db; - 执行以下命令切换到“dump_db”数据库。
use dump_db; - 执行以下命令在“dump_db”中创建表“test”。
create table test(id int);
- 执行以下命令向表“test”中插入数据。
insert into test values(123);
- 执行以下命令将数据库“dump_db”设置为复制策略的源。
alter database dump_db set dbproperties ('repl.source.for'='replpolicy1');
- 执行alter命令修改数据库属性时,用户需要对该数据库拥有对应权限。权限设置方式如下:
- 集群未启用Ranger鉴权,需登录FusionInsight Manager授予该用户所属角色管理员权限,详细操作请参考创建Hive用户并绑定角色章节。
- 集群启用了Ranger鉴权,需参考添加Hive的Ranger访问权限策略章节授予用户对应数据库的Repl Dump/Load操作权限。
- 删除设置了复制策略源的数据库时,需要先将该数据库的复制策略源设置为空,再对数据库执行删除操作,否则无法删除。将数据库复制策略源设置为空的命令如下:
alter database dump_db set dbproperties ('repl.source.for'='');
- 执行alter命令修改数据库属性时,用户需要对该数据库拥有对应权限。权限设置方式如下:
- 执行以下命令将“dump_db”导出到目标集群的“/user/hive/test”目录下。
repl dump dump_db with ('hive.repl.rootdir'='hdfs://haclusterX/user/hive/test');
- “haclusterX”为新增的自定义参数“dfs.namenode.rpc-address.haclusterX”中的“haclusterX”。
- 指定导出目录时需要确保当前用户对该目录拥有读写权限。
- 以Hive客户端安装用户登录目标集群安装客户端的节点,并执行2-5。
- 执行以下命令将“/user/hive/test”目录下的“dump_db”数据库的数据导入到“load_db”数据库中。
repl load load_db from '/user/hive/repl';
通过repl load导入数据库,指定数据库名称时需要注意以下情况:
- 指定的数据库不存在,在导入的过程中会创建对应的数据库。
- 指定的数据库已存在,且该数据库的“hive.repl.ckpt.key”属性值与导入的路径一致,则跳过导入操作。
- 指定的数据库已存在,但是该数据库下不存在任何表和functions,导入的过程中只将源数据库下的表导入到当前数据库中;如果该数据库下存在表或functions会导入失败。
验证操作:
导入完成后,可通过以下方式验证导入是否成功:
- 在目标集群的beeline中执行show databases;命令,确认目标数据库已创建。
- 执行use load_db;切换到目标数据库。
- 执行show tables;命令,确认表已导入。
- 执行select * from test;命令,确认数据已正确导入。
常见问题
- 导出命令执行失败
导出命令执行失败的常见原因包括:用户权限不足、导出目录不存在或无写入权限、数据库包含不支持的表类型(如加密表、Hudi表等)。
请确认用户具有Repl Dump权限。检查导出目录是否存在且有写入权限。确认导出的数据库不包含加密表、HBase外部表、Hudi表、视图表及物化视图表等不支持的表类型。
- 导入命令执行失败
导入命令执行失败的常见原因包括:目标数据库已存在且包含表或functions、跨集群互信未配置、HDFS路径不正确等。
如果目标数据库已存在且包含表或functions,请先清空数据库或指定新的数据库名称。确认跨集群互信已正确配置。检查HDFS路径是否正确且可访问。
- 如何删除设置了复制策略的数据库
设置了复制策略源的数据库无法直接删除,需要先清除复制策略源设置。
执行以下命令将数据库的复制策略源设置为空,然后再删除数据库:alter database dump_db set dbproperties ('repl.source.for'=''); drop database dump_db;
相关文档
- 了解Hive数据操作,请参考Hive客户端使用实践。
- 了解如何创建Hive用户并绑定角色,请参考创建Hive用户并绑定角色。
- 了解Hive常见问题,请参考Hive常见问题。