Hive MetaStore同步方法

我们知道,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数据库中。

  1. 登录到需要元数据库所有的节点,执行如下命令:
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的文件。

  1. 将这个文件复制到您需要同步的目标Hive元数据库节点上
  2. 将所有的表信息同步到目标数据库中,执行如下命令:
 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

  1. 导出表信息
export table <tablename> to '<path>';

是需要导出的表的名字
是要导出的位置,默认使用hdfs的路径

  1. 复制所有的信息到目标集群
    将path下的数据复制到目标集群中,可以通过oss来做中转。
  2. 导入表信息
    将数据存放到目标集群的hdfs目录中,然后执行
import from '<path>';

是数据存放的位置,默认使用hdfs的路径

使用这个方式,不是很方便,首先需要一张一张表的来操作导出,不能直接批量。
然后它在export的时候会默认把数据也导出,这个会徒增我们的操作量,不推荐。

上一篇:linux系统设置时间同步


下一篇:Win10 OneDrive无法同步文件怎么办?一个命令搞定