不同集群的 Hive 迁移方案
不同集群的 Hive 迁移方案
本文档描述了怎样把 Hive 数据库从一个 Hadoop 集群迁移到另一个 Hadoop 集群。
本文档假定新集群的 Hive 元数据库的内容可以清空。
1. 停止老集群 Hive 集群 的 hive-metastore 和 hive-server2
停止方法:使用命令systemctl stop hive-metastore
或者通过 ambari 操作。
systemctl stop hive-metastore
systemctl stop hive-server2
停止 hive metastore 后,集群所有的访问 hive 的任务都会报错。
2. 新集群 Hive 停止所有的 hive-metastore 和 hive-server2
systemctl stop hive-metastore
systemctl stop hive-server2
3. 备份 MySQL 数据库
mysqldump -h ${MYSQL_HOST} -uhive '-p${MYSQL_PASSWD}' hive > hive-metastore.bak
4. 恢复 MySQL数据库到新的地址
登录新的数据库
mysql -h ${NEW_MYSQL_HOST} -uhive '-p${MYSQL_PASSWD}' hive
如果目标数据库已经存在则先删除
drop database hive;
创建目标数据库
create database hive;
导入数据到新的数据库。
mysql -h ${NEW_MYSQL_HOST} -uhive '-p${MYSQL_PASSWD}' hive < hive-metastore.bak
${NEW_MYSQL_HOST} 是数据库新的地址。
5. 新 Hive 集群修改 MetaStore 服务器所在的 hive-site.xml
按需要修改以下配置,如果 MYSQL 数据库信息没有改变,则不需要修改。
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>${MYSQL_PASSWD}</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://${NEW_MYSQL_HOST}/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
6. 升级 MetaStore 到新集群的版本(选做)
如果新集群的 Hive 版本比老集群的 Hive 版本新,执行此步骤。如果一致,则跳过此步骤。新集群的 Hive 版本不得小于老集群的 Hive 版本。 在新集群 metastore 所在服务器,使用 hive 用户下执行以下操作, ${NEW_MYSQL_HOST}是新 mysql 数据库所在的服务器 IP 地址。 如下是把 hive 从 1.2 升级到 3.1。
cd /opt/bmr/hive/scripts/metastore/upgrade/mysql
mysql -uhive '-p${MYSQL_PASSWD}' -h ${NEW_MYSQL_HOST} hive
进入 MySQL 之后,执行以下 SQL 命令。
source upgrade-1.2.0-to-2.0.0.mysql.sql;
source upgrade-2.0.0-to-2.1.0.mysql.sql;
source upgrade-2.1.0-to-2.2.0.mysql.sql;
source upgrade-2.2.0-to-2.3.0.mysql.sql;
source upgrade-2.3.0-to-3.0.0.mysql.sql;
source upgrade-3.0.0-to-3.1.0.mysql.sql;
7. 复制老集群的数据到新集群
7.1 复制老集群管理表数据到新集群
此步骤要求所有管理表都在老集群参数hive.metastore.warehouse.dir
设置的目录下。
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/warehouse/tablespace/managed/hive</value>
</property>
执行命令:
hadoop fs -rm -r hdfs://${new-cluster}/${hive.metastore.warehouse.dir}
hadoop distcp hdfs://${old-cluster}/${hive.metastore.warehouse.dir} hdfs://${new-cluster}/${hive.metastore.warehouse.dir
注意:目标路径 hdfs://${new-cluster}/${hive.metastore.warehouse.dir} 必须不存在,否则会拷贝到它的子目录。
一般在新集群中执行 distcp 命令。如果在新集群执行 distcp 命令,需要在新集群设置老集群的配置, 并且所有新集群的服务器需要识别老集群的服务器,反之亦然。
如果不能用 hdfs 协议访问老集群,可以使用 hftp 或者 webhdfs 协议。
7.2 复制老集群外部表数据到新集群
此步骤要求所有管理表都在老集群参数hive.metastore.warehouse.external.dir
设置的目录下,或者统一的目录。
<property>
<name>hive.metastore.warehouse.external.dir</name>
<value>/warehouse/tablespace/external/hive</value>
</property>
执行命令:
hadoop fs -rm -r hdfs://${new-cluster}/${hive.metastore.warehouse.external.dir}
hadoop distcp hdfs://${old-cluster}/${hive.metastore.warehouse.external.dir} hdfs://${new-cluster}/${hive.metastore.warehouse.external.dir}
一般在新集群中执行 distcp 命令。如果在新集群执行 distcp 命令,需要在新集群设置老集群的配置, 并且所有新集群的服务器需要识别老集群的服务器,反之亦然。
如果不能用 hdfs 协议访问老集群,可以使用 hftp 或者 webhdfs 协议。
8. 修改元数据库数据的位置。
mysql -h 172.18.0.148 -uhive '-pxxx' hive
-- managed db location
update DBS SET DB_LOCATION_URI=replace(DB_LOCATION_URI, 'hdfs://${old-cluster}/${hive.metastore.warehouse.dir}','hdfs://${new-cluster}/${hive.metastore.warehouse.dir}');
-- external db location
update DBS SET DB_LOCATION_URI=replace(DB_LOCATION_URI, 'hdfs://${old-cluster}/${hive.metastore.warehouse.external.dir}', 'hdfs://${new-cluster}/${hive.metastore.warehouse.external.dir}' );
-- managed table and partition location
UPDATE SDS SET LOCATION = REPLACE(LOCATION, 'hdfs://${old-cluster}/${hive.metastore.warehouse.dir}','hdfs://${new-cluster}/${hive.metastore.warehouse.dir}');
-- external table partition location
update SDS SET LOCATION=replace(LOCATION, 'hdfs://${old-cluster}/${hive.metastore.warehouse.external.dir}', 'hdfs://${new-cluster}/${hive.metastore.warehouse.external.dir}');
9. 重启新集群的 metastore 和 hiveserver
进入新集群的 metastore 和 hiveserver 对应的服务器,以 root 身份执行以下命令。
systemctl start hive-metastore;
systemctl start hive-server2;
10. 进行测试
查询老集群的表,看数据是否正确。
迁移示例
老集群 hdfs 地址为:hdfs://master-9331fa9:8020,hive 版本为 hive 1.2.0,mysql 元数据库地址为 master-9331fa9 新集群 hdfs 地址为:hdfs://master-b882990:8020,hive 版本为 hive 3.1.0,mysql 元数据库地址为 master-b882990(IP:172.18.0.148)
在老集群创建相应的库和表
create database managed;
use managed;
create table t(c1 string) stored as textfile;
load data local inpath '/etc/profile' overwrite into table t;
create table tp(c1 string) partitioned by (pt string)stored as textfile;
load data local inpath '/etc/profile' overwrite into table tp partition(pt='profile');
create database e_db location '/warehouse/tablespace/external/hive/e_db.db';
use e_db;
create table e(c1 string) stored as textfile;
load data local inpath '/etc/hosts' overwrite into table e;
create table ep(c1 string) partitioned by (pt string)stored as textfile;
load data local inpath '/etc/hosts' overwrite into table ep partition(pt='hosts');
1. 停止老集群 hive 集群 的 hive-metastore 和 hive-server2
在老集群的 master-9331fa9 的 root 账号执行以下命令:
systemctl stop hive-metastore
systemctl stop hive-server2
2. 新集群 hive 停止所有的 hive-metastore 和 hive-server2
在老集群的 master-b882990 的 root 账号执行以下命令:
systemctl stop hive-metastore
systemctl stop hive-server2
3. 备份 mysql 数据库
mysqldump -h master-9331fa9 -uhive '-pxxx' hive > hive-metastore.bak
4. 恢复 mysql数据库到新的地址
登录新的数据库
mysql -h 172.18.0.148 -uhive '-pxxx' hive
目标数据库已经存在,先删除
drop database hive;
创建目标数据库
create database hive;
恢复 MYSQL:
mysql -h 172.18.0.148 -uhive '-pxxx' hive < hive-metastore.bak
5. 新集群修改 metastore 服务器所在的 hive-site.xml
新集群连接 MYSQL 数据库的地址没有改变,跳过此步。
6. 升级 metastore 到 新集群的版本
如下是把 hive 从 1.2 升级到 3.1。
cd /opt/bmr/hive/scripts/metastore/upgrade/mysql
mysql -h 172.18.0.148 -uhive '-pxxx' hive
进入 MYSQL 之后,执行以下 SQL 命令。
source upgrade-1.2.0-to-2.0.0.mysql.sql;
source upgrade-2.0.0-to-2.1.0.mysql.sql;
source upgrade-2.1.0-to-2.2.0.mysql.sql;
source upgrade-2.2.0-to-2.3.0.mysql.sql;
source upgrade-2.3.0-to-3.0.0.mysql.sql;
source upgrade-3.0.0-to-3.1.0.mysql.sql;
quit;
7. 复制老集群的数据到新集群
把老集群的 /etc/hosts 的内容负责到新集群所有服务器的 /etc/hosts 中。
7.1 复制老集群管理表数据到新集群
以 hive 账号执行以下命令
hadoop fs -rm -r hdfs://master-b882990/warehouse/tablespace/managed/hive
hadoop distcp hdfs://master-9331fa9:8020/apps/hive/warehouse hdfs://master-b882990:8020/warehouse/tablespace/managed/
7.2 复制老集群外部表数据到新集群
以 hive 账号执行以下命令:
hadoop fs -rm -r /warehouse/tablespace/external/hive
hadoop distcp hdfs://master-9331fa9:8020/warehouse/tablespace/external/hive hdfs://master-b882990:8020/warehouse/tablespace/external/hive
8. 修改元数据库数据的位置
mysql -h 172.18.0.148 -uhive '-pxxx' hive
进入 MYSQL 环境执行以下命令:
-- managed db location
update DBS SET DB_LOCATION_URI=replace(DB_LOCATION_URI, 'hdfs://master-9331fa9:8020/apps/hive/warehouse','hdfs://master-b882990:8020//warehouse/tablespace/managed/hive');
-- external db location
update DBS SET DB_LOCATION_URI=replace(DB_LOCATION_URI, 'hdfs://master-9331fa9:8020/warehouse/tablespace/external/hive','hdfs://master-b882990:8020/warehouse/tablespace/external/hive');
-- managed table and partition location
UPDATE SDS SET LOCATION = REPLACE(LOCATION, 'hdfs://master-9331fa9:8020/apps/hive/warehouse','hdfs://master-b882990:8020/warehouse/tablespace/managed/hive');
-- external table partition location
update SDS SET LOCATION=replace(LOCATION, 'hdfs://master-9331fa9:8020/warehouse/tablespace/external/hive','hdfs://master-b882990:8020/warehouse/tablespace/external/hive');
9. 重启新集群的 metastore 和 hiveserver
进入新集群的 metastore 和 hiveserver 对应的服务器,以 root 身份执行以下命令。
systemctl start hive-metastore;
systemctl start hive-server2;
10. 验证
验证正常。