如何通过 hdfs 导入/导出 hbase 数据(hadoop 命令)

Posted

技术标签:

【中文标题】如何通过 hdfs 导入/导出 hbase 数据(hadoop 命令)【英文标题】:How to import/export hbase data via hdfs (hadoop commands) 【发布时间】:2014-09-18 09:35:53 【问题描述】:

我已经通过nutch将我爬取的数据保存在文件系统为hdfs的Hbase中。然后我通过命令将我的数据(一个 hbase 表)从 hdfs 直接复制到某个本地目录

hadoop fs -CopyToLocal /hbase/input ~/Documents/output

之后,我通过以下命令将该数据复制回另一个 hbase(其他系统)

hadoop fs -CopyFromLocal ~/Documents/input /hbase/mydata

它保存在 hdfs 中,当我在 hbase shell 中使用 list 命令时,它显示为另一个表,即“mydata”,但是当我运行 scan 命令时,它说没有名为“mydata”的表.

上述程序有什么问题? 简单来说:

    我想使用 hadoop 命令将 hbase 表复制到我的本地文件系统 然后,我想通过hadoop命令直接保存在另一个系统的hdfs中 最后,我希望表出现在 hbase 中,并将其数据显示为原始表

【问题讨论】:

【参考方案1】:

如果要从一个 hbase 集群中导出表并导入到另一个,请使用以下任一方法:

使用 Hadoop

导出

$ bin/hadoop jar <path/to/hbase-version.jar> export \
     <tablename> <outputdir> [<versions> [<starttime> [<endtime>]]

注意:将 hdfs 中的输出目录从源集群复制到目标集群

导入

$ bin/hadoop jar <path/to/hbase-version.jar> import <tablename> <inputdir>

注意:outputdir 和 inputdir 都在 hdfs 中。

使用 Hbase

导出

$ bin/hbase org.apache.hadoop.hbase.mapreduce.Export \
   <tablename> <outputdir> [<versions> [<starttime> [<endtime>]]]

将 hdfs 中的输出目录从源集群复制到目标集群

导入

$ bin/hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>

参考:Hbase tool to export and import

【讨论】:

我认为你没有仔细阅读我的问题。我说“我想通过使用 hadoop 命令将 hbase 表复制到我的本地文件系统”,您告知的信息, 复制hbase表到本地文件系统是什么意思?您始终可以对 hdfs 中与表相关的文件使用 hadoop 的 copyToLocal 命令,但这样做没有用。如果您打算将表复制到另一个集群,则必须使用上述任何一种方法。即使以上述方式,您也必须将导出的文件复制到本地文件系统并将其复制到另一个集群。 我想将抓取的数据备份到外部驱动器(USB 硬盘),以便在机器出现故障的情况下我可以重建我的集群。或者将来如果我必须采用新版本 og hadoop 等,那么我需要它 然后您可以导出并备份它。如果只是复制表相关的文件,是无法用它重建集群的。 @Nanda - bin/hadoop 选项是用旧版本的 Hadoop/Hbase 完成的吗?在现代 HBase(至少 0.96)中,没有一个主 jar,也没有名称为 hbase-version.jar 的 jar。而且提供的罐子似乎都想要一个类名作为第一个参数,而不仅仅是export【参考方案2】:

如果您可以使用 Hbase 命令代替备份 hbase 表,您可以使用 Hbase ExportSnapshot Tool,该工具使用 map reduce 作业将 hfile、日志和快照元数据复制到其他文件系统(本地/hdfs/s3)。

拍摄表格的快照

$ ./bin/hbase shell hbase> snapshot 'myTable', 'myTableSnapshot-122112'

导出到需要的文件系统

$ ./bin/hbase class org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to fs://path_to_your_directory

您可以将其从本地文件系统导出回 hdfs:///srv2:8082/hbase 并从 hbase shell 运行 restore 命令以从快照中恢复表。

 $ ./bin/hbase shell
 hbase> disable 'myTable'
 hbase> restore_snapshot 'myTableSnapshot-122112'

参考:Hbase Snapshots

【讨论】:

以上是关于如何通过 hdfs 导入/导出 hbase 数据(hadoop 命令)的主要内容,如果未能解决你的问题,请参考以下文章

hbase 导入导出hbase shell 基本命令。

HBASE 备份 - 用于导出/导入的 java api 如何工作?

HBase表的数据导出和导入

使用 talend 或 sqoop 将数据从 hbase 导入 hdfs

将 HBase 数据导出到 RDBMS

sqoop把hive表数据导入到mysql中