我们知道,Hive在方便的用SQL方式管理Hadoop的数据的时候,使用了MetaStore来保存所有表的信息,例如表名,字段名,类型,分隔符,序列化的方式等等。当我们使用OSS作为我们的数据存储的时候,我们会创建很多的外表,例如
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
LOCATION 'OSS://bucket/path/dt/country'
当我们在处理这样的数据的时候,这些表是可以通用的,也就是说我可以更换集群,但是这些表都是一样的,不需要变更。
然而如果我们使用集群内部的数据库来保存这些元信息,那么如果我们新建了集群,就无法共享到这些数据,需要在另一个集群上重新执行一遍创建数据表的Hive语句,或者把所有的表信息都同步到新集群上,这里我们会介绍几个方法来完成这个任务。
A. Mysql dump
一般Hive都会使用Mysql来作为它的默认元数据库,我们可以通过Mysql的dump功能将整个Hive的库dump出来,并同步到另一个Mysql数据库中。
- 登录到需要元数据库所有的节点,执行如下命令:
mysqldump --databases <databaseName> --single-transaction > hive_databases.sql –p
这里的是指Hive的元数据库的名字,默认情况下是hivemeta
在执行以后需要您输入root账号的密码,如果您不是以root账号操作,请加上-u
指定操作的Mysql账号。如下:
mysqldump --databases <databaseName> --single-transaction > hive_databases.sql -u <user> –p
成功运行以后,会在当前目录下得到一个hive_databases.sql的文件。
- 将这个文件复制到您需要同步的目标Hive元数据库节点上
- 将所有的表信息同步到目标数据库中,执行如下命令:
mysql <databaseName> < hive_databases.sql
这里的是指Hive的元数据库的名字,默认情况下是hivemeta
这个是一个不错的方式,很方便。理论上其他类型的数据,只要有自己的导入导出的支持,也可以这样做。
B. Hive Import/Export
Hive从0.8.0开始支持Import和Export命令,可以将需要同步的表以及它的数据一同导出,然后导入到目标位置。
参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ImportExport
- 导出表信息
export table <tablename> to '<path>';
是需要导出的表的名字
是要导出的位置,默认使用hdfs的路径
- 复制所有的信息到目标集群
将path下的数据复制到目标集群中,可以通过oss来做中转。 - 导入表信息
将数据存放到目标集群的hdfs目录中,然后执行
import from '<path>';
是数据存放的位置,默认使用hdfs的路径
使用这个方式,不是很方便,首先需要一张一张表的来操作导出,不能直接批量。
然后它在export的时候会默认把数据也导出,这个会徒增我们的操作量,不推荐。