作者:唐辉
1.文档编写目的
随着Hadoop 3.X 版本的发展,Hadoop 2.X 版本即将淘汰。我们当前面临着集群升级的问题,在升级过程中,即使使用迁移升级方式工作量非常大,但毫无疑问最稳妥的升级办法。在迁移的过程中,我们首先面对的就是本地的HDFS数据迁移和Hive 表数据迁移,本文主要讲述如何迁移HDP2.4.2 Hive 表和数据到CDP 7.1.1中。
- 测试环境
1.HDP 版本为2.4.2、Hadoop 版本为2.7.1 、Hive 版本为1.2.1、未启用Kerberos
2.CDP版本为7.1.1、Hadoop 版本为3.1.1、Hive 版本为3.1.3 、启用Kerberos
3.HDP和CDP 环境运行正常
2.操作步骤
2.1 导出原表结构
首先在HDP集群上进入Hive 客户端,执行show create table ods.ods_tghx_acczh,
查看并导出建表语句,导出的建表语句中删除LOCATION和TBLPROPERIES
代码语言:javascript复制hive -e "show create table ods.ods_tghx_acczh;" >> ods_tghx_acczh-tables.sql
2.2在目标集群创建表并查看
然后使用导出的建表语句在CDP集群中创建表,创建好后如下,注释行特殊字符乱请忽略,由于CDP环境中没有修改元数据库的注释的编码导致,之前的文档中有提到如何解决
2.3验证CDP 是否可以正常访问HDP集群HDFS
通常在同版本的Hadoop 集群下,如果两个集群都没有启用Kerberos、网络互通的情况下,我们是可以通过HDFS 的active NameNode端口直接访问到另外一个集群的元数据信息的。由于HDP和CDH一样,NameNode 的端口都为8020,我们先尝试验证是否可以直接访问8020端口和webhdfs 的50070端口。但是由于 CDP环境启用了Kerberos,所以需要添加参数ipc.client.fallback-to-simple-auth-allowed=true 来允许我们的安全认证的集群访问未启用Kerberos的集群,否则会出现The client is configured to only aloow connecting to secure cluster 异常
代码语言:javascript复制hdfs dfs -D ipc.client.fallback-to-simple-auth-allowed=true -ls webhdfs://tgdata01ts:8020/
代码语言:javascript复制hdfs dfs -ls webhdfs://tgdata01ts:50070/
hdfs dfs -D ipc.client.fallback-to-simple-auth-allowed=true -ls webhdfs://tgdata01ts:50070/
2.4确认HDP和CDP集群的Hive 内部表数据路径
登录 Ambari 管理节点,找到Hive > Config > 搜索hive.metastore.warehouse.dir,
确认原集群的Hive 内部表数据路径为 /app/hive/warehouse
登录CM界面,找到Hive > 配置 > 搜索hive.metastore.warehouse.dir,确认目标CDP7集群的Hive 内部表数据路径为 /warehouse/tablespace/managed/hive
2.5添加HDP集群的hosts 信息到CDP集群中
即使我们通过是通过ip 端口的方式来访问的HDP集群,仍然建议将原数据集群也就是HDP集群的ip 和hostname 信息添加到CDP集群的所有节点的/etc/hosts 中,否则在执行distcp 会出现主机名无法解析的问题
2.6使用HDFS distcp 命令进行数据拷贝
对于跨Hadoop 大版本的的distcp操作,Hadoop官网建议使用webhdfs 的方式来进行拷贝,对于相同版本hadoop集群的则建议我们通过hdfs 的协议来获得更好的性能。
确认表数据存放的路径后,在CDP集群中使用有权限的用户tgbd (该用户同样需要有原集群的表数据的读权限)进行kerberos 认证后执行distcp命令,同样需要添加参数-D ipc.client.fallback-to-simple-auth-allowed=true,将元数据的表目录下所有的文件和数据拷贝到目标CDP集群的内部hive 表目录下,-m 表示使用的Map 数量,本文不对distcp 做更详细的说明,详情以及distcp更多的命令见:
代码语言:javascript复制https://hadoop.apache.org/docs/stable/hadoop-distcp/DistCp.html
代码语言:javascript复制hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true -m 2 hdfs://tgdata01ts:50070/apps/hive/warehouse/ods.db/ods_tghx_acczh/* /warehouse/tablespace/managed/hive/ods.db/ods_tghx_acczh/
即使在测试的时候,使用8020 端口成功的完成了distcp 命令,但在跨hadoop 大版本的情况下仍建议使用webhdfs 来满足更好的兼容性
2.7修复CDP集群表中元数据信息
在distcp 命令完成后,查看文件大小,确认数据文件已拷贝到CDP集群中,但是我们在hive中却依旧无法查到,这时我们需要有权限的用户执行如下repair命令来完成元数据信息的更新。
代码语言:javascript复制msck repair table ods.ods_tghx_acckm;
MSCK REPAIR TABLE命令主要是用来解决通过hdfs dfs -put或者hdfs api写入hive分区表的数据在hive中无法被查询到的问题。
我们知道hive有个服务叫metastore,该服务主要是存储一些元数据信息,比如数据库名,表名或者表的分区等等信息。如果不是通过hive的insert等插入语句,分区信息在metastore中是没有的,通过distcp命令复制的数据显然分区信息没有在metastore上更新,所以需要运行MSCK REPAIR TABLE命令,hive就会去检测该表在HDFS上的文件,把没有写入metastore的分区信息写入metastore。
2.8 查询并验证Hive 表
代码语言:javascript复制select * from ods.ods_tghx_acczh order by ods_tghx_acczh.zhcpdm acs limit 10;
在impala 中查询验证
在Hive 中查询验证
3.文档总结
通过distcp 的方式来进行Hive 的表数据迁移,虽然相对来说较为麻烦,但是却拥有极好的兼容性,同样在CDH 5到CDP 中也可以使用这种方式。如果是都启用了Kerberos的集群配置互信后也同样可以使用这种方式进行迁移操作。